参考链接:http://blog.sina.com.cn/s/blog_95cc46f40102yika.html
STM32 I2C从机中断模式测试可用;可在此基础上修改代码使用;
一、STM32CubeMX生成初始化配置函数(包含了SCL/SDA引脚配置)
/**
* @brief I2C1 Initialization Function
* @param None
* @retval None
*/
static void MX_I2C1_Init(void)
{
/* USER CODE BEGIN I2C1_Init 0 */
/* USER CODE END I2C1_Init 0 */
/* USER CODE BEGIN I2C1_Init 1 */
/* USER CODE END I2C1_Init 1 */
hi2c1.Instance = I2C1;
hi2c1.Init.Timing = 0x2000090E;
hi2c1.Init.OwnAddress1 = 0x30;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK)
{
Error_Handler();
}
/** Configure Analogue filter
*/
if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
{
Error_Handler();
}
/** Configure Digital filter
*/
if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN I2C1_Init 2 */
/* USER CODE END I2C1_Init 2 */
}
二、Main函数中调用初始化、使能I2C中断;
MX_I2C1_Init();
I2C1->CR1 |= I2C_IT_ERRI | I2C_IT_TCI | I2C_IT_STOPI | I2C_IT_NACKI | I2C_IT_ADDRI | I2C_IT_RXI | I2C_IT_TXI;
三、中断函数重写
/**
* @brief This function handles I2C1 global interrupt.
*/
uint8_t gU8I2CRxVuffer[128];
uint8_t gU8I2CTxVuffer[128];
void I2C1_IRQHandler(void)
{
/* USER CODE BEGIN I2C1_IRQn 0 */
static uint8_t Tx_count = 0, Rx_count = 0;
if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_ISR_ADDR) == SET)
{
if (I2C1->ISR & I2C_ISR_DIR)
{
Tx_count = 0;
I2C1->ISR |= I2C_ISR_TXE;
I2C1->ICR |= I2C_ICR_ADDRCF;
}
else
{
Rx_count = 0;
I2C1->ICR |= I2C_ICR_ADDRCF;
}
}
else if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_ISR_RXNE) == SET)
{
gU8I2CRxVuffer[Rx_count ++] = I2C1->RXDR;
}
else if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_ISR_TXIS) == SET)
{
I2C1->TXDR = gU8I2CTxVuffer[Tx_count ++];
}
else if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_ISR_STOPF) == SET)
{
I2C1->ICR |= I2C_ICR_STOPCF;
Tx_count = 0;
Rx_count = 0;
}
else if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_ISR_NACKF) == SET)
{
I2C1->ICR |= I2C_ICR_NACKCF;
}
else if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_ISR_ARLO) == SET)
{
I2C1->ICR |= I2C_ICR_ARLOCF;
}
else if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_ISR_BERR) == SET)
{
I2C1->ICR |= I2C_ICR_BERRCF;
}
else if (__HAL_I2C_GET_FLAG(&hi2c1, I2C_ISR_OVR) == SET)
{
I2C1->ICR |= I2C_ICR_OVRCF;
}
/* 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 */
}