OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3937|回复: 8

硬件I2C总线Busy修复代码分享

[复制链接]

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-8-25
在线时间
33 小时
发表于 2018-9-29 14:49:28 | 显示全部楼层 |阅读模式
本帖最后由 LevenC 于 2018-9-29 18:17 编辑

[mw_shl_code=c,true]/**
  * SPDX-License-Identifier: MIT
  * @brief  修复I2C总线,将I2C总线从BUSY状态转换到空闲状态
  * @param  None.
  * @retval None.
  */
static void i2c_busy_to_idle(I2C_TypeDef* I2Cx)
{
    I2C_GPIO_INIT(GPIOB, I2C_OUT_OD);    /* 通用开漏输出 */
    I2C_CSL_SET();          /* I2C SCL = 1 */

    i2c_timeout = I2C_LONG_TIMEOUT;
    /* 检测I2C SDA为高电平 */
    while((!GPIO_ReadOutputDataBit(GPIOB, I2C_PIN_SDA)) && (i2c_timeout != 0)) {
        I2C_CSL_RESET();     /* I2C SCL = 0 */
        delay_us(10);        /* 10us delye */
        I2C_CSL_SET();       /* I2C SCL = 1 */
        delay_us(10);        /* 10us delye */
        /* 修复总线超时处理 */
        if((--i2c_timeout) == 0) {
            i2c_timeout_callback(err_i2c_busy_to_idle);
        }
    }
    I2C_SDA_RESET();         /* I2C SDA = 0 */
    I2C_GPIO_INIT(GPIOB, I2C_AF_OD);        /* 复用开漏输出 */

    I2C_SoftwareResetCmd(I2Cx, ENABLE);     /* 开启对I2C进行软件复位 */
    I2C_SoftwareResetCmd(I2Cx, DISABLE);    /* 停止对I2C进行软件复位 */
}[/mw_shl_code]

修过过程跟踪

修过过程跟踪

I2C 接口进入 Busy 状态不能退出.pdf

118.83 KB, 下载次数: 75

I2C 接口进入 Busy 状态不能退出.pdf

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

346

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3657
金钱
3657
注册时间
2016-2-21
在线时间
542 小时
发表于 2018-9-29 17:14:35 | 显示全部楼层
挺有参考价值,前排赞一下
回复 支持 反对

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2018-9-29 19:01:51 | 显示全部楼层
本帖最后由 sf116 于 2018-9-29 19:03 编辑

这个到底谁是原创? QQ截图20180929190255.jpg QQ截图20180929190301.jpg
签名必须手写!
回复 支持 反对

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-8-25
在线时间
33 小时
 楼主| 发表于 2018-9-29 19:12:58 | 显示全部楼层
本帖最后由 LevenC 于 2018-9-29 19:27 编辑
sf116 发表于 2018-9-29 19:01
这个到底谁是原创?

谁是原创我就不知道了,在网上找了好久,只找到这么一份有关busy的文档,我也是根据文档写的这点代码。不过我也实际测试了,很有效。如果你认为有侵权的嫌疑,我可以删帖的哈。。。不过话说回来,侵权也应该找ST,不能找我哈
回复 支持 反对

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2018-9-29 20:02:43 | 显示全部楼层
LevenC 发表于 2018-9-29 19:12
谁是原创我就不知道了,在网上找了好久,只找到这么一份有关busy的文档,我也是根据文档写的这点代码。不 ...

哈哈,大兄弟,想多了。
我的硬件I2C并没有死在Busy,而是在判断其他状态上,原因是其他中断频繁打断导致,死结。
目前先关全局中断
签名必须手写!
回复 支持 反对

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-8-25
在线时间
33 小时
 楼主| 发表于 2018-9-30 10:04:24 | 显示全部楼层
sf116 发表于 2018-9-29 20:02
哈哈,大兄弟,想多了。
我的硬件I2C并没有死在Busy,而是在判断其他状态上,原因是其他中断频繁打断导 ...

如果将I2C中断优先级设置为最高,ST公司也是这么建议的,这样应该有效吧
回复 支持 反对

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2018-9-30 11:22:54 | 显示全部楼层
LevenC 发表于 2018-9-30 10:04
如果将I2C中断优先级设置为最高,ST公司也是这么建议的,这样应该有效吧

没用中断方式,不过可以试下
签名必须手写!
回复 支持 反对

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-8-25
在线时间
33 小时
 楼主| 发表于 2018-9-30 19:08:08 | 显示全部楼层
开启事件、错误中断后,程序会变得有些复杂,我只开启错误中断,事件依然采用轮询。
回复 支持 反对

使用道具 举报

3

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-8-25
在线时间
33 小时
 楼主| 发表于 2018-9-30 19:08:57 | 显示全部楼层
sf116 发表于 2018-9-30 11:22
没用中断方式,不过可以试下


开启事件、错误中断后,程序会变得有些复杂,我只开启错误中断,事件依然采用轮询。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 07:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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