本次移植X-NUCLEO-IKS01A3传感器驱动是基于STM8S-DISCOVERY开发板的,使用了官方的en.x-cube-mems1.zip资源包。传感器功能通过编译选项逐个开启,开启标志位于iks01a3_conf.h文件中。为了便于查看数据,接入了OLED显示屏,用来显示采集到的传感器数据。
本次在STM8S-DISCOVERY上移植驱动采用模拟I2C用于通讯。模拟I2C使用了PC6作为SDA,PC7作为SCL。这两个引脚与一组电源和地相邻,便于接线。
在调试过程中,LSM6DSO、LIS2DW12、LIS2MDL、HTS221、LPS22HH五个传感器都比较顺利的调通,得到了传感器数据。而STTS751传感器移植无法通讯,在主芯片发送地址信息后,始终都是NACK。
之前查看了STTS751的手册, STTS751使用的SMBus协议。SMBus协议是Intel与Duracell共同制订笔记本电脑所用的智能型电池时所研发的接口,参考自I2C,与I2C有交集的部分,也有部分区别,在一般情况下,可以使用I2C协议的接口来进行通讯。区别说明参看2楼。
1. 首先怀疑的是时序问题,通过逻辑分析仪分析发现当前的频率大于160多K了,超过了SMBus的10K-100K的范围。调整了一下延时,频率调整到90K左右,还是无法通讯。
2. 对比模拟I2C与硬件I2C,发现模拟I2C的时序不是准确频率的时序,会时快时慢。由于STM8S-DISCOVERY频率较低。所以将模拟IIC移植到之前已调试过的NUCLEO-L011K4上,同样无法通讯。使用systick定时产生中断,模拟10K的I2C信号进行对比(同时测试了模拟引脚片上上拉和不上拉)。两者时序基本相同,仍然无法通讯。时序对比图如下:
3. 然后考虑是否是I2C信号通过ST2378E后电平信号不能完全满足SMBus协议。就直接将模拟I2C连接到I2C1(JP7/JP8的I2C_SDA/I2C_SCL)上,通讯成功,可以采集数据了。
说明:红色效方块是JP7/JP8的跳线帽;长方形小方框是I2C及电源地的接口;
这一点非常奇怪,上面2中的对比试验,所有接线都是相同的,都在同样的两个引脚输出。唯一的区别就是一个使用硬件I2C,一个使用模拟I2C。硬件I2C可以通讯,而模拟I2C不行。
接下去上图:
驱动HTS221,采集数据。
驱动LPS22HH,采集数据。
驱动STTS751,采集数据。
驱动LSM6DSO,采集数据。
驱动LIS2DW12,采集数据。
驱动LIS2MDL,采集数据。
源码:
本帖最后由 sylar^z 于 2019-7-30 17:43 编辑
I2C与SMBus之间的差异
电气特性差异:
1. 逻辑电平定义
I2C的Hi/Lo逻辑电平有两种认定法:相对认定与绝对认定,相对认定是依据Vdd的电压来决定,Hi为0.7Vdd,Lo为0.3Vdd,绝对认定则与TTL 准位认定相同,直接指定Hi/Li电压,Hi为3.0V,Lo为1.5V。相对的SMBus只有绝对认定,且电平与I2C有异,Hi为2.1V,Lo为0.8V,与I2C不全然吻合但也算部分交集。
SMBus后来增订一套更低电压的电平认定,Hi为1.4V,Lo为0.6V,这是为了让运用SMBus的装置能更省成本的作法。
2. 限流
由于SMBus一开始就是运用在笔记本电脑内,所以省电的表现优于I2C,只需100uA就能维持工作,I2C却要到3mA同样的低用电特性也反应在漏电流(Leakage Current)的要求上,I2C最大的漏电流为10uA,SMBus为1uA,但是1uA似乎过度严苛,使运用SMBus的装置在验证测试时耗费过多的成本与心力,因此之后的SMBus 1.1版放宽了漏电流上限,最高可至5uA
3. 其他相关限制
I2C有线路电容的限制,SMBus却没有,但也有相类似的配套规范,即是电平下拉时的电流限制,当SMBus的集电极开路Pin导通而使线路接地时,流经接地的电流不能高于350uA,另上电流(即相同的集电极开路Pin开路时)也一样有规范,最小不低于100uA,最高也是不破350uA的。
时序差别
1. 运作频率
I2C此方面相当宽裕,最低频可至0Hz(直流状态,等于时间暂停),高可至100kHz(Standard Mode)、400kHz(Fast Mode)、乃至3.4MHz(High Speed Mode),相对的SMBus就很局限,最慢不慢于10kHz,最快不快于100kHz。很明显的,I2C与SMBus的交集运作频率即是10kHz〜100kHz间。
2. 数据保持时间(Data Hold Time)
SMBus在数据传输后还有数据保持时间的要求,SMBus 规定SMBCLK线路的电平下降后,SMBDAT上的数据必须持续保留300nS,但I2C 却没有对此有相同的强制要求。
3. 恢复时间
SMBus对接口被重置(Reset)后的恢复时间(Timeout)也有要求,一般而言是35mS,I2C这方面亦无约束,可以任意延长时间。相同的SMBus也要求无论是在主控端(Master)或受控端(Slave),其频率处于Lo电平时的最长持续时间不得超越限制,以免因为长时间处在Lo准位,而致收发两端时序脱轨(失去同步,造成后续误动作)。
4. [已妥]与[未妥]机制的强制性差别
I2C并没有强制规定接收端非要做出响应,而SMBus上是不允许接收端在接收地址信息后却不发出回应,每次都要回应。
引用: yang_alex 发表于 2019-7-30 19:29 在SMBus基础上又发展出一个PMBus.
度了一个,PMBus是数字电源管理协议。PMBus用了指令的通讯形式,总线更像一个载体。
引用: sylar^z 发表于 2019-8-2 08:26 度了一个,PMBus是数字电源管理协议。PMBus用了指令的通讯形式,总线更像一个载体。
I2C SMBus 不也是指令形式吗?只不过PMBus更细致罢了。