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);
    }
    
    
}

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 I2C从机模式中断处理参考指南

发表评论