×

ESP32------关于硬件I2C的使用

zxjy辉 zxjy辉 发表于2023-07-18 11:09:27 浏览1473 评论0

抢沙发发表评论

唯美梦幻的冬日雪景.jpg

esp32 自带两个I2C控制器,可以很方便的使用I2C协议通信,但是也是存在的坑的


  1. 大致操作流程

    1. 利用 i2c_config_t 类型的结构体来设定一个I2C 参数,用于初始化一个I2C


    2. 将这个参数分配给某一个I2C

    3. 为这个I2C安装驱动:就是分配资源的一个过程

    4. //参考代码
      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);
      
      }


  2. 读写


    1.    写:i2c_master_write_to_device(I2C_NUM_0, OLED_ADDRESS, write_buf, sizeof(write_buf),1000 / portTICK_PERIOD_MS);

    2.    读:i2c_master_read_to_device

    3. 坑:需要写的时候,如果调用的是a 中的写,这个地址实际在实际是左移了一位,也就是说从机接收的地址是 经过左移的

      例如说 I2C 从机地址是:0x3c,主机发送的该地址,从机接收到的数据是:0x78,这个可以从i2c_master_write_to_device()这个方法中看出

      图片.png

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

#好好学习!

群贤毕至

访客