STM32 - 中断模式下的 I2C 不起作用

Posted

技术标签:

【中文标题】STM32 - 中断模式下的 I2C 不起作用【英文标题】:STM32 - I2C in interrupt mode doesn't works 【发布时间】:2021-02-11 02:27:13 【问题描述】:

我正在使用 STM32 板通过中断模式向 I2C 从机发送 I2C 命令。 我已经初始化了 I2C 模块,如下所示,

  hi2c2.Instance = I2C2;
  hi2c2.Init.Timing = 0x00303D5B;
  hi2c2.Init.OwnAddress1 = 0;
  hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c2.Init.OwnAddress2 = 0;
  hi2c2.Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c2) != HAL_OK)
  
    Error_Handler();
  
  /** Configure Analogue filter
  */
  if (HAL_I2CEx_ConfigAnalogFilter(&hi2c2, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  
    Error_Handler();
  
  /** Configure Digital filter
  */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c2, 0) != HAL_OK)
  
    Error_Handler();
  

对于传输,我使用 HAL API,

HAL_I2C_Master_Transmit_IT(&hi2c2, 0x60, buffer, 2);

但这段代码似乎对我不起作用。

在缓冲区中,第一个字节是 I2C 从机上的寄存器地址,第二个字节是数据。 当我使用阻塞模式 API 时,

HAL_I2C_Master_Transmit(&hi2c2, 0x60, buffer, 2,HAL_MAX_DELAY);

它工作正常。有什么建议吗?

【问题讨论】:

不要为此使用 HAL。 @P__J__你为什么这么说? 【参考方案1】:

查看您的 HAL_I2C_MspInit 函数以及是否调用了 HAL_NVIC_SetPriority(I2C2_IRQn, 0, 0) 和 HAL_NVIC_EnableIRQ(I2C2_IRQn)。

【讨论】:

【参考方案2】:

您是否真的启用了 I2C 中断?这可能是问题所在。

【讨论】:

以上是关于STM32 - 中断模式下的 I2C 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103ZET6外部中断不起作用,不知道程序哪里错了?

STM32L031F6 LL库硬件I2C使用,中断模式

STM32L031F6 LL库硬件I2C使用,中断模式

i2c 中断处理程序 stm32

请教stm32的i2c接收问题

STM32L151 RTC闹钟中断