1、综述
SPI的具体使用可以去查看ug585的文档,并配合附录里的寄存器。
我这里记录调试SPI的过程和经验。
2、需求
由于工程中,需要使用SPI来进行大数据块的传输,其数据块是900个字节,已经远远超出了SPI的FIFO深度。由于SPI的寄存器并没有指示数据已经发送完毕的标志(SPI的发送寄存器中的数据发送完毕),因此采用收取到的字节数=发送的字节数来判别是否已经发送完毕(类似于系统启动前BIT)。
3、方法
配置:主模式,手动设置CS,空闲时时钟为高电平,下降沿发送数据,上升沿接收数据。
整个工程思路:先发送第一包128字节的数据,并设置FIFO中还剩余4个字节未发送时,触发发送中断,在该中断中把需要发送的数据送入发送FIFO中,并接收SPI的数据,当接收到的字节数与发送的字节数相等时,拉低CS,关闭中断,关闭SPI使能。
核心伪代码如下:
中断处理:
while(SpiPs_GetSR & SpiIxR_RXNEMPTY)
{
SpiPs_Rx;
RCnt++;
}
if(RCnt==TheSpi.ByteCnt) {
//已完成传输
if(TheSpi.BufRef) (*(TheSpi.BufRef))--;
&nbs