lvluoo 发表于 2025-7-5 09:52

带DMA的HAL I2C传输

通过I2C/DMA使用HAL库将1024位缓冲区传输到SSD1306时遇到了问题。我正在使用STM32L432 Nucleo开发板。使用HAL_I2C_Mem_Write可以正常工作,但HAL_I2C_Mem_Write_DMA只传输前255字节后就使总线挂起在HAL_I2C_STATE_BUSY_TX状态。搜索了解到这是因为DMA比I2C传输更快,会先完成传输,但我不知道如何修正这个问题……单步调试HAL_I2C_Mem_Write_DMA时,似乎正确设置了所有参数:将xfermode设为I2C_RELOAD_MODE,并考虑了要发送的数据大于255字节的情况。看起来应该会循环执行直到NBYTES为0,只运行一次就触发了I2C_ISR_TCR中断。在中断处理程序中:
[*]NBYTES仍为255
[*]I2C_CR2_RELOAD = 1
[*]I2C_CR2_START = 0
[*]I2C_CR2_AUTOEND = 0
[*]xferCount = 769
[*]DMA_CCR_EN = 1
[*]DMA_ISR_TCIF6 = 0
如果我通过以下代码重置NBYTES:I2C1->CR2 &= ~(I2C_CR2_NBYTES);I2C1->CR2 |= (255 << I2C_CR2_NBYTES_Pos);
这会清除I2C_ISR_TCR,但传输并未继续。查阅数据手册第1153页,看起来应该能正常工作。是不是DMA误以为传输已完成而停止了I2C传输?是否需要清除某些标志或中断才能让继续循环传输剩余数据?
页: [1]
查看完整版本: 带DMA的HAL I2C传输