本帖最后由 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》: |
IIC的协议不复杂,用过NXP的人,尤其对IIC印象深刻,没问题;
ST的IIC是什么时候出的问题?是早期的版本,问题主要是STM8系列,STM32F1XX系列,STM32F2XX系列;
我遇到的问题,一旦出错,有可能对应的端口一直保持低电平状态,重新上电后,直接挂掉;只有把芯片擦除才可以恢复过来;
出现上述问题的时候,如果只是操作24CXX这类器件,问题要少很多;如果是双机IIC通讯,基本是没听说谁成功了。都是被迫改用模拟IIC来操作IO端口;耗时,费劲。
如果说ST的IIC很成功,为何后续新的器件,如STM32F0系列,把IIC部分的硬件重新设计?同期的STM32F4XX也跟着一同改用新核了;
问题出在哪?印象中有人分析过,是应答检测环节;处理的很草率,容错性差,如果应答信号没有及时检测到,就直接挂掉了;严重到不可恢复,重新上电都不行。
如果是短距离的硬件,如24CXX,能及时给出应答,没事,否则,发生什么都有可能。所以用24CXX的人有,但双机通讯的人,没听说谁成功了。
事后,ST公司并没有解释为什么IIC难弄,只是对IIC核重新设计了。
你自己可以搭个电路测试,二片STM8,用IIC通讯,通讯距离1米;
过一段时间就卡住
用模拟就不会
胡说八道,乱讲一通
用STM32F1的硬件I2C也没有问题。
不知道为什么有人会说硬件I2C有问题
不管如何,我说了自己认为合理的
嗯,那种声音太刺耳,我们去噪一下。
嗯。
ST自己的国内业务员太不负责任了,如果连“由于和NXP(或飞利浦)关于I2C的专利问题”都写入FAQ,那么就看出ST中国自己都搞不清楚吗?!
其实,ST的新网站也有问题(https://www.stmcu.org.cn/module/ ... amp;fromuid=3089512)!
其实这正是大家存在的价值,即使官方也可能有错误的时候啊
8位下你可以用模拟的没人质疑什么。
但不要把这种“认识”带入到32位的MCU中。
至于所谓的“新核”,Cortex-M3也会从r1p1升级到r2p0,都是正常的更新。
还是建议好好搞清楚I2C本身,然后再找找原因。
如果是应答环节无反馈,建议添加超时退出。
你的“把芯片擦除才可以恢复过来”太生猛了。