[英]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
中的“超時”。
因此:
HAL_I2C_Master_Transmit(&hi2c2, 0x60, buffer, 2, HAL_MAX_DELAY);
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.