Edit online

I2C 配置

8 Jul 2024
Read time: 3 minute(s)
I2C 包括以下配置内容:
  1. 内核配置
    1. master 驱动使能
      Device Drivers
              I2C support--->
                      <*> I2C support
                      <*> I2C device interface
                          I2C Hardware Bus support--->
                              <*> ArtInChip I2C support
      
    2. slave 驱动使能
      Device Drivers
              I2C support--->
                      <*> I2C support
                      <*> I2C device interface
                          I2C Hardware Bus support--->
                              <*> ArtInChip I2C support
                              <*> ArtInChip I2C as slave mode
                      <*> I2C slave support
                      <*>     I2C eeprom slave driver
      
      注:

      在将 I2C 作为 slave 时,需要一个 backend 程序,作为 slave 的功能逻辑实现。此处选择内核自带的 eeprom,即 I2C 作为 slave 时,是当做一个 eeprom 的功能在使用。也可以根据实际情况自己实现相应的 backend 代码

    3. eeprom 驱动使能

      使用 I2C 接口与 eeprom 通信,是一种应用非常广泛的场景。此处介绍如何使能内核的 eeprom 驱动(需要先使能 I2C 的 master 驱动)。

      Device Drivers
              Misc devices--->
                      EEPROM support--->
                              <*> I2C EEPROMs/RAMs/ROMs from most vendors
      
  2. DTS 配置
    1. I2C 公共参数配置,以 I2C0 为例
      i2c0: i2c@19220000 {
              compatible = "artinchip,aic-i2c-v1.0";
              reg = <0x0 0x19220000 0x0 0x400>;
              interrupts-extended = <&plic0 84 IRQ_TYPE_LEVEL_HIGH>;
              clocks = <&cmu CLK_I2C0>;
              resets = <&rst RESET_I2C0>;
              #address-cells = <1>;
              #size-cells = <0>;
      };
    2. I2C master 配置
      &i2c0 {
              pinctrl-names = "default";
              pinctrl-0 = <&i2c0_pins_a>;
              status = "okay";
              eeprom@50 {
                      compatible = "atmel,24c64";
                      reg = <0x50>;
                      pagesize = <32>;
              };
      };
      注:

      该配置是将 eeprom 挂在 I2C0 总线上的配置,reg 属性表示 slave 设备的地址,pagesize 表示 eeprom 一页有 32byte。若在 I2C 总线上挂其它设备,对 DTS 进行相应修改即可。

    3. I2C slave 配置
      &i2c0 {
              pinctrl-names = "default";
              pinctrl-0 = <&i2c0_pins_a>;
              status = "okay";
              slave@54 {
                      compatible = "slave-24c02";
                      reg = <0x40000054>;
              };
      };

      内核的 I2C 子系统框架会通过查看 reg 属性的 bit30,判断 I2C 是工作在主机模式还是从机模式。若 bit30 为 1,则为从机模式。上述配置表示 I2C 工作在从机模式,设备地址为 0x54。

      若需要设置从机为 10bit 寻址,则需要设置 reg 属性的 bit31 为 1,如下图所示,配置从机地址为 0x139。
      &i2c0 {
              pinctrl-names = "default";
              pinctrl-0 = <&i2c0_pins_a>;
              status = "okay";
              slave@139 {
                      compatible = "slave-24c02";
                      reg = <0xC0000139>;
              };
      };