打印

STM32的I2C

[复制链接]
5734|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jtingwang|  楼主 | 2008-6-1 22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32的I2C的状态寄存器SR2总是提示“总线忙”,SR2的bit1总是为“1”,是怎么回事呢?
端口时钟、I2C时钟都打开了;端口配置为AF+OD输出;SDA和SCL端口初始化为高电平
沙发
香水城| | 2008-6-2 08:20 | 只看该作者

做过什么操作?

使用特权

评论回复
板凳
jtingwang|  楼主 | 2008-6-2 08:24 | 只看该作者

还没有进行什么操作

还没有进行什么操作,在这些初始化后,设置了一个断点,就发现SR2的寄存器的bit1被置1了。

使用特权

评论回复
地板
香水城| | 2008-6-2 08:27 | 只看该作者

加外部上拉了吗?什么外部I2C器件?

对应的I/0口是否配置成AF_OD模式?

使用特权

评论回复
5
jtingwang|  楼主 | 2008-6-2 08:48 | 只看该作者

加了上拉

加了上拉,器件是AT24C256,IO配置为了AF_OD模式

使用特权

评论回复
6
香水城| | 2008-6-2 09:54 | 只看该作者

初始化的代码?

使用特权

评论回复
7
jtingwang|  楼主 | 2008-6-2 10:18 | 只看该作者

代码

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  /* I2C2 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
  
  /* Configure I2C2 pins: SCL and SDA */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  I2C_Cmd(I2C2, ENABLE);

  /* Apply I2C configuration after enabling it */
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0xA0;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 400000;  /* 100000也不行,PCLK1为18000000Hz */

  I2C_Init(I2C2, &I2C_InitStructure);

这里设置断点,SR2的bit1为“1”

使用特权

评论回复
8
jackbao| | 2008-6-2 14:01 | 只看该作者

你在配置以前 先初始化一下 看看

使用特权

评论回复
9
香水城| | 2008-6-2 18:26 | 只看该作者

请参考ST提供的例子:I2C/Example5

这是一个操作I2C EEPROM的例子。

使用特权

评论回复
10
speed_2008| | 2008-6-3 09:11 | 只看该作者

碰到过同样问题,无解

   前段时间参考I2C/Example5,在103C8T6芯片上操作AT24C02芯片,用硬件I2C接口库函数,经常发现死机现象,一直无法解决,最后只好改用模拟I2C。
   个人认为ST提供的I2C操作库函数,很多地方采用死等状态的方式可能有问题,容易导致死在I2C程序中

使用特权

评论回复
11
jtingwang|  楼主 | 2008-6-3 10:17 | 只看该作者

已参考Example5

之前一直用模拟I2C,后来想用硬件I2C。

本来就参考了Example5

昨天又试了一下,初始化I2C2会有这个问题,但是初始化I2C1没有这个问题。但是由于目前我们板上的I2C1的端口用做其他用途,没有割断走线去试I2C1

使用特权

评论回复
12
香水城| | 2008-6-3 10:36 | 只看该作者

例子中是在初始化之后使能相应模块,而你是在初始化之前

改一下试试。

使用特权

评论回复
13
jtingwang|  楼主 | 2008-6-16 11:37 | 只看该作者

单步运行OK,全速运行不OK

程序单步运行,读写都OK,一旦全速运行就不OK了
以前有高手讨论过该问题,但是现在好像搜索不到以前的帖子了...

使用特权

评论回复
14
香水城| | 2008-6-16 11:51 | 只看该作者

OK是什么意思?不OK是什么意思?

你的读写流程是什么?读几个字节?写几个字节?

OK是什么意思?操作多少字节?

不OK是什么意思?什么时候有问题?

使用特权

评论回复
15
John_light| | 2008-6-16 11:54 | 只看该作者

难道是传说中的速度问题?

使用特权

评论回复
16
jtingwang|  楼主 | 2008-6-16 17:49 | 只看该作者

应该是外设响应速度跟不上

对eeprom读写完一个数据包之后,加20us左右的延时,就可以连续读或写了

使用特权

评论回复
17
tangxiujuan| | 2013-5-6 11:57 | 只看该作者
jtingwang 发表于 2008-6-16 11:37
程序单步运行,读写都OK,一旦全速运行就不OK了以前有高手讨论过该问题,但是现在好像搜索不到以前的帖子了 ...

神马意思啊?我也是这样的问题,怎么ok的啊?换i2c1了?

使用特权

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

本版积分规则

67

主题

171

帖子

1

粉丝