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

发布时间:2024年01月12日

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

文章来源:https://blog.csdn.net/qqk808/article/details/135549820
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。