登录/注册

stm32i2c错误中断处理

更多

在STM32的I2C通信中,错误中断处理是保证通信可靠性的关键。以下是处理I2C错误中断的核心步骤和注意事项:


1. 常见I2C错误类型


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. 错误恢复策略


5. 关键注意事项


示例:典型恢复流程

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 I2c硬件驱动程序不稳定该怎么解决?

stm32 I2c硬件驱动程序不稳定该怎么解决? stm32 的 I2C

2024-01-16 17:11:09

stm32中断怎么处理

STM32是一款非常强大的微控制器系列,具有丰富的外设和功能。中断是STM32中非常重要的部分,能够帮助我们提高系统的响应速度和效率。本文将详细

2024-01-02 17:35:10

I2CI3C的区别有哪些

I2C 和 I3C 主要区别如下: I2C 虽然也是两条线,但是很多时候传感器需要一条额外的

2023-07-22 16:20:20

STM32 I2C存取实验资料

STM32 I2C存取实验资料

资料下载 郑兵 2021-12-30 10:36:41

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的使用

的。其实这点可以体谅,但是,这点如果没有处理好,总线上的错误会导致STM32 I2C

2022-04-03 10:55:51

STM32 I2C从机中断模式测试

STM32 I2C从机中断模式测试可用;可在此基础上修改代码使用;一、STM32

2022-02-22 07:43:01

stm32 can错误中断处理分析

stm32 can 错误中断处理分析。

2021-08-16 07:52:51

【原创分享】STM32学习笔记|I2C详解

地址查找从机I2C通常用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。很多外围器件采用I2C通讯接口访问。STM32I2C

2021-06-18 09:27:37

STM32 I2C硬件的结构

我们可以看见STM32的硬件I2C有两个和数据有关的寄存器“数据寄存器(Data register)”(DR)和“数据移位寄存器(Data shift register)”(DSR),我们的软件写入的是DR, DSR

2020-04-30 15:00:29

STM32F10x_硬件I2C主从通信 (轮询发送,中断接收)

STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

2020-03-25 10:59:11

7天热门专题 换一换
相关标签