打印

谁说ST的I2C能用我跟他拼命!

[复制链接]
29954|121
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuannin|  楼主 | 2011-3-11 12:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
谁说ST的I2C能用我跟他拼命!ST的I2C绝对是芯片设计时存在BUG,我用STM32,我的同事用STM8都出现同样的现象:I2C会不定在什么时候死掉,你们可以试一下,I2C如果死掉,即使你在不断电的情况下复位芯片,仍然不能恢复,必须断电才能恢复!说能用的都是没真用st的I2C做过项目,谁用谁知道!
沙发
静默| | 2011-3-11 12:27 | 只看该作者
你要和偶拼命,偶好象有点怕怕。

呵呵,用过STM32及STM8的硬I2C电路,I2C通信时,都可以拿镊子去短路SDA及SCK。短路后都可自恢复(不用断电,最多几ms就恢复)。

使用特权

评论回复
板凳
ST_ARM| | 2011-3-11 12:30 | 只看该作者
楼主,你能证明你的程序没有问题吗?

我支持的客户中使用I2C的多了,没听他们抱怨STM32的I2C有问题。

如果有问题是你的代码写的有问题!!!

使用特权

评论回复
地板
xuannin|  楼主 | 2011-3-11 12:33 | 只看该作者
感谢你的关注,麻烦你自己试试,能恢复不?我是试过N多次了!用过网上无数大师级号称能用的,没有一个能真正用着不死的,不信?我写的给你试试也能用!

使用特权

评论回复
5
xuannin|  楼主 | 2011-3-11 12:35 | 只看该作者
呵呵,代码的问题?芯片复位了代码都恢复不了?那还是芯片的BUG,不是吗?为什么断电了可以?

使用特权

评论回复
6
xuannin|  楼主 | 2011-3-11 12:38 | 只看该作者
而且很奇怪的是STM8和STM32都有同样的现象,我同事是I2C驱动收音机芯片,我是驱动AT24C16,死掉了你如果不断电怎么都恢复不了

使用特权

评论回复
7
ST_ARM| | 2011-3-11 12:39 | 只看该作者
我也写过I2C的程序,怎么没有出现楼主的现象?客户也用得正常,量产也已经几百K了,这说明什么问题呢?

使用特权

评论回复
8
xuannin|  楼主 | 2011-3-11 12:40 | 只看该作者
我为这过花费了很多时间,之前用过NEC,PHINIP的硬件I2C都没这么麻烦过

使用特权

评论回复
9
xuannin|  楼主 | 2011-3-11 12:41 | 只看该作者
本帖最后由 xuannin 于 2011-3-11 12:44 编辑

7楼,只能说明你是神人!量产几百K?量真的很大啊!

使用特权

评论回复
10
ST_ARM| | 2011-3-11 12:42 | 只看该作者
我不是神人,我是ST得FAE。

使用特权

评论回复
11
香水城| | 2011-3-11 12:42 | 只看该作者
1)STM8和STM32是有BUG,ST的勘误手册给出了回避的方法,参考手册也有说明。

2)I2C死掉时,如果是从设备(如你的收音机芯片)出现问题,则复位MCU是不能恢复的。

3)为了不让你为此小事与人拼命而因此丧命,我就不告诉你是谁在做项目了,:lol

使用特权

评论回复
12
xuannin|  楼主 | 2011-3-11 12:47 | 只看该作者
本帖最后由 xuannin 于 2011-3-11 12:56 编辑

看样子,我们必须得每天去关注ST的勘误手册是否有更新了,不过不知道我的老板是否同意。香工还是个厚道人!不过不知道ST有没有考虑过我们写软件的?我不是搞到伤心处,谁会去拿命拼?

使用特权

评论回复
13
xuannin|  楼主 | 2011-3-11 12:59 | 只看该作者
问题不搞懂,心不甘啊,ST_ARM能把你写的给我试试行不?359613524@qq.com

使用特权

评论回复
14
shizaigaole| | 2011-3-11 14:11 | 只看该作者
//以下先把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);

使用特权

评论回复
15
xsgy123| | 2011-3-11 16:18 | 只看该作者
楼主哪能动不动就拼命:lol

使用特权

评论回复
16
香水城| | 2011-3-11 16:57 | 只看该作者
7楼,只能说明你是神人!量产几百K?量真的很大啊!
xuannin 发表于 2011-3-11 12:41


可以是每个月量产几百K呀,看看这个帖:【以STM32为核心】神奇?! 索尼PS3体感控制器拆解篇

上面那个MEMS就是通过I2C与STM32连接的。

使用特权

评论回复
17
McuPlayer| | 2011-3-11 22:19 | 只看该作者
我一直在用硬件的I2C,几个产品了,暂时没受影响

使用特权

评论回复
18
炊烟袅袅| | 2011-3-11 22:31 | 只看该作者
如果你的I2C只是用来做主机的话,可以将那2个IO口设置成通用IO,然后模拟I2C时序就行了,硬件不用改,代码复杂度和原来差别不大。保证不会死锁!

使用特权

评论回复
19
eydj2008| | 2011-3-12 08:16 | 只看该作者
反正ST给的例子,是不能照搬过来用,一用肯定是死机。你要拼命就拼命吧 呵呵
看里面那么多的WIHLE 不要命才怪了! 一有出错 就WIHLE

使用特权

评论回复
20
eydj2008| | 2011-3-12 08:18 | 只看该作者
给你说 一就是一横   二就是二横  三就是三横  四就不用学了四横罢 呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

174

帖子

3

粉丝