OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7883|回复: 19

STM32的I2C硬件的缺陷具体是什么?

[复制链接]

14

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2021-10-7
在线时间
44 小时
发表于 2021-11-1 15:56:55 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 cyradg 于 2021-11-1 16:04 编辑

看了正点原子的I2C教程,是模拟I2C的,不是使用硬件I2C,我个人有些疑问:
1、对于正点原子的模拟I2C,这个模拟I2C我看不出时钟是多少,如果时钟太快,低速I2C外设是否还能正常工作?
2、看了读写24C02的例子,等待ACK信号也只是使用了IIC_Wait_Ack函数,但是并没有去判断IIC_Wait_Ack函数到底返回了什么,比如没有收到ACK信号如何处理,所以我个人认为使用IIC_Wait_Ack,更多的就是一个延迟,如果实际当中外设真的没有回应ACK,那正点原子后面的代码其实都是没有用的,因为外设没有回应ACK,意味着外设正忙,或者意味着外设出问题了。比如24C512存储是有页写入的概念,当MCU向24C512写入字节数到达一页,就必须向24C512发送页写入命令,24C512页写入要一段时间,一种简单粗暴的方式是延迟一段很长时间,缺点是存储器操作时间长,另一种比较精确的方式就是每隔几百微秒(或更短)向24C512发送一个写入命令,这个时候,判断ACK信号很重要,如果没有回应ACK,说明24C512还在忙,如果很长时间没回应ACK,那说明24C512可能当机了。

那么回到STM32的I2C硬件,它的缺陷到底在哪里?使用I2C标准库有什么问题,有的说会当机,是I2C跑飞了吗?有的说等待ACK信号当机,我看标准库里也没有while死循环等待的代码?有谁能指点下?STM32的I2C硬件看起来参数比较多,不像ATMEL的I2C硬件,就那么几个参数,使用起来也蛮稳定。
最后,谁有STM32的I2C硬件不用标准库,只用寄存器的操作代码?

最佳答案

查看完整内容[请看2#楼]

总结来说: 1,不管STM32硬件IIC现在搞定了bug没有,IIC这玩意本身时序就不高,用不用硬件关系不大。 2,软件模拟IIC,任何IO都可以,移植简单,硬件IIC,固定死IO,移植麻烦。 所以,能用软件就软件吧。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2021-11-1 15:56:56 | 显示全部楼层
总结来说:
1,不管STM32硬件IIC现在搞定了bug没有,IIC这玩意本身时序就不高,用不用硬件关系不大。
2,软件模拟IIC,任何IO都可以,移植简单,硬件IIC,固定死IO,移植麻烦。


所以,能用软件就软件吧。。。
回复

使用道具 举报

14

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2021-10-7
在线时间
44 小时
 楼主| 发表于 2021-11-1 19:30:00 | 显示全部楼层
还有正点原子的SCL,SDA输出时是配置成通用推挽输出,网上我看了下是建议配置成开漏输出,我觉得也是配置成开漏输出比较合适。另外,SDA输入时是配置成下拉输入,我觉得是不是配置成浮空输入合适些?因为I2C的SCL,SDA都是要外接上拉电阻的。网上很多说STM32的I2C硬件不好,我也不知道哪里不好,其实ATMEL的I2C硬件我也调试了好久,调试好了也是蛮好用的。
回复

使用道具 举报

13

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
838
金钱
838
注册时间
2018-12-19
在线时间
171 小时
发表于 2021-11-1 21:54:18 | 显示全部楼层
STM32F103C8T6的硬件IIC我用过,用来驱动SSD1306主控的OLED屏,运行几个小时之后会死机。
改成用IO模拟的IIC,从没死机过。
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2765
金钱
2765
注册时间
2018-11-8
在线时间
438 小时
发表于 2021-11-2 08:08:45 | 显示全部楼层
https://www.cnblogs.com/cage666/articles/9406226.html
也不知道真假 反正原子哥说模拟好 那就模拟
回复

使用道具 举报

3

主题

117

帖子

0

精华

高级会员

Rank: 4

积分
559
金钱
559
注册时间
2018-10-3
在线时间
107 小时
发表于 2021-11-2 08:30:24 | 显示全部楼层
cyradg 发表于 2021-11-1 19:30
还有正点原子的SCL,SDA输出时是配置成通用推挽输出,网上我看了下是建议配置成开漏输出,我觉得也是配置成 ...

以前可能出现过硬件IIC有问题,导致丢数据之类的。 但我用的时候 不管是标准库还是HAL库,都未发现这个问题,而且很好用。
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2021-11-2 09:47:48 | 显示全部楼层
硬件有专利问题
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2021-11-2 09:53:56 | 显示全部楼层
wklhwkl 发表于 2021-11-2 08:30
以前可能出现过硬件IIC有问题,导致丢数据之类的。 但我用的时候 不管是标准库还是HAL库,都未发现这个问 ...

一传十  十传百  反正这结论就传下来了  也不知道是真是假

也就大多数的人,包括我自己,用ST的都直接上模拟IIC了  
学无止境
回复

使用道具 举报

14

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2021-10-7
在线时间
44 小时
 楼主| 发表于 2021-11-2 10:35:02 | 显示全部楼层
jermy_z 发表于 2021-11-2 09:53
一传十  十传百  反正这结论就传下来了  也不知道是真是假

也就大多数的人,包括我自己,用ST的都直接 ...

Proteus模拟都失败了。代码照抄,居然还读不出数据,而且开始I2C之前,模拟I2C总线显示会触发一些异常?
A.jpg
B.jpg
看看ATMEL的Proteus的模拟,I2C收发利落干净。
C.jpg
而且,看来Proteus对STM32真的水土不服,我翻手册看R6,参数是I2C1的引脚就是PB6,PB7,这个和RC是一样的,看看Proteus开启I2C硬件,PB8,PB9居然亮了,我查,不明就里啊,写什么代码都没反应!看来只能上开发板测试了。
D.jpg
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13118
金钱
13118
注册时间
2012-11-26
在线时间
3813 小时
发表于 2021-11-2 10:38:34 | 显示全部楼层
cyradg 发表于 2021-11-2 10:35
Proteus模拟都失败了。代码照抄,居然还读不出数据,而且开始I2C之前,模拟I2C总线显示会触发一些异常 ...

找块板子试吧   软件仿真不一定准
学无止境
回复

使用道具 举报

14

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2021-10-7
在线时间
44 小时
 楼主| 发表于 2021-11-2 11:04:40 | 显示全部楼层
854278507 发表于 2021-11-1 21:54
STM32F103C8T6的硬件IIC我用过,用来驱动SSD1306主控的OLED屏,运行几个小时之后会死机。
改成用IO模拟的I ...

I2C我觉得最头疼的问题就是处理ACK信号,很多外设,如果没有处理好ACK信号,时序就会乱,一般来讲时序乱了,外设就会响应错误或者不响应,不响应有时就是等待主机(MCU)的一个正确的回应。正点原子的代码中,我没看到判断ACK然后做不同的处理,只是等待ACK,等没等到不知道。深入看IIC_Wait_Ack,里面明确写了等待超时就IIC_Stop,如果真Stop了,后面的代码写的有什么意思,都结束了,还发什么收什么?所以我觉得这样代码不严谨。至于STM32的I2C硬件我目前还不了解,不过我觉得死机,应该就是while等待没有检测超时,死掉了,否则的话,那就是STM32硬件问题了,硬件问题就是大问题了,跑飞了,什么代码都解决不了,我觉得STM32的I2C硬件的“缺陷”还不至于这么严重。
STM32的I2C可能状态很多,我看到很多帖子都是开I2C中断检测不到时序信号,有的说I2C中断被更高级的中断打断了捕获不到信号,其实捕获不到信号如何处理本身就是一个要思考的问题,正点原子的模拟I2C,24CXX的读写代码中,我也没看到如何处理外设是否回应ACK信号的问题,24CXX虽然可以一个个字节写入,其实24CXX还是有页概念的,比如24C02一个页是8个字节的缓存,发送写入字节实际上是写入到缓存,并没有真正写入到EEPROM中,24C02只有接收到Stop信号才会将这8个字节(哪怕你只发了一个字节,只不过是24C02对应的那个内容改变了)写入到EEPROM中,这个写入是要时间的,这个时间是多少具体参考手册。所以当发送Stop后,马上发送Start,如果I2C时钟太快,24C02还忙着写页内容,没有捕获到Start,后面就全乱了。所以24CXX手册严谨的说法是向24CXX发送一个写命令,并等待回应ACK,如果24CXX有回应,说明24CXX空闲,这时候就可以向24CXX进行读写操作了,如果没有回应,还继续写代码发送命令,那就等着抓狂吧。。。所以判断ACK信号是否存在很重要。
回复

使用道具 举报

14

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2021-10-7
在线时间
44 小时
 楼主| 发表于 2021-11-2 11:28:26 | 显示全部楼层
wklhwkl 发表于 2021-11-2 08:30
以前可能出现过硬件IIC有问题,导致丢数据之类的。 但我用的时候 不管是标准库还是HAL库,都未发现这个问 ...

一下子看不太懂STM32的I2C硬件,想请教下兄弟两个问题,1、STM32的I2C硬件如何发送应答或非应答信号?2、STM32如何判断收到没收到外设的应答信号?
回复

使用道具 举报

14

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2021-10-7
在线时间
44 小时
 楼主| 发表于 2021-11-2 12:26:52 | 显示全部楼层
本帖最后由 cyradg 于 2021-11-2 12:37 编辑

说说24CXX的工作模式,不一定正确。以24C02为例,一个页是8个字节,具体过程如下:
1、MCU发送起始信号,这时候I2C总线设备都处于监听状态(在忙着干事的另说)
2、MCU发送设备地址信号,读或写,例如发送0xA0就是对24C02写,相应的地址的外设会回复ACK,但是在忙可不会回应
3、MCU发送比如在地址3的地方要写入数据,24C02会准备一个8个字节的缓存,将0-7地址的内容读取到缓存,并把数据指针指向缓存地址3,回应ACK
4、MCU发送写入数据,24C02接收到数据并把数据放到缓存地址为3的位置,回应ACK,并且把数据指针指到4。这个写入时间很短,因为并没有实际写到EEPROM中
5、MCU继续写入数据,这里就有一个很有意思的问题,写到缓存地址7以后,数据指针指到哪里?指到8吗?才不是,而是指到0,这时继续写入数据,先前写入的会被覆盖,这就是页概念。
6、所以写到一页时,就必须Stop了,否则之前的数据会被覆盖,这时要通知24C02把这一页数据写入EEPROM,这时24C02会把8个缓存数据写入到EEPROM,这个时间相对就比较长了,对于24C512,好像一页是256个字节,也就是每Stop一次,24C512就会将256个字节写入EEPROM,这个时间就更长了,这时候就要等,不等就等着抓狂。。。
7、所以Stop以后,就要想办法等待ACK了,因为24CXX很忙,如果Stop后马上Start再写再读,死了。。。。。怎么死的,看以上过程,除非你的I2C时钟够慢,或者延迟时间够长
这是我对I2C应用的一些看法,就是处理ACK信号很重要,不一定正确,但是我这个方式在ATMEL处理的还是很好的。

所以我觉得对24C02写入数据时,不是每写一个就必须Stop一次,而是保证一次连续写入超过一个页的上界字节后就必须Stop一次,理论上速度更快(代码足够健壮),对EEPROM磨损更少,
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4915
金钱
4915
注册时间
2015-1-10
在线时间
616 小时
发表于 2021-11-2 13:51:10 | 显示全部楼层
我一直用的硬件IIC,在底层加了超时重设IIC配置参数,超时了重新启用IIC就完了,没发现什么问题
回复

使用道具 举报

14

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2021-10-7
在线时间
44 小时
 楼主| 发表于 2021-11-2 15:27:27 | 显示全部楼层
阿侑kevin 发表于 2021-11-2 13:51
我一直用的硬件IIC,在底层加了超时重设IIC配置参数,超时了重新启用IIC就完了,没发现什么问题

STM32很多参考关于I2C比较凌乱,或者说没有一个完整的I2C硬件工作时寄存器如何配置的过程,据说STM32官方指公布了一个标准库的应用范例,吐槽的很多。ATMEL的官方参考是提供了完整的一个范例的文档解释,作为主机或从机,从开始到通信结束,如何开始,如何联系外设Address等每一步所有涉及到的寄存器如何配置,如何发送ACK和NACK,如何判断外设的状态都有说明,其中while(!(TWCR&(1<<TWINT)))就是一个死循环,就是判断外设的回应,ATMEL也强调了这句判断的危险性,就是死循环。
STM32的状态很多,我一下子也没看明白,都是网上零零散散的,官方也没看到完整说明,好像和I2C寄存器的SR1的TIMEOUT,OVR,AF,ARLO,BERR有关,甚至更多,看来调试I2C硬件要开发板+逻辑分析仪了。
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4915
金钱
4915
注册时间
2015-1-10
在线时间
616 小时
发表于 2021-11-2 16:28:04 | 显示全部楼层
cyradg 发表于 2021-11-2 15:27
STM32很多参考关于I2C比较凌乱,或者说没有一个完整的I2C硬件工作时寄存器如何配置的过程,据说STM32官方 ...

我是通过官方的IIC+DMA改的,用起来还可以,也没必要深究下去,大家都不讨论STM32的硬件IIC,问就是用模拟
回复

使用道具 举报

13

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
838
金钱
838
注册时间
2018-12-19
在线时间
171 小时
发表于 2021-11-2 20:06:51 | 显示全部楼层
cyradg 发表于 2021-11-2 11:04
I2C我觉得最头疼的问题就是处理ACK信号,很多外设,如果没有处理好ACK信号,时序就会乱,一般来讲时序乱 ...

这些都好处理,主要软件跟硬件的区别是软件方便移植,硬件速度快,我用来驱动OLED屏,速度不需要很快,软件模拟的够用了。
硬件IIC做主机,不用开中断,直接查询标志位就可以,加个超时处理。
软件模拟还有一个好处,可以做到SDA和SCL自动识别,硬件IIC就不用想了,
如果是做IIC从机,还是要用硬件的,开中断就可以了。
如果用HAL库应该很容易驱动的,就是HAL库太占空间了,编译速度还慢。
回复

使用道具 举报

14

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2021-10-7
在线时间
44 小时
 楼主| 发表于 2021-11-3 11:51:31 | 显示全部楼层
模拟I2C肯定是要用的,毕竟有这么多在用,所以首先考虑的就要调试好这个代码,调好了有空再调调STM32的I2C硬件,硬件玩不转就有模拟I2C备胎。正点原子的SDA,SCL固定了引脚脚,所以我想改成自己自由配置的那种,只可惜Proteus仿真STM32糟透了,只能上开发板了,正点原子的迷你开发板东西少了些,自己做了些扩展配置,目前弄得是I2C和SPI硬件的典型设备,准备到嘉立创0元白嫖。
A.jpg
回复

使用道具 举报

45

主题

267

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1101
金钱
1101
注册时间
2018-6-24
在线时间
158 小时
发表于 2021-11-3 16:24:36 | 显示全部楼层
这3D图画得挺像的
回复

使用道具 举报

14

主题

72

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
268
金钱
268
注册时间
2021-10-7
在线时间
44 小时
 楼主| 发表于 2021-11-3 17:07:07 | 显示全部楼层
正点原子的下面这个读一个字节的代码不对吧?按道理,读完后,SCL应该为低电平,但是读完是高电平了,然后执行ACK或NACK是又把SCL拉低,这时会产生一个时钟信号,可能会发一位数据出去,不安全吧。
A.jpg
下面是写操作,操作完SCL是低电平,这个状态时安全的。
B.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 10:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表