20231008晚,困扰我好几天的问题终于解决了,在使用IIC+DMA模式点亮oled屏幕时,发送数据怎么都不对,经过几次对比下来,问题锁定在了dma发送数据过快导致的数据顺序错乱,找了很久资料发现原来HAL_I2C_Mem_Write_DMA函数发送数据是非阻塞的,意思就是数据还没发送完成就会进行下一条指令,这是导致问题的关键。
在csdn上寻求无果,于是在bilibili上找相关视频,有一位up主给出了解答,需要在DMA发送数据函数后加上一句while (hi2c1.State != HAL_I2C_STATE_READY),用来确保进行下一条指令之前dma是准备状态,意思就是数据发送已经完成才能进行下一步。