STM32/STM8技术william hill官网
直播中

鲁瑶

7年用户 186经验值
私信 关注
[问答]

请问I2C的ISR Busy bit什么时候会被设为1?

请问一下I2C的ISR Busy bit什么时候会被设为1, 什么时候会被设为0
会被设为1之后, 就一直没有被设为0的情况是什么??


Thanks

回帖(9)

张佳婧

2019-5-22 11:26:03
HAL_I2C_MspInit()
{
  __HAL_RCC_I2C1_CLK_ENABLE();
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

這個方法你先試試看
先開啟I2C Clock
在設定IO
举报

鲁瑶

2019-5-22 11:40:22
引用: gaozhipeng_lv 发表于 2019-5-22 11:26
HAL_I2C_MspInit()
{
  __HAL_RCC_I2C1_CLK_ENABLE();

请问一下为什么要先call __HAL_RCC_I2C1_CLK_ENABLE(),
接着再去call HAL_GPIO_Init(GPIOB, &GPIO_InitStruct)?

这和原来Cube自动产生的顺序相反,这个影响到什么?
举报

张佳婧

2019-5-22 11:55:37
我一開始也是會遇到I2C init完之後就遇到busy了,所以我才對調的
举报

鲁瑶

2019-5-22 12:02:34
引用: gaozhipeng_lv 发表于 2019-5-22 11:55
我一開始也是會遇到I2C init完之後就遇到busy了,所以我才對調的

I2C init完之后就遇到busy了
==>是指还没要去读取I2C就busy? 或是尝试去读取之后, timeout, 之后就一直busy?

请问一下你有遇过, 有时候, 是非100%每次(发生在开机之后)第1次去读取I2C就失败, 之后再retry, 不过retry几次后, busy bit就被设起来, 之后就busy bit一直为1

Thanks
举报

孙婷婷

2019-5-22 12:20:26
I2C busy可能发生在读取完成以后,楼主用的是硬件I2C模块,还是模拟的I2C。注意每次使用完后,一定要释放掉I2C总线。
举报

鲁瑶

2019-5-22 12:34:31
引用: TOPCB 发表于 2019-5-22 12:20
I2C busy可能发生在读取完成以后,楼主用的是硬件I2C模块,还是模拟的I2C。注意每次使用完后,一定要释放掉I2C总线。

我是用STM的HAL lib, HAL_I2C_Mem_Read()去对I2C做读取的, 如果HAL_I2C_Mem_Read() return 值不是HAL_OK, 我就要去retry, call HAL_I2C_Mem_Read()

注意每次使用完后,一定要释放掉I2C总线。
==>我要怎么做释放? 用HAL lib or 其他方式?
或着有其他的建议?
举报

孙婷婷

2019-5-22 12:50:16
库应该不用去释放,出现这种情况是在操作前,还是操作完毕后。示波器抓一下波形
举报

seasideboy

2019-5-22 14:07:31
STM32的IIC就是这样,只能在屏蔽良好的理想环境下使用,在强干扰环境下随时都会硬件出错停止响应IIC操作,官方有个针对其IIC极易出各种硬件错误的文档说明,也只是推荐了几种重新初始化IIC模块的操作建议,亲自充分测试过,没有绝对可行的解决办法,原因就在其主从自适应的灵活性和错误检测不能自动退出的低级容错性,导致其普通的主模式操作极易因信号干扰宕机,有人说新生产的批次解决了这个问题,可在淘宝上买的最常用的STM32F103新品实测并没有改善这个问题,最佳方法就是硬件上做好信号干扰屏蔽,同时避免多芯片之间IIC信号输入输出冲突,最后建议尽量不要在关键控制区域使用STM32 的IIC接口模块。
举报

Amrzs

2019-5-30 17:01:37
iic不建议用库函数,官方给的都很负责。在网上找个写好的基本不用改就能用,还不会出现问题
举报

更多回帖

发帖
×
20
完善资料,
赚取积分