I2C总线

I2C部分说明
1、上图仅标注了一处I2C1总线的管脚PIN66/67和PIN80/81,但可以复用为I2C功能的管脚有多处;
虽然可以复用为I2C功能的管脚有多处,但Air8000系列模组最多只有两路I2C总线:I2C0和I2C1;

2、需要指出的是,所有内置G-Sensor的Air8000型号来说,Air8000A/AB/U/N/D/B六个型号,I2C0只能复用在PIN80/81管脚,且PIN80/81也只能用作I2C0,不可以复用为GPIO;
Air8000A/AB/U/N/D/B的PIN80/81已在内部复用为了I2C0,这意味着Air8000A/AB/U/N/D/B的PIN80/81只能在外部被用作I2C0,不能再被复用为GPIO18/19、I2C1或PWM0/1,且外部当作I2C0使用时设备地址不可为0x27(内部G-Sensor的设备地址为0x27);

3、I2C总线可能经常需要忽略的一点是上拉,需要明确的是: Air8000系列I2C总线需要外部上拉,不要使用内部上拉;
以Camera电路为例:
4、I2C总线上拉电源,需保持与外设供电电源一致,如上图所示的Camera电路中,I2C上拉电源选择的是与Camera供电电源一致的CAM_VDD;
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通信不正常;

第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通信异常时,请把这几路外设的供电全部打开进行尝试,然后再根据前面的描述去排查原因;