[分享] 基于STM8S-DISCOVERY的X-NUCLEO-IKS01A3传感器驱动移植

sylar^z   2019-7-30 17:40 楼主

  本次移植X-NUCLEO-IKS01A3传感器驱动是基于STM8S-DISCOVERY开发板的,使用了官方的en.x-cube-mems1.zip资源包。传感器功能通过编译选项逐个开启,开启标志位于iks01a3_conf.h文件中。为了便于查看数据,接入了OLED显示屏,用来显示采集到的传感器数据。

       本次在STM8S-DISCOVERY上移植驱动采用模拟I2C用于通讯。模拟I2C使用了PC6作为SDAPC7作为SCL。这两个引脚与一组电源和地相邻,便于接线。


STM8S-DISCOVERY接线引脚说明.JPG

在调试过程中,LSM6DSOLIS2DW12LIS2MDLHTS221LPS22HH五个传感器都比较顺利的调通,得到了传感器数据。而STTS751传感器移植无法通讯,在主芯片发送地址信息后,始终都是NACK

  之前查看了STTS751的手册, STTS751使用的SMBus协议。SMBus协议是IntelDuracell共同制订笔记本电脑所用的智能型电池时所研发的接口,参考自I2C,与I2C有交集的部分,也有部分区别,在一般情况下,可以使用I2C协议的接口来进行通讯。区别说明参看2楼。

       1. 首先怀疑的是时序问题,通过逻辑分析仪分析发现当前的频率大于160K了,超过了SMBus10K-100K的范围。调整了一下延时,频率调整到90K左右,还是无法通讯。

       2. 对比模拟I2C与硬件I2C,发现模拟I2C的时序不是准确频率的时序,会时快时慢。由于STM8S-DISCOVERY频率较低。所以将模拟IIC移植到之前已调试过的NUCLEO-L011K4上,同样无法通讯。使用systick定时产生中断,模拟10KI2C信号进行对比(同时测试了模拟引脚片上上拉和不上拉)。两者时序基本相同,仍然无法通讯。时序对比图如下:

 

系统I2C与模拟I2C(相同引脚)与STTS751通讯差异-添加说明.png

        3. 然后考虑是否是I2C信号通过ST2378E后电平信号不能完全满足SMBus协议。就直接将模拟I2C连接到I2C1JP7/JP8I2C_SDA/I2C_SCL)上,通讯成功,可以采集数据了。

说明:红色效方块是JP7/JP8的跳线帽;长方形小方框是I2C及电源地的接口;

X2.png

  这一点非常奇怪,上面2中的对比试验,所有接线都是相同的,都在同样的两个引脚输出。唯一的区别就是一个使用硬件I2C,一个使用模拟I2C。硬件I2C可以通讯,而模拟I2C不行。

    接下去上图:

           驱动HTS221,采集数据。

1.png

    驱动LPS22HH,采集数据。

 

2.png

    驱动STTS751,采集数据。

 

3.png

    驱动LSM6DSO,采集数据。

4.png

    驱动LIS2DW12,采集数据。

 

5.png

    驱动LIS2MDL,采集数据。

 

6.png

 

源码: 

STM8S105C6-Board-iarv3104-OLED-IKS01A3(fin-v1.0).rar (10.88 MB)
(下载次数: 66, 2019-7-30 17:42 上传)

 

本帖最后由 sylar^z 于 2019-7-30 17:43 编辑

回复评论 (5)

I2CSMBus之间的差异 

 

电气特性差异:

1. 逻辑电平定义

       I2CHi/Lo逻辑电平有两种认定法:相对认定与绝对认定,相对认定是依据Vdd的电压来决定,Hi0.7VddLo0.3Vdd,绝对认定则与TTL 准位认定相同,直接指定Hi/Li电压,Hi3.0VLo1.5V。相对的SMBus只有绝对认定,且电平与I2C有异,Hi2.1VLo0.8V,与I2C不全然吻合但也算部分交集。

       SMBus后来增订一套更低电压的电平认定,Hi1.4VLo0.6V,这是为了让运用SMBus的装置能更省成本的作法。

 

2. 限流

       由于SMBus一开始就是运用在笔记本电脑内,所以省电的表现优于I2C,只需100uA就能维持工作,I2C却要到3mA同样的低用电特性也反应在漏电流(Leakage Current)的要求上,I2C最大的漏电流为10uASMBus1uA,但是1uA似乎过度严苛,使运用SMBus的装置在验证测试时耗费过多的成本与心力,因此之后的SMBus 1.1版放宽了漏电流上限,最高可至5uA

 

3. 其他相关限制

       I2C有线路电容的限制,SMBus却没有,但也有相类似的配套规范,即是电平下拉时的电流限制,当SMBus的集电极开路Pin导通而使线路接地时,流经接地的电流不能高于350uA,另上电流(即相同的集电极开路Pin开路时)也一样有规范,最小不低于100uA,最高也是不破350uA的。

 

时序差别

1. 运作频率

       I2C此方面相当宽裕,最低频可至0Hz(直流状态,等于时间暂停),高可至100kHzStandard Mode)、400kHzFast Mode)、乃至3.4MHzHigh Speed Mode),相对的SMBus就很局限,最慢不慢于10kHz,最快不快于100kHz。很明显的,I2CSMBus的交集运作频率即是10kHz100kHz间。

 

2. 数据保持时间(Data Hold Time

       SMBus在数据传输后还有数据保持时间的要求,SMBus 规定SMBCLK线路的电平下降后,SMBDAT上的数据必须持续保留300nS,但I2C 却没有对此有相同的强制要求。

 

3. 恢复时间

       SMBus对接口被重置(Reset)后的恢复时间(Timeout)也有要求,一般而言是35mSI2C这方面亦无约束,可以任意延长时间。相同的SMBus也要求无论是在主控端(Master)或受控端(Slave),其频率处于Lo电平时的最长持续时间不得超越限制,以免因为长时间处在Lo准位,而致收发两端时序脱轨(失去同步,造成后续误动作)。

 

4. [已妥][未妥]机制的强制性差别

       I2C并没有强制规定接收端非要做出响应,而SMBus上是不允许接收端在接收地址信息后却不发出回应,每次都要回应。

点赞  2019-7-30 17:42

学习了,谢谢分享!

点赞  2019-7-30 18:48

在SMBus基础上又发展出一个PMBus.

点赞  2019-7-30 19:29
引用: yang_alex 发表于 2019-7-30 19:29 在SMBus基础上又发展出一个PMBus.

度了一个,PMBus是数字电源管理协议。PMBus用了指令的通讯形式,总线更像一个载体。

点赞  2019-8-2 08:26
引用: sylar^z 发表于 2019-8-2 08:26 度了一个,PMBus是数字电源管理协议。PMBus用了指令的通讯形式,总线更像一个载体。

I2C  SMBus 不也是指令形式吗?只不过PMBus更细致罢了。

点赞  2019-8-2 11:00
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复