stm32i2c错误中断处理
在STM32的I2C通信中,错误中断处理是保证通信可靠性的关键。以下是处理I2C错误中断的核心步骤和注意事项:
1. 常见I2C错误类型
- 总线错误 (BERR): 检测到非法起始/停止条件
- 仲裁丢失 (ARLO): 多主竞争中失去总线控制权
- ACK故障 (AF): 从设备未返回应答信号
- 过载/下溢 (OVR)UNDERRUN): 数据寄存器未及时处理
- 超时错误 (TIMEOUT): SCL持续拉低超过设定时间(部分型号支持)
2. 配置错误中断
启用错误中断并设置优先级:
// 启用错误中断
I2C_ITConfig(I2Cx, I2C_IT_ERR, ENABLE);
// 设置NVIC优先级
NVIC_InitTypeDef NVIC_InitStruct = {
.NVIC_IRQChannel = I2Cx_ER_IRQn, // 例如I2C1_ER_IRQn
.NVIC_IRQChannelPreemptionPriority = 1,
.NVIC_IRQChannelSubPriority = 0,
.NVIC_IRQChannelCmd = ENABLE
};
NVIC_Init(&NVIC_InitStruct);
3. 中断服务函数 (ISR) 处理流程
void I2C1_ER_IRQHandler(void) {
// 检测错误标志
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_BERR)) {
// 总线错误处理
I2C_ClearFlag(I2C1, I2C_FLAG_BERR);
// 可能需要重新初始化I2C
}
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_ARLO)) {
// 仲裁丢失处理
I2C_ClearFlag(I2C1, I2C_FLAG_ARLO);
I2C_GenerateSTOP(I2C1, ENABLE); // 发送STOP信号
}
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_AF)) {
// ACK失败处理
I2C_ClearFlag(I2C1, I2C_FLAG_AF);
I2C_GenerateSTOP(I2C1, ENABLE); // 终止当前传输
}
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_OVR)) {
// 过载/下溢处理
I2C_ClearFlag(I2C1, I2C_FLAG_OVR);
}
// 其他错误处理...
}
4. 错误恢复策略
- 硬件复位: 调用
I2C_SoftwareResetCmd(I2Cx, ENABLE)重置I2C外设 - 重新初始化: 重新配置I2C参数(时钟、地址等)
- GPIO检查: 确认SCL/SDA引脚未锁存,必要时重新配置GPIO模式
- 通信重试: 在软件层面实现重试计数器(例如最多3次重试)
5. 关键注意事项
- 标志清除顺序: 必须先读取
SR1和SR2寄存器后再清除标志 - 超时保护: 在中断中增加超时计数器,避免死循环
- 状态机设计: 建议结合状态机管理I2C通信流程
- 调试工具: 使用逻辑分析仪或STM32的I2C调试模式(SWV)定位问题
示例:典型恢复流程
void I2C_Recover(I2C_TypeDef* I2Cx) {
// 1. 强制释放总线
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT_OD;
GPIO_InitStruct.GPIO_Pin = SCL_PIN | SDA_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(I2C_GPIO_PORT, &GPIO_InitStruct);
// 2. 手动发送时钟脉冲恢复总线
for (int i = 0; i < 10; i++) {
GPIO_SetBits(I2C_GPIO_PORT, SCL_PIN);
DelayUs(10);
GPIO_ResetBits(I2C_GPIO_PORT, SCL_PIN);
DelayUs(10);
}
// 3. 重新初始化I2C
I2C_DeInit(I2Cx);
I2C_Init(I2Cx, &I2C_InitStruct); // 复用初始配置
I2C_Cmd(I2Cx, ENABLE);
}
通过合理处理错误中断,可显著提高I2C通信的健壮性。建议结合具体应用场景设计错误恢复策略。
stm32中断怎么处理的
STM32是一款非常强大的微控制器系列,具有丰富的外设和功能。中断是STM32中非常重要的部分,能够帮助我们提高系统的响应速度和效率。本文将详细
2024-01-02 17:35:10
STM32F 单片机硬件I2C Busy标志导致的I2C卡死的处理办法
STM32F 单片机硬件I2C Busy标志导致的I2C卡死的处理办法在
资料下载
安德森大
2021-12-28 19:24:53
STM32F103硬件I2C Slave
MCU:STM32F103IDE:STM32CubeIDEHAL库硬件I2C当作Slave,模拟EEPROM行为测试工具:树莓派为
资料下载
goodmbby
2021-12-20 19:38:54
STM32的CAN收发数据死在硬件错误中断
STM32的CAN收发数据死在硬件错误中断使用uCosIII的消息队列,当CAN接收到数据,使用消息队列给CAN数据
资料下载
刘洋
2021-12-09 09:36:05
STM32作为I2C从机中断接收和从模式中断应答数据总结
之前在项目中用到了STM32F103的i2c功能,大致功能是两个单片机进行i2c通信,而且通信模式是主问从答模式。这里我研究了一下
资料下载
远不及你
2021-12-02 19:21:32
I2C debug出现问题怎么解决
_transfer 返回值为 -6? 返回值为 -6 表示为 NACK 错误,即对方设备无应答响应,这种情况一般为外设的问题,常见的有以下几种情况: I2C 地址
2023-07-22 15:00:27
【原创分享】STM32学习笔记|I2C详解
地址查找从机I2C通常用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。很多外围器件采用I2C通讯接口访问。STM32I2C
STM32 I2C硬件的结构
我们可以看见STM32的硬件I2C有两个和数据有关的寄存器“数据寄存器(Data register)”(DR)和“数据移位寄存器(Data shift register)”(DSR),我们的软件写入的是DR, DSR
2020-04-30 15:00:29
换一换
- 如何分清usb-c和type-c的区别
- 中国芯片现状怎样?芯片发展分析
- vga接口接线图及vga接口定义
- 芯片的工作原理是什么?
- 华为harmonyos是什么意思,看懂鸿蒙OS系统!
- 什么是蓝牙?它的主要作用是什么?
- ssd是什么意思
- 汽车电子包含哪些领域?
- TWS蓝牙耳机是什么意思?你真的了解吗
- 什么是单片机?有什么用?
- 升压电路图汇总解析
- plc的工作原理是什么?
- 再次免费公开一肖一吗
- 充电桩一般是如何收费的?有哪些收费标准?
- ADC是什么?高精度ADC是什么意思?
- dtmb信号覆盖城市查询
- EDA是什么?有什么作用?
- 中科院研发成功2nm光刻机
- 苹果手机哪几个支持无线充电的?
- type-c四根线接法图解
- 华为芯片为什么受制于美国?
- 怎样挑选路由器?
- 元宇宙概念股龙头一览
- 锂电池和铅酸电池哪个好?
- 如何进行编码器的正确接线?接线方法介绍
- 什么是场效应管?它的作用是什么?
- 虚短与虚断的概念介绍及区别
- 晶振的作用是什么?
- 大疆无人机的价格贵吗?大约在什么价位?
- amoled屏幕和oled区别
- 苹果nfc功能怎么复制门禁卡
- 单片机和嵌入式的区别是什么
- 复位电路的原理及作用
- BLDC电机技术分析
- dsp是什么意思?有什么作用?
- 苹果无线充电器怎么使用?
- iphone13promax电池容量是多少毫安
- 芯片的组成材料有什么
- 特斯拉充电桩充电是如何收费的?收费标准是什么?
- 直流电机驱动电路及原理图
- 传感器常见类型有哪些?
- 自举电路图
- 苹果笔记本macbookpro18款与19款区别
- 通讯隔离作用
- 新斯的指纹芯片供哪些客户
- 伺服电机是如何进行工作的?它的原理是什么?
- 无人机价钱多少?为什么说无人机烧钱?
- 以太网VPN技术概述
- 手机nfc功能打开好还是关闭好
- 十大公认音质好的无线蓝牙耳机