STM32 i2c从机模式中断处理参考

void I2C1_IRQHandler(void)
{
  /* USER CODE BEGIN I2C1_IRQn 0 */
    extern void i2c1_irq(I2C_HandleTypeDef *hi2c);
    i2c1_irq(&hi2c1);
    return ;
  /* USER CODE END I2C1_IRQn 0 */
  if (hi2c1.Instance->ISR & (I2C_FLAG_BERR | I2C_FLAG_ARLO | I2C_FLAG_OVR)) {
    HAL_I2C_ER_IRQHandler(&hi2c1);
  } else {
    HAL_I2C_EV_IRQHandler(&hi2c1);
  }
  /* USER CODE BEGIN I2C1_IRQn 1 */

  /* USER CODE END I2C1_IRQn 1 */
}

void i2c1_irq(I2C_HandleTypeDef *hi2c)
{
    uint32_t ITFlags   = READ_REG(hi2c->Instance->ISR);
    uint32_t ITSources = READ_REG(hi2c->Instance->CR1);
    
    
  if (((ITFlags & I2C_FLAG_ADDR) != RESET) )
  {
      i2c_sta.rx_index=0;
      i2c_sta.tx_index=0;
      if((ITFlags&I2C_ISR_DIR)!=0)
      {
          hi2c1.Instance->ISR |= I2C_ISR_TXE;
          i2c_sta.pec=Pectable[0^I2C_SLAVE_ADD];
      }
      __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ADDR);
  }
 
    if (((ITFlags & I2C_FLAG_RXNE) != RESET) )
    {
        i2c_sta.rx_flag=1;
        i2c_sta.rx_buff[i2c_sta.rx_index] = hi2c->Instance->RXDR;
        if(i2c_sta.rx_index< I2C_BUFF_LEN-1)
           i2c_sta.rx_index++;
  }
    
 
  if (((ITFlags & I2C_FLAG_TXIS) != RESET) )
  {
        if(i2c_sta.tx_index<i2c_sta.tx_len)
        {
            hi2c->Instance->TXDR = i2c_sta.tx_buff[i2c_sta.tx_index];
            i2c_sta.pec=Pectable[i2c_sta.pec^i2c_sta.tx_buff[i2c_sta.tx_index]];

            if(i2c_sta.tx_index< I2C_BUFF_LEN-1)
            i2c_sta.tx_index++;
        }
        else
            hi2c->Instance->TXDR = i2c_sta.pec;      
          
  }
  if (((ITFlags & I2C_FLAG_STOPF) != RESET) )
  {
        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_STOPF);
      i2c_sta.stop=1;
  }
 
    if (((ITFlags & I2C_FLAG_AF) != RESET) )
    {

        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_AF);
    }
    
    if (hi2c1.Instance->ISR & (I2C_FLAG_BERR )) {
        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_BERR);
    }
    
    if (hi2c1.Instance->ISR & ( I2C_FLAG_ARLO )) {
        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_ARLO);
    }
    
    if (hi2c1.Instance->ISR & (I2C_FLAG_OVR)) {
        __HAL_I2C_CLEAR_FLAG(hi2c, I2C_FLAG_OVR);
    }
    
    
}

相关推荐

  1. STM32 i2c模式中断处理参考

    2024-01-13 08:06:04       48 阅读
  2. <span style='color:red;'>STM</span><span style='color:red;'>32</span> <span style='color:red;'>I</span><span style='color:red;'>2</span><span style='color:red;'>C</span>

    STM32 I2C

    2024-01-13 08:06:04      49 阅读
  3. STM32 Bit-Bang I2C

    2024-01-13 08:06:04       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 08:06:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 08:06:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 08:06:04       82 阅读
  4. Python语言-面向对象

    2024-01-13 08:06:04       91 阅读

热门阅读

  1. 9个Linux网络命令

    2024-01-13 08:06:04       53 阅读
  2. 基本数据结构 | 并查集

    2024-01-13 08:06:04       64 阅读
  3. Docker-Compose编排Nginx1.25.1+PHP7.4.33+Redis7.0.11环境

    2024-01-13 08:06:04       39 阅读
  4. Redis学习指南(3)-Redis的应用领域

    2024-01-13 08:06:04       63 阅读
  5. Jupyter Markdown格式

    2024-01-13 08:06:04       59 阅读
  6. Github Copilot 的使用方法和快捷键

    2024-01-13 08:06:04       64 阅读
  7. 基于 AWS Lambda 的 SaaS 应用教程

    2024-01-13 08:06:04       60 阅读
  8. AWS认证SAA-C03每日一题

    2024-01-13 08:06:04       53 阅读
  9. 如何使用Python的交互控制台

    2024-01-13 08:06:04       53 阅读