[STM32L4] I2C1 在 DMA 模式下无法连续读取数据

[复制链接]
130|9
zhouyou99 发表于 2025-10-23 22:41 | 显示全部楼层 |阅读模式
STM32L431 的I2C1 在 DMA 模式下无法连续读取数据。
我在用 I2C 在后台通过 DMA从传感器读取数据。以下是 CubeMX 中的 I2C DMA 设置。
7260868fa3e58957bf.png

问题是,在调试窗口中显示了一个冻结的测量值,尽管在阻塞模式下测量值一直在变化。
void QMC7983_read_temp (void){
        uint8_t status_flag = 0xFF;
        uint8_t raw_temp_data[2];
        HAL_I2C_Mem_Read_DMA (&hi2c1, QMC7983_ADDR,STATUS_REG_1,1, &status_flag, 1);
        if((status_flag & 1U>>0)!=1)
                while(1){}
        HAL_I2C_Mem_Read_DMA (&hi2c1, QMC7983_ADDR,TOUT_LSB_REG,1,raw_temp_data, 2);
        temp_meas = (int16_t)(raw_temp_data[1]<<8 |raw_temp_data[0])/100.0;
}


int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_TIM1_Init();
  MX_I2C1_Init();
  MX_ADC1_Init();
  QMC7983_config();
  HAL_Delay(100);
  QMC7983_read_temp ();
  while (1)
  {
  }
}

又见江南雨 发表于 2025-10-24 10:00 | 显示全部楼层
I2C与DMA的协作可能存在时序或配置问题,导致DMA无法正确响应I2C的数据请求。
豌豆爹 发表于 2025-10-24 11:00 | 显示全部楼层
DMA请求可能未正确触发,或I2C未正确发送DMA请求信号。
麻花油条 发表于 2025-10-24 12:11 | 显示全部楼层
I2C从机锁死引起的?
甜心puppy 发表于 2025-10-24 13:01 | 显示全部楼层
DMA的源端和目的端数据宽度可能配置不一致,导致数据传输错误。
又见江南雨 发表于 2025-10-24 14:22 | 显示全部楼层
DMA的传输方向可能配置错误
茉璃夏 发表于 2025-10-24 16:02 | 显示全部楼层
DMA的传输计数器或地址自增设置可能不正确,导致无法连续读取数据。
没有太阳的晴天 发表于 2025-10-24 17:03 | 显示全部楼层
I2C从设备地址可能配置错误
进入猫次元 发表于 2025-10-24 19:45 | 显示全部楼层
如果发现DATAPIN持续被拉高,说明I2C总线可能被锁死,此时应调用I2C重置函数来恢复通信。
classroom 发表于 2025-10-24 20:04 | 显示全部楼层
检查DMA的传输方向是否正确配置。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

59

主题

59

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部