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

2019-12-12 18:09发布

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

望对这个问题有经验的朋友们不吝赐教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
93条回答
szszjdb
1楼-- · 2019-12-15 12:56
syj0925 发表于 2017-3-7 09:13
硬件是stm32L100+实时时钟rx8010,采用硬件IIC通信,跑freertos,间隔2s读一次时间,发现个别终端跑个几 ...

大家都反应是I2C本身的问题,兼容性不好,易出错。这是ST家独有的问题。
科技猎人
2楼-- · 2019-12-15 18:34
我用的是模拟的,可移植性非常高。IIC有时钟先,属于同步传输,所以时钟快点慢点哪怕被中断暂停了也不影响通信完整性,所以用模拟的在效率上并不会降低很多,反而在灵活性上要好很多。如果是模拟串口的话就比较麻烦了,通信中不能被打断,效率和可靠性都很差。
szszjdb
3楼-- · 2019-12-15 18:43
科技猎人 发表于 2017-3-7 11:49
我用的是模拟的,可移植性非常高。IIC有时钟先,属于同步传输,所以时钟快点慢点哪怕被中断暂停了也不影响 ...

没错,不怕中断,这是最大优点。 只是如果用操作系统,在I2C进行时不能进行任务切换,稍微影响实时性,对吧?
科技猎人
4楼-- · 2019-12-15 22:42
 精彩回答 2  元偷偷看……
godsend
5楼-- · 2019-12-16 00:19
我告诉你,stm32的IIC没有问题。只不过使用稍微麻烦一点,还有必须是I2C+DMA,中断不必最高优先级,还有I2C+dma时和任务没有关系,中间也可以被打断,至于为什么可以被打断,可以试想数据发送以后ACK是由硬件检测,产生一个事件中断,所以这个ACK已经被硬件检测到,在中断进行下一个I2C字节发送(或者其他)的操作,只要能检测到这个ack,这个中间就可以没打断,我亲自测试过。在I2C事件中断中打断点,一个一个字节发送完全可以执行。还有就是要处理好I2C错误中断和错误发生时I2C总线电平状态(很重要),以防万一。
szszjdb
6楼-- · 2019-12-16 01:00
godsend 发表于 2017-3-8 09:58
我告诉你,stm32的IIC没有问题。只不过使用稍微麻烦一点,还有必须是I2C+DMA,中断不必最高优先级,还有I2C+ ...

多谢,同意您的看法! 不少朋友也是用DMA。我这里提到的观点就是用硬件I2C加DMA,不见得比模拟I2C节省资源,两者CPU都要实际等待I2C从机完成应答,这个看法正确吗?

一周热门 更多>