
esp32 自带两个I2C控制器,可以很方便的使用I2C协议通信,但是也是存在的坑的
大致操作流程
利用 i2c_config_t 类型的结构体来设定一个I2C 参数,用于初始化一个I2C
将这个参数分配给某一个I2C
为这个I2C安装驱动:就是分配资源的一个过程
//参考代码 void I2C_Init( void ) { i2c_config_t my_i2c={ .mode = I2C_MODE_MASTER, //设置主机模式 .sda_io_num = I2C0_SDA, //设置I2C的SDA 引脚 .sda_pullup_en = GPIO_PULLUP_ENABLE, //上拉SDA 引脚 .scl_io_num = I2C0_SCL, //设置I2C的SCL 引脚 .scl_pullup_en = GPIO_PULLUP_ENABLE, //上拉SCL 引脚 .master.clk_speed = 100000, //设置时钟频率是1us , 主机模式下最大频率不能超过4MHz .clk_flags = 0, //可以选择时钟源,设置为0 ,时钟分配器自动选择一个满足频率和能力要求的时钟源 }; i2c_param_config(I2C_NUM_0,&my_i2c); //初始化I2C0 //安装I2C驱动:主机模式下,从机的接收和发送缓冲区参数设置为disable i2c_driver_install(I2C_NUM_0,I2C_MODE_MASTER,0,0,0); }读写
写:i2c_master_write_to_device(I2C_NUM_0, OLED_ADDRESS, write_buf, sizeof(write_buf),1000 / portTICK_PERIOD_MS);
读:i2c_master_read_to_device
坑:需要写的时候,如果调用的是a 中的写,这个地址实际在实际是左移了一位,也就是说从机接收的地址是 经过左移的
例如说 I2C 从机地址是:0x3c,主机发送的该地址,从机接收到的数据是:0x78,这个可以从i2c_master_write_to_device()这个方法中看出

Ps:所以在编写软件I2C的时候,需要注意传递低地址需要左移,(我原本以为这个左移,我需要先右移一下,以此来抵消这个左移,结果,在传入右移之后的地址,反而初始化失败!!!)
#好好学习!