Skip to content

Commit 1fed9fd

Browse files
committed
board.cpp: Fixed internal I2C initialization exception.
Fixed the internal I2C initialization exception of CoreS3. Signed-off-by: lbuque <[email protected]>
1 parent f86e04d commit 1fed9fd

File tree

2 files changed

+43
-8
lines changed

2 files changed

+43
-8
lines changed

m5stack/board.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ extern "C" {
1111
// #include <driver/periph_ctrl.h>
1212
#include "esp_log.h"
1313

14-
void in_i2c_init(void)
14+
static void in_i2c_init(void)
1515
{
1616
gpio_num_t in_scl = (gpio_num_t)M5.getPin(m5::pin_name_t::in_i2c_scl);
1717
gpio_num_t in_sda = (gpio_num_t)M5.getPin(m5::pin_name_t::in_i2c_sda);
@@ -28,12 +28,7 @@ extern "C" {
2828
#endif
2929

3030
if (in_scl != 255 || in_sda != 255) {
31-
ESP_LOGW("BOARD", "I2C1 init");
32-
if (in_port == I2C_NUM_0) {
33-
// periph_module_enable(PERIPH_I2C0_MODULE);
34-
} else {
35-
// periph_module_enable(PERIPH_I2C1_MODULE);
36-
}
31+
ESP_LOGI("BOARD", "Internal I2C(%d) init", in_port);
3732
i2c_config_t conf;
3833
memset(&conf, 0, sizeof(i2c_config_t));
3934
conf.mode = I2C_MODE_MASTER;
@@ -53,7 +48,8 @@ extern "C" {
5348
auto cfg = M5.config();
5449
cfg.output_power = false;
5550
M5.begin(cfg);
56-
in_i2c_init();
51+
// in_i2c_init();
52+
// M5.In_I2C.release();
5753
}
5854

5955
void power_init()

m5stack/components/M5Unified/mpy_m5unified.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,44 @@ mp_obj_t m5_add_display(mp_obj_t i2c_bus_in, mp_obj_t addr_in, mp_obj_t dict) {
345345
return m5_getDisplay(mp_obj_new_int(M5.getDisplayCount() - 1));
346346
}
347347

348+
349+
static void in_i2c_init(void) {
350+
gpio_num_t in_scl = (gpio_num_t)M5.getPin(m5::pin_name_t::in_i2c_scl);
351+
gpio_num_t in_sda = (gpio_num_t)M5.getPin(m5::pin_name_t::in_i2c_sda);
352+
gpio_num_t ex_scl = (gpio_num_t)M5.getPin(m5::pin_name_t::ex_i2c_scl);
353+
gpio_num_t ex_sda = (gpio_num_t)M5.getPin(m5::pin_name_t::ex_i2c_sda);
354+
i2c_port_t ex_port = I2C_NUM_0;
355+
#if SOC_I2C_NUM == 1
356+
i2c_port_t in_port = I2C_NUM_0;
357+
#else
358+
i2c_port_t in_port = I2C_NUM_1;
359+
if (in_scl == ex_scl && in_sda == ex_sda) {
360+
in_port = ex_port;
361+
}
362+
#endif
363+
364+
if (in_scl != 255 || in_sda != 255) {
365+
ESP_LOGI("BOARD", "Internal I2C(%d) init", in_port);
366+
// if (in_port == I2C_NUM_0) {
367+
// periph_module_enable(PERIPH_I2C0_MODULE);
368+
// } else {
369+
// periph_module_enable(PERIPH_I2C1_MODULE);
370+
// }
371+
i2c_config_t conf;
372+
memset(&conf, 0, sizeof(i2c_config_t));
373+
conf.mode = I2C_MODE_MASTER;
374+
conf.sda_io_num = in_sda;
375+
conf.sda_pullup_en = GPIO_PULLUP_ENABLE;
376+
conf.scl_io_num = in_scl;
377+
conf.scl_pullup_en = GPIO_PULLUP_ENABLE;
378+
conf.master.clk_speed = 100000;
379+
// .clk_flags = 0, /*!< Optional, you can use I2C_SCLK_SRC_FLAG_* flags to choose i2c source clock here. */
380+
i2c_param_config(in_port, &conf);
381+
i2c_driver_install(in_port, I2C_MODE_MASTER, 0, 0, 0);
382+
}
383+
}
384+
385+
348386
// TODO: pass configuration parameters
349387
mp_obj_t m5_begin(size_t n_args, const mp_obj_t *args) {
350388
mp_obj_t config_obj = mp_const_none;
@@ -362,6 +400,7 @@ mp_obj_t m5_begin(size_t n_args, const mp_obj_t *args) {
362400

363401
// initial
364402
M5.begin(cfg);
403+
in_i2c_init();
365404
// if (M5.getBoard() != m5::board_t::board_M5StackCoreS3
366405
// && M5.getBoard() != m5::board_t::board_M5StackCoreS3SE
367406
// && M5.getBoard() != m5::board_t::board_M5StackCore2

0 commit comments

Comments
 (0)