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

2019-12-12 18:09发布

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

望对这个问题有经验的朋友们不吝赐教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
93条回答
szszjdb
1楼-- · 2019-12-20 21:17
godsend 发表于 2017-3-16 17:25
你并没有理解DMA,还是先好好理解DMA,就知道你一直纠结的问题在哪了。

据我的理解,I2C的DMA中断主要是完成中断,当然此中断的时间很短,的确不会有很明显的系统开销。主要是涉及I2C操作的程序不好安排,大部分此类操作的前后顺序都有要求,启动DMA后,还是得用各种方式去等待操作从机完成,不知我理解是否正确。兄弟经验丰富,唯愿闻其详!
szszjdb
2楼-- · 2019-12-20 23:25
 精彩回答 2  元偷偷看……
godsend
3楼-- · 2019-12-21 03:26
szszjdb 发表于 2017-3-27 11:06
据我的理解,I2C的DMA中断主要是完成中断,当然此中断的时间很短,的确不会有很明显的系统开销。主要是涉 ...

只需要给个标志位去检测标志位即可(stop的时候),在dma发送时cpu可以去干别的事。为什么非要死等。
godsend
4楼-- · 2019-12-21 09:07
本帖最后由 godsend 于 2017-3-28 09:00 编辑
szszjdb 发表于 2017-3-27 11:06
据我的理解,I2C的DMA中断主要是完成中断,当然此中断的时间很短,的确不会有很明显的系统开销。主要是涉 ...


还有一点你要明确,启用的中断并不是DMA中断,是i2c的事件中断,在事件中断检测发生的事件再做出处理,当然不要忘记错误中断,处理好I2C总线错误可以避免死机事件发生。程序我上面已经给出了,你可以自己理解一下。
szszjdb
5楼-- · 2019-12-21 13:22
godsend 发表于 2017-3-28 08:57
还有一点你要明确,启用的中断并不是DMA中断,是i2c的事件中断,在事件中断检测发生的事件再做出处理,当 ...

多谢! DMA完成中断前,的确可以干别的事,但实际上因为程序顺序逻辑的问题,这个检测标志并进一步进行I2C操作的功能函数还并不好安排。比如发起DMA后,先执行别的函数,但执行到何处再进行DMA完成标志判断,并且还要继续I2C剩下的操作等等,在实际操作时并不好操作。所以包括ST官方很多例子,不限于I2C DMA, 在DMA完成前,也是仅仅原地延时查询完成标志,并没有干别的事。这是我在使用DMA时觉得比较棘手的地方。不知兄弟怎么考虑?
xld826
6楼-- · 2019-12-21 18:19
楼主可以用GD32的硬件IIC试试,哈哈

一周热门 更多>