[STM32F4] HAL_I2C_Master_Transmit_DMA 仅发送起始信号,且 I2C 两条线都被拉低

[复制链接]
36|18
小库里 发表于 2026-4-15 21:34 | 显示全部楼层 |阅读模式
我用 STM32F446RE与BH1750 传感器进行数据收发。当使用 HAL_I2C_Master_Transmit_DMA 函数时,控制器只会发送一个起始信号。
代码如下:
if(HAL_I2C_IsDeviceReady(&hi2c1, bh1750Address, 2, bh1750TimeOut) == HAL_OK){
    __NOP();
}
transmitBuffer[0] = 0x10; // BH1750 连续高分辨率测量模式
HAL_I2C_Master_Transmit_DMA(&hi2c1, (uint8_t) bh1750Address, (uint8_t*)transmitBuffer, 1);
但如果我使用 HAL_I2C_Master_Transmit,一切工作正常。
是不是 HAL 库存在 Bug?

公羊子丹 发表于 2026-4-16 13:38 | 显示全部楼层
我怀疑你没开启I2C对应的DMA时钟,F4系列DMA时钟必须单独使能,不然DMA根本跑不起来,只会发起始信号就卡住。
周半梅 发表于 2026-4-16 13:38 | 显示全部楼层
这问题挺常见的!你检查下DMA通道配置没,I2C1_TX对应的DMA通道和请求映射有没有配错,配错就只会发起始位。
帛灿灿 发表于 2026-4-16 13:39 | 显示全部楼层
我之前也踩过这坑,DMA模式下缓冲区必须全局或静态数组,局部变量会被销毁,数据发不出去。
童雨竹 发表于 2026-4-16 13:40 | 显示全部楼层
你可以先把DMA改成普通阻塞模式验证硬件,再回DMA查配置,快速定位软件还是硬件问题。
万图 发表于 2026-4-16 13:41 | 显示全部楼层
有没有可能DMA优先级冲突?F4的DMA和其他外设抢总线,I2C DMA发完起始就停,调低其他优先级试试。
Wordsworth 发表于 2026-4-16 13:43 | 显示全部楼层
我建议看HAL状态码,打印hi2c1.State,是BUSY还是ERROR,能直接定位问题。
Bblythe 发表于 2026-4-16 13:44 | 显示全部楼层
大概率不是HAL库Bug,F4 I2C DMA要等TC中断,检查I2C和DMA中断开启及优先级。
Pulitzer 发表于 2026-4-16 13:45 | 显示全部楼层
试试发送前清标志:__HAL_I2C_CLEAR_FLAG(AF|ARLO),清异常再发就正常。
Uriah 发表于 2026-4-16 13:46 | 显示全部楼层
我怀疑从机地址没左移,DMA对地址敏感,确认bh1750Address是否左移一位。
Clyde011 发表于 2026-4-16 13:47 | 显示全部楼层
逻辑分析仪抓波形,只发起始说明DMA没加载数据,多半内存地址配置错误。
onlycook 发表于 2026-4-16 14:55 | 显示全部楼层
或许是DMA配置有误,和I2C传输没配合好,才只发起始信号。
powerantone 发表于 2026-4-16 15:55 | 显示全部楼层
检查DMA的传输方向、数据宽度等参数设置是否正确呀。
probedog 发表于 2026-4-16 14:56 | 显示全部楼层
说不定是DMA通道冲突,导致传输无法正常进行下去。
stormwind123 发表于 2026-4-16 14:56 | 显示全部楼层
看看I2C的DMA请求使能有没有正确开启呢。
七毛钱 发表于 2026-4-16 14:57 | 显示全部楼层
可能是DMA传输完成中断处理有问题,影响了后续流程。
内政奇才 发表于 2026-4-16 17:57 | 显示全部楼层
仔细核对一下DMA传输的数据长度设置,会不会有问题。
内政奇才 发表于 2026-4-16 14:57 | 显示全部楼层
是不是DMA的源地址和目的地址设置颠倒了呀。
又见江南雨 发表于 2026-4-16 18:58 | 显示全部楼层
检查下系统时钟对DMA和I2C的时钟配置是否合理。
故里说长安 发表于 2026-4-16 19:58 | 显示全部楼层
或许DMA的缓存大小设置不够,导致传输异常。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

138

主题

139

帖子

0

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