谁说ST的I2C能用我跟他拼命!ST的I2C绝对是芯片设计时存在BUG,我用STM32,我的同事用STM8都出现同样的现象:I2C会不定在什么时候死掉,你们可以试一下,I2C如果死掉,即使你在不断电的情况下复位芯片,仍然不能恢复,必须断电才能恢复!说能用的都是没真用st的I2C做过项目,谁用谁知道!
你要和偶拼命,偶好象有点怕怕。
呵呵,用过STM32及STM8的硬I2C电路,I2C通信时,都可以拿镊子去短路SDA及SCK。短路后都可自恢复(不用断电,最多几ms就恢复)。
楼主,你能证明你的程序没有问题吗?
我支持的客户中使用I2C的多了,没听他们抱怨STM32的I2C有问题。
如果有问题是你的代码写的有问题!!!
感谢你的关注,麻烦你自己试试,能恢复不?我是试过N多次了!用过网上无数大师级号称能用的,没有一个能真正用着不死的,不信?我写的给你试试也能用!
呵呵,代码的问题?芯片复位了代码都恢复不了?那还是芯片的BUG,不是吗?为什么断电了可以?
而且很奇怪的是STM8和STM32都有同样的现象,我同事是I2C驱动收音机芯片,我是驱动AT24C16,死掉了你如果不断电怎么都恢复不了
我也写过I2C的程序,怎么没有出现楼主的现象?客户也用得正常,量产也已经几百K了,这说明什么问题呢?
我为这过花费了很多时间,之前用过NEC,PHINIP的硬件I2C都没这么麻烦过
7楼,只能说明你是神人!量产几百K?量真的很大啊!
1)STM8和STM32是有BUG,ST的勘误手册给出了回避的方法,参考手册也有说明。
2)I2C死掉时,如果是从设备(如你的收音机芯片)出现问题,则复位MCU是不能恢复的。
3)为了不让你为此小事与人拼命而因此丧命,我就不告诉你是谁在做项目了,
看样子,我们必须得每天去关注ST的勘误手册是否有更新了,不过不知道我的老板是否同意。香工还是个厚道人!不过不知道ST有没有考虑过我们写软件的?我不是搞到伤心处,谁会去拿命拼?
问题不搞懂,心不甘啊,ST_ARM能把你写的给我试试行不?
359613524@qq.com
//以下先把I2C 口先配置为输出口,再输出1,可以是总线物理复位,
//可以使调试复位的时候,上一次错误程序导致的总线错误,不会对本次调试产生影响
//以及其他情况引起的总线错误不会对复位以后产生影响
//复位时,不会I2C出错
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIOB->BSRR = GPIO_Pin_6;// =1
GPIOB->BSRR = GPIO_Pin_7;// =1
////再配置为I2C功能口/////
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Enable I2C1 reset state */
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, ENABLE);
/* Release I2C1 from reset state */
RCC_APB1PeriphResetCmd(RCC_APB1Periph_I2C1, DISABLE);
7楼,只能说明你是神人!量产几百K?量真的很大啊!
可以是每个月量产几百K呀,看看这个帖:
【以STM32为核心】神奇?! 索尼PS3体感控制器拆解篇。
上面那个MEMS就是通过I2C与STM32连接的。
如果你的I2C只是用来做主机的话,可以将那2个IO口设置成通用IO,然后模拟I2C时序就行了,硬件不用改,代码复杂度和原来差别不大。保证不会死锁!
反正ST给的例子,是不能照搬过来用,一用肯定是死机。你要拼命就拼命吧 呵呵
看里面那么多的WIHLE 不要命才怪了! 一有出错 就WIHLE
给你说 一就是一横 二就是二横 三就是三横 四就不用学了四横罢 呵呵