最近使用MM32F5270开发板有用到带有SPI接口的液晶屏(驱动型号HX8257)显示一些调试信息,不过使用中发现一个奇怪的现象,MCU的SPI工作在高速下可以对液晶进行正常的控制,但当SPI时钟降低后液晶屏就不能正常工作了。
这个现象比较奇怪。后来通过示波器抓取SPI clock的波形以及控制信号的波形发现问题所在。原来我们在使用SPI发送数据时一般通SPI_I2S_INTSTAT. TXEPT来判断是否数据是否可以继续写入。由于SPI这种串行设备rx tx是有移位寄存器buf存在的,一般情况下当tx数据被SPI copy到tx buf上后SPI_I2S_INTSTAT. TXEPT即被置位。
但是此时数据实际还未发出,如果基于该位进行逻辑判断就会导致控制信号与实际SPI数据的异位进而导致控制时序失效(这是低速下驱动失效的原因)。
SPI处于高速情况下由于时钟比较快,加上一些代码判断逻辑的延时,进而导致控制信号刚好满足了液晶屏的驱动时序(在SPI发送结束后翻转,这只是一个偶然事件),如下图
但是如果选着SPI_I2S_INTSTAT.RXAVL进行判断,就可以解决以上问题。因为SPI数据的接收必须等到SPI clock结束rx Buf数据被copy到SPI_I2S_RXREG接收数据寄存器中才会置位,如下图所示。
最终通过对SPI_I2S_INTSTAT.RXAVL状态位的判断完成了液晶驱动的优化,结果显示不论什么速度的SPI都可以很好的完成对屏幕的控制,由于没有使用delay函数,驱动稳定性大大提高。