首页 > 解决方案 > HAL i2c 驱动程序总是返回忙碌状态

问题描述

我在 STM32L412 上使用 HAL_I2C_Master_Transmit_DMA 驱动程序。我正在向外部 4 通道 I2C DAC 传输 8 个字节的数据——总线上只有一个设备。通过在 i2c 总线上使用示波器确认驱动程序的第一次使用工作正常,DAC 更新并且存在停止条件。从那时起,驱动程序总是返回忙碌状态——特别是在驱动程序使用 HAL_DMA_Start_IT 的时候。没有设置忙标志,似乎第一次使用后状态永远不会重置

我读过其他人在使用 I2C HAL 驱动程序时提到了相同(或非常相似)的问题,有解决办法吗?

dma 设置 -

static void MX_DMA_Init(void) 
{

 /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

/* DMA interrupt init */
/* DMA1_Channel4_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);

}

i2c 设置 -

static void MX_I2C2_Init(void)
{
hi2c2.Instance = I2C2;
hi2c2.Init.Timing = 0x00610611;
hi2c2.Init.OwnAddress1 = 192;
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();
}
}

标签: embeddedstm32hal

解决方案


推荐阅读