你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
moyanming2013 提问时间:2016-11-22 16:35 /
本帖最后由 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):
QQ截图20161122155711.jpg
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》:
AN10216 I2C Manual.pdf (4.12 MB, 下载次数: 1098)
收藏 22 评论34 发布时间:2016-11-22 16:35

举报

34个回答
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有问题
五哥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/ ... amp;fromuid=3089512)!
农夫水0533 回答时间:2016-11-23 16:25:59
从我接触的几个ST的支持来看水平真的不咋地
1234下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版