跳转至

I2C总线

I2C部分说明

1、上图仅标注了一处I2C1总线的管脚PIN66/67,但可以复用为I2C功能的管脚有多处;

虽然可以复用为I2C功能的管脚有多处,但Air780Exx系列模组最多只有两路I2C总线:I2C0和I2C1;

2、I2C总线可能经常需要忽略的一点是上拉,需要明确的是:

Air780Exx系列I2C总线需要外部上拉,不要使用内部上拉;

以Camera电路为例:

3、I2C总线上拉电源,需保持与外设供电电源一致,如上图所示的Camera电路中,I2C上拉电源选择的是与Camera供电电源一致的CAM_VDD;

4、在Air780Exx系列模组中,Air780EHV内置的Audio Codec使用了1路I2C,Air780EGP/EGG内置的G-Sensor使用了1路I2C;

  • Air780EGP/Air780EGG;

由上图可以看出,Air780EGP/Air780EGG的PIN66/67已在内部复用为了I2C1,这意味着Air780EGP/Air780EGG的PIN66/67只能在外部被用作I2C1,不能再被复用为GPIO18/19、I2C0或PWM0/1,且外部当作I2C1使用时设备地址不可为0x27(内部G-Sensor的设备地址为0x27);

除此之外,还需要特别注意一点:

对于Air780EGP和Air780EGG这两个型号,I2C1内部挂载了G-Sensor,如果还需要在模组外部挂载其它外设时,比如摄像头,此时务必要保持GPIO23为默认的输出高状态,不可将GPIO23改为输出低的状态,否则会影响该I2C1总线的正常初始化;

以下是Air780EGP/Air780EGG两款模组中内部占用的信号管脚,以及对应的详细说明;

管脚 信号 Air780EGH Air780EGPAir780EGG
PIN107 GPIO21 内部用于主控芯片打开和关闭GNSS芯片
PIN28/29 UART2 内部用于主控芯片与GNSS芯片通信用
PIN99 GPIO23(Vref) Air780EGH内部用于GNSS芯片的后备供电,以便星历保持,在需要时热启动Air780EGP/Air780EGG除给GNSS芯片后备供电外,还给G-Sensor供电
PIN66/67 I2C1 未被占用 Air780EGH内部没有占用,可作为I2C1供外部自由使用,也可复用为其它功能Air780EGP/EGG内部将此管脚作为I2C1挂载了G-Sensor,因此外部只可作为I2C1使用,且不能与内部G-Sensor的I2C地址0x27冲突,且外部使用I2C1时需保持GPIO23为默认输出高的状态,不可将GPIO23改为输出低的状态,否则会影响该I2C1总线的正常初始化;
PIN79 WAKEUP2(USIM_DET) 未被占用 Air780EGH与Air780EPM/EHV等一样,供外部用作SIM卡热插拔检测Air780EGP/EGG内部将此管脚用作了G-Sensor振动时的中断输入,外部不可再用
  • Air780EHV;

a. 由上图可以看出,Air780EHV的PIN57/58已在内部复用为了I2C0,且该I2C0固定给内部的Audio Codec ES8311使用,也不再对外开放挂载其它的I2C外设;

b. 这同时也意味着,Air780EHV只有一路I2C1可以使用,大家可以根据自己项目的需要灵活选择是映射到PIN66/67、PIN80/81还是PIN83/85;

5、除常见的Camera和G-Sensor外,I2C接口的SHT3x系列温湿度传感器也是一个经典的应用,合宙全系模组,包括Air780Exx系列模组,都可以支持;

Sensirion(瑞士盛思锐)SHT3x-DIS.pdf

6、在使用I2C功能之前,都需要先使用LuatIO工具生成pins配置json文件,也就是对IO的初始化功能配置;

关于LuatIO功能的介绍,详见:LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心

7、与I2C相关的LuatOS核心库和扩展库举例;

  • I2C核心库

https://docs.openluat.com/osapi/core/i2c/

  • TP触摸屏核心库

https://docs.openluat.com/osapi/core/tp/

  • U8G2图形核心库

https://docs.openluat.com/osapi/core/u8g2/

  • Camera核心库

https://docs.openluat.com/osapi/core/camera/

  • exvib扩展库

https://docs.openluat.com/osapi/ext/exvib/

I2C在实际使用中可能遇到的问题

一,背景说明;

a. 合宙4G模组,包括Air780Exx系列、Air8000系列、Air700Exx系列,大部分型号都可以支持2路I2C,一路为I2C0,一路为I2C1;

b. I2C0和I2C1,分别会复用在不同的多处管脚,但只要一处复用为I2C0,其它地方便不可再复用为I2C0,I2C1也一样;

c. 部分型号,比如内置Audio Codec ES8311的Air780EHV,内置G-Sensor的Air8000A/D/AB/DB/U/N和Air780EGP/EGG,在模组内部都占用了一路I2C,这就意味着,该路I2C总线在模组内部已有上拉电阻;

d. Air780Exx系列模组I2C信号管脚及复用信息如下;

e. Air700Exx系列模组I2C信号管脚及复用信息如下;

f. Air8000系列模组I2C信号管脚及复用信息如下;

二,常见的坑;

a. 两路I2C,如果每路I2C只挂载一个外设,在实际应用中都没有发现什么问题,注意做好I2C_SCL和I2C_SDA两个信号的上拉即可;

b. 大家开发的很多产品中,由于IO有限,导致不得不在很多情况下都要一路I2C挂载多个外设;

当一路I2C挂载多个外设时,又分为四种情况,分别以Air780EHM、Air780EHV、Air780EGG和Air8000A为例进行说明;

第一种情况;

模组内部没有占用I2C,即没有挂载G-Sensor或Audio Codec ES8311,以Air780EHM为例;

假设使用PIN56/57复用为I2C0,只挂载一个LCD触摸屏外设,没有问题;

使用PIN66/67复用为I2C1,同时挂载G-Sensor、Audio Codec ES8311和摄像头三个外设,需要特别注意如下几点,否则会出现I2C1通信不正常的问题;

第1

如果三个外设分别由三个独立LDO供电,且每个外设的I2C1_SCL和I2C1_SDA都独立上拉到了各自的电源,这个时候:

当要打开其中一个外设时,另外两个外设的电源也必须要打开,否则会造成I2C通信不正常;

原因是,给每个外设供电的LDO,以LP5907MFX为例,其在关闭时,LDO电源输出管脚会有下拉电阻到地,进而造成I2C电平拉低,比如Air780EHM电平设置为3.3V时,会被拉低到2.2V甚至2V以下,造成I2C通信不正常;

LP5907MFX.pdf

第2

如果三个外设分别由三个独立LDO供电,但I2C1_SCL和I2C1_SDA都只拉到了其中一个外设的电源,这个时候:

当要打开其中一个外设时,必须要保证"I2C1上拉的电源是打开的"和"Audio Codec ES8311的电源是打开的",否则会造成I2C通信不正常;

"I2C1上拉的电源是打开的"非常好理解,不再赘述;

"Audio Codec ES8311的电源是打开的"的原因是,ES8311在没有供电时,其SCL和SDA管脚为芯片内部下拉,也会造成I2C电平被拉低到2.2V甚至2V以下,进而造成I2C通信不正常;

第3

如果三个外设分别由三个独立LDO供电,但I2C1_SCL和I2C1_SDA都只拉到了模组自带的VDD_EXT或Vref,这个时候:

当要打开其中一个外设时,不需要做其它动作,只需确保给外设的供电正常即可;

不同的是,在低功耗模式 pm.WORK_MODE,1 下,Audio Codec ES8311由于在未供电的情况下I2C管脚芯片内部下拉会造成功耗浪费,Vref一直消耗,VDD_EXT由于间歇性输出所以功耗浪费相对Vref较小;

说明!关于VDD_EXT和Vref的描述,详见硬件管脚详细说明文档中的相应章节;

结论

以上三种情况各有优劣势,大家根据自己产品的需要灵活选择即可;

相对而言,我们认为第2种情形更好一些,比如:

I2C1同时挂载G-Sensor、摄像头和ES8311,I2C1只上拉到给ES8311供电的电源上,当打开摄像头或G-Sensor时,确保给"ES8311供电的电源是打开的"可以给I2C1提供上拉且"保证ES8311在供电"即可;

或者,I2C1同时挂载G-Sensor、摄像头和ES8311,I2C1只上拉到给摄像头供电的电源上,当打开ES8311或G-Sensor时,这时不但要确保给"摄像头供电的电源是打开的"可以给I2C1提供上拉,也需要保证"打开ES8311供电",这种方式就不推荐了;

或者,如果I2C1同时挂载G-Sensor、摄像头和ES8311,I2C1只上拉到给G-Sensor供电的电源上,当打开摄像头或ES8311时,这时不但要确保给"G-Sensor供电的电源是打开的"可以给I2C1提供上拉,也需要保证"打开ES8311供电",这种方式就不推荐了;

第二种情况:

模组内部占用了一路I2C0挂载Audio Codec ES8311,同时将I2C0上拉到了给ES8311供电的LDO上,以Air780EHV为例:

(说明!虽然该路I2C0被内部使用,但同时也引出到了模组管脚PIN56/57,可用作挂载外部外设;)

假设使用PIN66/67复用为I2C1,只挂载一个LCD触摸屏外设,没有问题;

使用PIN56/57复用为I2C0,在模组内部挂载ES8311的情况下,外部再同时挂载G-Sensor和摄像头两个外设,也同样需要注意跟第一种情况相同的第1、第2和第3点,不同点只是Audio Codec ES8311挂载到了内部;

第三种情况:

模组内部占用了一路I2C1挂载G-Sensor,同时将I2C1上拉到了给G-Sensor供电的LDO上,以Air780EGG为例:

(说明!Air780EGG内部使用的是GPIO18/19复用的I2C1,且引到了模组管脚PIN66/67可供外部外设使用;)

假设使用PIN56/57复用为I2C0,只挂载一个LCD触摸屏外设,没有问题;

使用PIN66/67复用为I2C1,在模组内部挂载G-Sensor的情况下,外部再同时挂载ES8311和摄像头两个外设,也同样需要注意跟第一种情况相同的第1、第2和第3点,不同点只是G-Sensor挂载到了内部;

第四种情况:

模组内部占用了一路I2C0挂载G-Sensor,同时将I2C0上拉到了给G-Sensor供电的LDO上,以Air8000A为例:

(说明!Air8000A内部使用的是GPIO18/19复用的I2C0,且引到了模组管脚PIN80/81可供外部外设使用;)

假设使用PIN80/81复用为I2C0,在模组内部挂载G-Sensor的情况下,外部再同时挂载ES8311、触摸屏和摄像头三个外设,也同样需要注意跟第一种情况相同的第1、第2和第3点,不同点只是G-Sensor挂载到了内部;

c. 核心"槽点",记住两点:

  • LDO在关闭的情况下,其输出内部下拉到地,如果I2C在其它地方上拉供电的前提下也接到了这里,会影响I2C电平,进而影响I2C通信;

  • Audio Codec ES8311由于芯片设计原因,其在未供电的情况下I2C两个管脚内部下拉到地,如果I2C在其它地方上拉供电的前提下也接到了这里,会影响I2C电平,进而影响I2C通信;

  • 不知道怎么做的情况下,当一路I2C挂载多路外设时,如果遇到I2C通信异常时,请把这几路外设的供电全部打开进行尝试,然后再根据前面的描述去排查原因;

三,对开发板的影响;

a. 这里说的开发板,主要是指合宙4G模组开发板,包括Air780Exx、Air700Exx、Air8000系列;

b. 由于管脚有限,开发板在设计时都是一路I2C挂载了多个外设,且几乎每个外设都加了独立上拉,因此:

如果遇到I2C通信异常时,请把这几路外设的供电全部打开进行尝试,然后再根据前面的描述去排查原因;