STM32 i2c通讯失败复位方法

最近在调研STM32 F10X,准备把公司AVR的MCU项目迁移到STM32上。在调研STM32 i2c这一部分时,在与i2c slave硬件连接断开后,这时再去读/写 i2c slave需要STM32这边的i2c_read/write函数做一些处理。

刚开始在i2c读写timeout后,添加了如下代码:

1
2
3
I2C_AcknowledgeConfig(I2C1, DISABLE);       
/*!< Send STOP Condition */
I2C_GenerateSTOP(I2C1, ENABLE);

 再把i2c slave连接起来,进行i2c read/write时,发现一直卡在下面两个位置:

1
I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)

 或者

1
I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)

 也就是说i2c slave再连接起来后,i2c总线会一直busy或者start信号发出后没有反应,此方案行不通。

 

在浏览stm32f10x_i2c.c库时,看到了有void I2C_DeInit(I2C_TypeDef* I2Cx)函数,在i2c读写timeout后,添加:

1
2
I2C_DeInit(I2C1);
I2c_Configuration();

 问题就解决了。

I2c_Configuration()函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
void I2c_Configuration(void)
{
    I2C_InitTypeDef  I2C_InitStructure;
     
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = 100000;
    I2C_Init(I2C1, &I2C_InitStructure);
     
    I2C_Cmd(I2C1, ENABLE); 
}

 

posted @   闹闹爸爸  阅读(3269)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示