G-Sensor
G-Sensor部分的说明
1、Air780Exx系列模组中,Air780EGP/Air780EGG两款中内置了加速度传感器G-Sensor,型号是苏州明皜相对基础的DA221,其I2C地址为0x27;
2、虽然G-Sensor理论上可以支持非常多的算法,比如计步、跌倒检测等,但是在Air780EGP/Air780EGG这两款模组中,我们仅支持振动检测,不支持其它算法;
-
关于振动检测,我们提供了扩展库exvib供大家使用;
3、你是不是会问,我要的是GNSS定位,为什么给我安排一个G-Sensor做振动检测呢?
- 主要原因两个,一个是静态漂移滤除,一个是低功耗控制算法;
- GNSS定位中的静态漂移是什么现象? 简单来说就是GNSS在静止时的定位会东飘西飘,无法固定在一个点,无法像运动状态时可以比较准确;
从地图上来看的话,会看到无数个漂移的点在实际位置飘来飘去,我们通常把这种现象叫做GNSS静态漂移;
GNSS静态漂移无法根除,原因是:
卫星信号相关因素:
GPS卫星在发射信号后传播过程中会遇到多种干扰因素,包括大气层电离层变化、云层遮挡等天气影响; 卫星信号受到干扰或遮挡会导致定位不准确,特别是在高楼林立的城市环境或山区、森林地带;
环境干扰因素:
周边高大建筑物的多径反射造成信号误差; 网络传输不稳定可能导致定位数据丢失,造成设备在地图上显示"飞跃"现象; - 那么,静态漂移有办法处理吗? 有,办法就是,滤除;
你静止时可以飘,我不记录你飘的数据,不在地图上显示不就行了吗?
那么,怎么判断静止状态呢?G-Sensor啊;
通过G-Sensor的加速度值,做相应的振动状态判断,进而将静态漂移滤除,这就是G-Sensor在GNSS定位系统中存在的意义;
- 除了静态漂移滤除,系统还可以在终端静止时关闭GNSS达到省电的目的,这也是G-Sensor在GNSS定位中一个常见的应用场景;
- 所以,这也是我们通常推荐Air780EGP/Air780EGG两款型号优先于Air780EGH的原因,很多客户系统中没有加入G-Sensor,导致静态偏移和功耗都没办法很好的控制;
4、Air780EGP和Air780EGG这两个型号,内置G-Sensor后,必然会暂用系统的资源,比如G-Sensor的供电控制,比如G-Sensor判断振动后的中断输入,比如I2C1的占用等;
对于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振动时的中断输入,外部不可再用 |

5、一般来说,虽然合宙4G模组以功耗控制的比较好而被认可,但是,G-Sensor在大多数的应用场景下都是要一直开启的,这在一定程度上会增加一些功耗,尤其是在低功耗模式下,这是正常现象,请大家注意;
G-Sensor搭配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通信异常时,请把这几路外设的供电全部打开进行尝试,然后再根据前面的描述去排查原因;