请选择 进入手机版 | 继续访问电脑版
搜索
查看: 3606|回复: 7

[分享] 【ST MCU实战经验】I2C 接口进入 Busy 状态不能退出

[复制链接]

7

主题

24

帖子

0

精华

Rank: 2

初级会员

注册时间
2012-6-28
发表于 2014-6-6 16:59:37 | 显示全部楼层 |阅读模式
 该问题由某客户提出,发生在 STM32F103VDT6 器件上。据其工程师讲述:在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32 反复做复位操作,会很容易复现这一现象。
 
问题详细描述以及ST官方解答见文档: I2C 接口进入 Busy 状态不能退出.pdf (118.83 KB, 下载次数: 374)
欢迎加入STM32/STM8社区技术交流群: 313887143    STM32Lxx开发群:571793578
回复

使用道具 举报

2

主题

18

帖子

0

精华

Rank: 2

初级会员

注册时间
2013-2-7
发表于 2014-6-6 17:25:58 | 显示全部楼层

RE:【ST MCU实战经验】I2C 接口进入 Busy 状态不能退出

大哥对I2C熟悉吗?
有个问题请教下。
回复 支持 反对

使用道具 举报

59

主题

2700

帖子

0

精华

Rank: 6Rank: 6

金牌会员

注册时间
2010-4-9
发表于 2015-3-20 14:08:54 | 显示全部楼层
学习。。。。。。。。。。。。。
欢迎加入STM32/STM8社区技术交流群: 313887143    STM32Lxx开发群:571793578
回复

使用道具 举报

0

主题

16

帖子

0

精华

Rank: 2

初级会员

注册时间
2014-6-14
发表于 2015-9-6 16:03:24 | 显示全部楼层
学习一下,以前一直用软件模拟
回复 支持 反对

使用道具 举报

9

主题

107

帖子

0

精华

Rank: 3Rank: 3

中级会员

注册时间
2009-6-16
发表于 2016-1-14 09:20:43 | 显示全部楼层
这个问题是存在的用cube库时
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(hi2c->Instance==I2C1)
  {
  /* USER CODE BEGIN I2C1_MspInit 0 */

  /* USER CODE END I2C1_MspInit 0 */
  
    /**I2C1 GPIO Configuration   
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* Peripheral clock enable */
    __I2C1_CLK_ENABLE();

    /* Peripheral interrupt init*/
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
  /* USER CODE BEGIN I2C1_MspInit 1 */
  /* USER CODE END I2C1_MspInit 1 */
  }
}
这时总会处现在发送时就停在了busy这个位置,sda一直为低,后来看用以前的库写的
__I2C1_CLK_ENABLE();是在GPIO设置之前,将它改到之前后就可以发送数据了,但是发现改后如再次用CUBE生成代码,它又回到了以前地方,因此再加个软复位来解决
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(hi2c->Instance==I2C1)
  {
  /* USER CODE BEGIN I2C1_MspInit 0 */

  /* USER CODE END I2C1_MspInit 0 */
  
    /**I2C1 GPIO Configuration   
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    /* Peripheral clock enable */
    __I2C1_CLK_ENABLE();

    /* Peripheral interrupt init*/
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
    HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
  /* USER CODE BEGIN I2C1_MspInit 1 */
  SET_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);
  CLEAR_BIT(hi2c->Instance->CR1, I2C_CR1_SWRST);

  /* USER CODE END I2C1_MspInit 1 */
  }
}
欢迎加入STM32/STM8社区技术交流群: 313887143    STM32Lxx开发群:571793578
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

Rank: 2

初级会员

注册时间
2007-7-2
发表于 2016-6-8 23:49:43 | 显示全部楼层
谢谢楼上,一直卡在这儿,终于能读写24C02了
回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

Rank: 2

初级会员

注册时间
2012-12-12
发表于 2016-8-8 17:02:46 | 显示全部楼层
支持一下。。。。。。
欢迎加入STM32/STM8社区技术交流群: 313887143    STM32Lxx开发群:571793578
回复

使用道具 举报

0

主题

10

帖子

0

精华

Rank: 2

初级会员

注册时间
2014-11-21
发表于 2016-11-25 15:11:25 | 显示全部楼层
szgaos 发表于 2016-1-14 09:20
这个问题是存在的用cube库时
void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)
{

这样真的好了吗?参考一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|意法半导体STM32/STM8技术社区    

GMT+8, 2017-4-27 17:15 , Processed in 0.135876 second(s), 14 queries , Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表