STM32F0 HAL库 I2C 从机配置

参考链接: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 */
}
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值