簡體   English   中英

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

[英]STM32 - I2C in interrupt mode doesn't works

我正在使用 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);

它工作正常。 任何建議這里可能有什么問題?

你真的啟用了 I2C 中斷嗎? 那可能是問題所在。

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

您的中斷 HAL 調用在輪詢中不起作用的原因是因為在使用中斷時,您需要先確保總線准備就緒。 您必須手動執行嵌入在輪詢 HAL 調用的HAL_MAX_DELAY中的“超時”。

因此:

  1. 輪詢實現(您正確調用):
HAL_I2C_Master_Transmit(&hi2c2, 0x60, buffer, 2, HAL_MAX_DELAY);
  1. 中斷實現:
while (HAL_I2C_GetState(&hi2c2) != HAL_I2C_STATE_READY)
{
}
HAL_I2C_Master_Transmit_IT(&hi2c2, 0x60, buffer, 2);

會做的伎倆。

這也意味着如果沒有就緒檢查,如果您以足夠低的頻率調用中斷 HAL,您的代碼可以按預期工作,因為這樣,總線在您需要時始終准備就緒。 這是一個有害的錯誤:從表面上看,您的代碼可以在沒有檢查的情況下運行……但只是偶然的(或運氣,取決於您如何稱呼它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM