我用两个28035做SPI通信,一个做主机,一个做从机,通信一段时间后出现了数据错位,贴出抓到的信号:
正常情况下
错位情况
我的初始化程序
if(DeviceType == MasterDevice)
{
SpibRegs.SPIFFTX.all = 0xe000; // 不产生中断,主循环中轮询
SpibRegs.SPIFFRX.all = 0x0024;
SpibRegs.SPIFFCT.all = 0x0000;
SpibRegs.SPICCR.all = 0x000f;
SpibRegs.SPICTL.all = 0x000e;
SpibRegs.SPIBRR = 59; //15m/30
SpibRegs.SPICCR.all =0x008f;
SpibRegs.SPIFFTX.bit.TXFIFO = 1;
SpibRegs.SPIFFRX.bit.RXFIFORESET=1;
GpioDataRegs.GPACLEAR.bit.GPIO15 = 1;
}
else
{
SpibRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI
SpibRegs.SPICCR.all=0x000F; //16-bit character
SpibRegs.SPIBRR = 59; //15m/15
SpibRegs.SPIFFTX.all = 0xc001; // SpibRegs.SPIFFRX.all = 0x0024;
SpibRegs.SPIFFCT.all = 0x0000;
SpibRegs.SPICTL.all = 0x000a;
SpibRegs.SPICCR.bit.SPISWRESET=1; // Enable SPI
SpibRegs.SPIFFTX.bit.TXFIFO=1;
SpibRegs.SPIFFRX.bit.RXFIFORESET=1; }
这里我有两个疑问
1.这里我把SPI的时钟模式配置为CLK_POLARITY = 0;CLK_PHASE =1 ;这时SPI在SPICLK信号第一个上升沿之前半个周期开始输出数据;这里我把STE片选信号一直拉低。我的疑问是,对于从机,怎么会提前知道SPICLK第一个上升沿之前半个周期就开始输出数据了呢?难道是未卜先知么。。。
2.当数据开始错位后我想清空 FIFO缓冲寄存器,请问如何能做到呢?我总感觉这里错位的原因是FIFO缓冲中的数据没有发完造成的。