1 基本方案
最近调试STM32与DSP双芯片SPI通讯的调试,总结一下基本使用过程供初学者参考。通讯方案中使用STM32作为主机,TI280045作为从机。因dsp需要执行更高优先级的任务,因此不能将大部分资源用在SPI通讯上,因此使用了SPI FIFO缓存模式,关于SPI FIFO模式此处不再过多介绍,感兴趣的朋友可以查阅相关知识点。为了避免DSP SPI接收FIFO中的数据溢出导出的数据错帧问题,使用了FIFO接收中断,当SPI 接收FIFO深度达到16级时,产生一个中断任务,在中断中读取FIFO缓存数据并保存,耗时较长的解析数据帧的任务放置在主循环。
2 部分实现代码
SPI FIFO配置代码如下所示:
(1)使能SPI接收中断
PieCtrlRegs.PIEIER6.bit.INTx1 = 1; //SPI RX中断
(2)配置SPI寄存器
SpiaRegs.SPISTS.all=0x0000; //所有状态位清零
SpiaRegs.SPICCR.all = 0x0027;//上升沿发数据下降沿收数据
SpiaRegs.SPICTL.all = 0x0003;//从机模式
SpiaRegs.SPICCR.all = 0x00A7;
SpiaRegs.SPIPRI.bit.FREE = 0;
//设置FIFO功能
SpiaRegs.SPIFFTX.all = 0xE040; //使能FIFO;清除发送中断标志位;禁止FIFO发送中断;
SpiaRegs.SPIFFRX.all = 0X604F;
SpiaRegs.SPIFFRX.bit.RXFFIL = 16; //FIFO中有16个字时产生中断
SpiaRegs.SPIFFRX.bit.RXFFIENA = 1; //开启FIFO接收中断
SpiaRegs.SPIFFCT.all = 0X0; //SPITXBUF到移位寄存器传送不延迟;
(3)在中断函数中接收数据
interrupt void SPIA_RX_ISR(void)
{
Uint i;
//读取FIFO中数据
for(i = 0;i < 16 ;i++){
RxData[i]= SpiaRegs.SPIRXBUF;
}
//以下操作为了使下一次中断正常发生
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1; //清除FIFO接收中断
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1; //清除接收中断
PieCtrlRegs.PIEACK.bit.ACK6 = 1; // Issue PIE ACK
}