再问STM32的硬件I2C与软件模拟

2019-12-12 18:09发布

坛里的帖子看了很多,大致了解了STM32的硬件I2C的确有一些BUG,或者说使用时有很多不方便满足的要求,比如DMA加最高中断。所以思考是否使用模拟方式替代。但有种观点是模拟I2C太耗资源。我认真分析了下,其实大部分I2C读写操作在程序中都是顺序类型的,及当读、写I2C从机时,必须读、写到想要的数据才能继续往下执行,如果其中出错,还必须重新来过。所以不管是用硬件查询,中断,DMA等方式还是模拟方式,都必须等待从机完成,所花时间决定与I2C速度和从机响应速度。如果可以这么理解,是否可以说其实模拟方式没有任何风险,速度差不多,故而是最好的选择?

望对这个问题有经验的朋友们不吝赐教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
93条回答
godsend
1楼-- · 2019-12-17 16:16
 精彩回答 2  元偷偷看……
laoshuhunya
2楼-- · 2019-12-17 18:40
本帖最后由 laoshuhunya 于 2017-3-10 10:37 编辑
szszjdb 发表于 2017-3-8 10:18
好像是的。至少查询方式的硬件是不行的,其他两种都可以吧。


   不管是硬件还是软件模拟,都可以中途切换任务。你可以把切换任务看成执行时间较长的中断,要注意的是有些I2C器件有等待时间限制。
   题外话:我们测试过AT24C02和SST25VF020B,在RTOS中开4个同优先级任务,第一个任务点灯,第二个任务做浮点运算,第三个任务运行模拟I2C反复读写AT24C02的00H地址单元,第四个任务运行模拟SPI反复读写SST25VF020B的00H地址单元(写入之前执行整片擦除)。任务3和4中,访问AT24C02和SST25VF020B的任何错误都会设置一个错误标志,任务1检测到这个错误后会停止LED闪烁并保持常亮。软件每秒钟读写一次AT24C02和SST25VF020B,连续运行两天两夜没出现任何错误,第三天开始出现频繁错误(大约每10次读写就有一次错误),10几个小时后又逐渐恢复正常,但之后又开始频繁出错,每10次有2、3次错误。之后,我们修改读写SST25VF020B的单元地址为01H,重新测试8小时完全正常,再把读写地址改回00H,立即出现频繁出错,这说明SST25VF020B的00H单元已经达到擦写寿命。
cpholr1
3楼-- · 2019-12-17 22:17
网上找过几个STM32硬件iic的例程,不能正常运行,或者运行几下就挂了。

后来仔细分析协议,发现还是写例程的写的有bug导致的出错。稍微改改,就能用了。

稳定运行了好几个月没再出过问题。
int
4楼-- · 2019-12-18 01:22
godsend 发表于 2017-3-10 10:05
晚上回去贴出来

好的,谢谢老哥!
security
5楼-- · 2019-12-18 04:51
szszjdb 发表于 2017-3-7 13:08
没错,不怕中断,这是最大优点。 只是如果用操作系统,在I2C进行时不能进行任务切换,稍微影响实时性,对 ...

应该是在 I2C 通讯的时间内,不要去主动进行任务切换,这时间太小,不要主动加大系统负担。
而被动被剥夺,还是允许的。
关于 I2C 模拟的一些讨论,可以看这个帖子,我在里面给出了一些回复,就不再重复打字了。
有兴趣,戳这里:「uCOSIII 中能否建立一个IO模拟IIC的任务
godsend
6楼-- · 2019-12-18 09:44
 精彩回答 2  元偷偷看……

一周热门 更多>