STM32的I2C

[复制链接]
7239|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模式?
 楼主| jtingwang 发表于 2008-6-2 08:48 | 显示全部楼层

加了上拉

加了上拉,器件是AT24C256,IO配置为了AF_OD模式
香水城 发表于 2008-6-2 09:54 | 显示全部楼层

初始化的代码?

 楼主| 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”

jackbao 发表于 2008-6-2 14:01 | 显示全部楼层

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

香水城 发表于 2008-6-2 18:26 | 显示全部楼层

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

这是一个操作I2C EEPROM的例子。
speed_2008 发表于 2008-6-3 09:11 | 显示全部楼层

碰到过同样问题,无解

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

已参考Example5

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

本来就参考了Example5

昨天又试了一下,初始化I2C2会有这个问题,但是初始化I2C1没有这个问题。但是由于目前我们板上的I2C1的端口用做其他用途,没有割断走线去试I2C1
香水城 发表于 2008-6-3 10:36 | 显示全部楼层

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

改一下试试。
 楼主| jtingwang 发表于 2008-6-16 11:37 | 显示全部楼层

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

程序单步运行,读写都OK,一旦全速运行就不OK了
以前有高手讨论过该问题,但是现在好像搜索不到以前的帖子了...
香水城 发表于 2008-6-16 11:51 | 显示全部楼层

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

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

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

不OK是什么意思?什么时候有问题?
John_light 发表于 2008-6-16 11:54 | 显示全部楼层

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

 楼主| jtingwang 发表于 2008-6-16 17:49 | 显示全部楼层

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

对eeprom读写完一个数据包之后,加20us左右的延时,就可以连续读或写了
tangxiujuan 发表于 2013-5-6 11:57 | 显示全部楼层
jtingwang 发表于 2008-6-16 11:37
程序单步运行,读写都OK,一旦全速运行就不OK了以前有高手讨论过该问题,但是现在好像搜索不到以前的帖子了 ...

神马意思啊?我也是这样的问题,怎么ok的啊?换i2c1了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

171

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部