moyanming2013 发表于 2016-11-22 16:35:57

关于STM32的I2C(IIC)问题的讨论

本帖最后由 moyanming2013 于 2016-11-22 16:58 编辑

此问题延伸于:
https://www.stmcu.org.cn/module/forum/thread-609223-1-1.html
我发表了一些言论引起了激烈的讨论。这讨论是积极的好的,希望下述也能起到讨论和传播的效果。
为什么国内一股ST的硬件I2C不行的氛围,这些初始言论从何而来、从谁而来,又是如何被形成“共识”的?!
但,现在已经不重要了。为了能够摆脱这种氛围,或者说让那些没认真操作或者没实际操作ST硬件I2C的同学能够真正了解其原理而不至于把这种言论再传播下去,希望大家踊跃讨论,各抒己见。
1.I2C协议在2006年10月10日已经免除版税了!参考资料1。
但需要缴纳I2C从设备地址版税(意思就是说你如果是做I2C从设备的厂商只需要缴纳从设备地址版税)给NXP。
ST首个STM32产品是基于Cortex-M3的,而Cortex-M3首个开放IP的版本是r1p1(参考资料2),是在2006年发布的,接着在2008年发布了r2p0,当前广泛使用的是2010年发布的r2p1。如果你是通过正规途径购买的F1系列产品,基本都是2010年后基于r2p1生产的免版税的I2C协议实现(即使ST实现从设备,这些从设备版税对ST来说根本比不了砍了I2C带来的损失)。参考资料2.
所以,以后别说是ST与飞利浦或NXP由于版税或版权导致的I2C有问题这种不当言论了!
额外:国内洋垃圾横行,一些小厂为了减少成本,可能使用了一些早间2006或之前生产的ST产品(这种情况其实本来就小的很!),看了一些时间对不上版本号的勘误表给出了一些错误的结论。希望我们都认真一些!负责一些!

2.ST的I2C是否真的有问题?
首先,用它的同学不要妄下结论,大家水平都有限,后面的同学看了你说的结论会“一朝被蛇咬十年怕井绳”,因为我们做的产品都需要稳定运行。
我们来看下国外用户对STM32的I2C的问题吧:
2.1.arm mbed上面搜索“ST I2C”有24万个结果(大部分是相关资料等)(参考资料3),我们可以看其中列出的2个问题:
“Basic i2c issues with STM32F103RB target”,他的问题大致是说收到的数据是错误的,并没有I2C本身存在问题的描述。
“I2C2 on ST Nucleo F103RB.”,他的问题是用I2C2时不工作,其中有人提醒他:
I2C需要10K的上拉电阻!(国内用户也应该看看是否此配置正确?)
另一位说问问题的搞错了管脚(但该位的I2C1有问题,但I2C2没问题)
上面的2个问题都没有说明I2C本身有什么硬件问题!
2.2.stackoverflow上面搜索“ST I2C”只有28个结果(参考资料4),我们可以看其中列出的2个问题:
“STM32 how to set a slave I2C port”,他从I2C1发数据到从设备I2C2,但是I2C2没有回复ACK,其中有人回复他不要忘了加上拉电阻。
“Embedded software program block, I2C?”,他实现的IO比较多:串口、SPI、DMA等,知道自己的I2C仲裁可能存在问题,其中有人回复他的程序里面有些处理没有超时退出。该回复者提到了ST的I2C硬件有时有bug,但现在他的I2C操作可用。
上面都提到的上拉电阻,见下图红框处(参考资料1):

2.3.国内也不是所有人都觉得ST的I2C的难用:
“关于STM32的I2C硬件DMA实现”提到:
“网上看到很多说STM32的I2C很难用,但我觉得还是理解上的问题,STM32的I2C确实很复杂,但只要基础牢靠,并没有想象中的那么困难。”
上述来源:http://blog.sina.com.cn/s/blog_a960e9100102v0ot.html
所以,当你遇到问题时,先要怀疑自己的理解能力、解决问题的能力,再说其它原因,更不要以讹传讹。只有面对自己的问题才能进步。

3.我自己的情况。
我用过NXP自己的硬件I2C(这可能比ST的I2C有点说服力,毕竟I2C是NXP(飞利浦)的原创),有串口中断、有定时器中断等。在调试该I2C时也遇到了问题,而且长时间(2个月)无法解决。我找到了NXP官方(其实还是飞利浦的资料)的关于I2C的技术细节,并实现了它(仍然是硬件I2C实现而不是模拟,当时搜索国内的解决方案,包括周立功方面都是给的模拟方案和建议改为模拟方案(我觉得周立功方面没作为),但我是没有放弃),最后是在进行I2C通信前关闭所有中断解决了此问题,并通过了长时间的测试仍然运行良好。但此前的功夫不是白费的,只有掌握和实现了I2C本身,才能够说其它方面有问题,比如中断。但反过来,即使中断改对了,也不一定能够解决硬件I2C的问题。再进一步妥协到用模拟I2C,那种被牵着鼻子走的感觉就如同买了个拖拉机还让用牛车一样。我想ST下的I2C也有类似的问题,就看是否真去解决!下面的资料是I2C的技术细节,有些能够在ST的关于I2C的介绍中找到,有些还需要参考原始技术细节比较容易理解。我发现I2C看起来简单,但是真正运行时很复杂,见上面2.3提到的,我建议大家在做I2C通信时都要彻底掌握I2C协议本身并结合自己的项目来处理(其实做什么项目都应该如此)。比如是否关闭所有中断和设置优先级。
比较难找的、至今通用的、追本溯源的、非常通俗易懂的、我对I2C研究压箱底的、飞利浦I2C原始细节用户手册《AN10216 I2C Manual》:

你想知道的关于I2C所有的技术细节都在上面了!
下面是NXP更新的I2C用户手册(它更官方话了些):


4.ST在国内关于I2C舆论时在干什么?
其实ST的硬件I2C有没有问题,各位应该有个大致判断了吧!
关于勘误表,我想说的是任何MCU都不是完美的,即使串口也有勘误。但勘误表不是自己的免死金牌!
我给一些其它ST官方的关于I2C的资料:
《STM32L4-I2C》见参考资料5.
《AN2824 STM32F10xxx I2C optimized examples》见参考资料6.

5.参考资料
1.http://en.wikipedia.org/wiki/I%C2%B2C
2.http://infocenter.arm.com/help/i ... .cortexm/index.html
3.http://developer.mbed.org/search/?q=ST+I2C
4.http://stackoverflow.com/search?page=2&tab=relevance&q=st%20i2c
5.http://www.st.com/content/ccc/re ... _Peripheral_I2C.pdf
6.http://www.st.com/content/ccc/re ... s/en.CD00209826.pdf


jcx0324 发表于 2016-11-23 11:18:26

以前应用的时候是会出问题,ST支持都说自己的有问题,这个是事实的, 口碑估计就是那个时候开始的

tgw860910 发表于 2018-9-12 11:46:00

正常跑起来应该挺稳定的,但是要考虑一下做环境实验的时候,被静电一打,或者某些情况下SDA、CLK被强制拉低了一下,这时候你就知道硬件IIC的稳定性有多好了,我是吃过亏的,呵呵

wdshuang09 发表于 2016-11-23 12:18:43

支持         

没事逛荡 发表于 2016-11-23 09:24:01

楼主研究透彻。顶起!

奏奏奏 发表于 2016-11-23 08:57:34

我用I2C访问EEPROM,当时是24C64,地址要由默认的8位改为16位地址。
用STM32F1的硬件I2C也没有问题。
不知道为什么有人会说硬件I2C有问题:L

五哥1 发表于 2016-11-22 17:37:53

这个才象研究的样子,我们就需要这样的研究,我支持楼主。

moyanming2013 发表于 2016-11-22 23:00:55

五哥1 发表于 2016-11-22 17:37
这个才象研究的样子,我们就需要这样的研究,我支持楼主。

不管如何,我说了自己认为合理的

moyanming2013 发表于 2016-11-23 10:48:31

奏奏奏 发表于 2016-11-23 08:57
我用I2C访问EEPROM,当时是24C64,地址要由默认的8位改为16位地址。
用STM32F1的硬件I2C也没有问题。
不知 ...

嗯,那种声音太刺耳,我们去噪一下。

moyanming2013 发表于 2016-11-23 12:10:37

jcx0324 发表于 2016-11-23 11:18
以前应用的时候是会出问题,ST支持都说自己的有问题,这个是事实的, 口碑估计就是那个时候开始的 ...

嗯。
ST自己的国内业务员太不负责任了,如果连“由于和NXP(或飞利浦)关于I2C的专利问题”都写入FAQ,那么就看出ST中国自己都搞不清楚吗?!
其实,ST的新网站也有问题(https://www.stmcu.org.cn/module/forum/forum.php?mod=redirect&goto=findpost&ptid=607304&pid=2188295&fromuid=3089512)!

农夫水0533 发表于 2016-11-23 16:25:59

从我接触的几个ST的支持来看水平真的不咋地
页: [1] 2 3 4
查看完整版本: 关于STM32的I2C(IIC)问题的讨论