书接4月21号的文章:
https://dadeju.github.io/2025/04/21/FIFO-%E4%B8%8B%E6%BA%A2%E8%A7%A3%E6%9E%90/
在阅读大佬的公众号文章后深有启发
https://mp.weixin.qq.com/s/ARiez-cyVypm1ncWNGpYkw
做了如下验证:
SPI主机端使用连续传输模式时(master在连续发数过程中保持PCS拉低),波特率6.5M,使用DMA传输。主机端buff长度设为100字节,从机buff设为80字节。这样会因TX FIFO下溢导致触发中断。将从机buff设为100字节后则能正常传输。
下图为主机端buff长度设为100字节,从机buff设为80字节的情况:
但如果将SPI主机端的传输模式改成非连续传输,主机端buff长度设为100字节,从机设为80字节也能正常工作
当发送移位器(负责将数据逐位移到总线)需要发送数据时,发送FIFO(先进先出缓冲区)中却没有数据可用,导致发送移位器“空转”,从而造成Underflow事件。
在寻找解决方法的过程中还发现了NXP的勘误手册中有这样的记录:
https://www.nxp.com/docs/en/errata/MCXNx4x_1P02G.pdf
在NXP的MCXNX4X_1P02G芯片中,当LPSPI(低功耗串行外设接口)工作在从模式(Slave Mode)时,如果发生发送FIFO下溢(Transmit FIFO Underrun),即发送FIFO为空但主设备(Master)仍在请求数据,会导致以下问题:
- 发送FIFO指针损坏:FIFO的读写指针(用于跟踪数据位置)可能进入错误状态,导致后续数据传输异常。
触发条件: - 状态寄存器(SR)的TEF位(Transmit Error Flag)被置位(SR[TEF] = 0b1),标志下溢事件发生。
临时规避方法:
1.清除发送错误标志:将状态寄存器(SR)的TEF位清零(SR[TEF] = 0b1)。
2.重置发送FIFO:在写入新数据前,通过控制寄存器(CR)的RTF位(Reset Transmit FIFO)复位发送FIFO(CR[RTF] = 0b1),使指针回到初始位置。
3.写入新数据:确保FIFO指针复位后,再向发送FIFO填充数据。