/*-----------------------------------------------------------
SPI自测程序:将SPI内部发送和接收引脚内部连接,发送-接收-检测(报告)
----------------------------------------------------------*/
#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#define CHECKNUM 512
void Init_spi();
void Init_spi_fifo();
void Spi_check();
void error();
void main()
{
InitSysCtrl();
EALLOW;
GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO17=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO18=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO19=1; //设置SPI功能引脚
EDIS;
DINT;
IER=0x0000;
IFR=0x0000; //禁止CPU中断并清除所有的中断标志位
InitPieCtrl();
InitPieVectTable();
Init_spi();
Init_spi_fifo();
for(;;)
Spi_check();
}
void Init_spi()
{
SpiaRegs.SPICCR.all=0x000f; //复位,上升沿有效,16位数据长度
SpiaRegs.SPICTL.all=0x0006; //主模式,使能发送,SPI禁止中断
SpiaRegs.SPIBRR=0x007f; //波特率控制位,波特率=LSPCLK(即37.5MHz)/(SPIBRR+1)
SpiaRegs.SPICCR.all=0x009f; //自循环模式使能,SPI准备接收或发送
SpiaRegs.SPIPRI.bit.FREE=1; //自由运行,这一行可省
}
void Init_spi_fifo()
{
SpiaRegs.SPIFFTX.all=0xe040; //使能FIFO且开始接收或发送数据,禁止TX FIFO中断且清除之前的发送中断标志位
SpiaRegs.SPIFFRX.all=0x204f; //同上,如禁止RX FIFO且清除之前的接收中断标志位
SpiaRegs.SPIFFCT.all=0; //无延迟
}
void Spi_check()
{
Uint16 senddata,receiveddata;
for(senddata=0;senddata<CHECKNUM;senddata++)
{
SpiaRegs.SPITXBUF=(senddata&0xff);
while(SpiaRegs.SPIFFRX.bit.RXFFST!=1) {} //等待数据接收:当接收FIFO为空时,一直等待(即{}),直到有1个字接收完毕。
receiveddata=SpiaRegs.SPIRXBUF;
if(receiveddata!=senddata)
error();
}
}
void error()
{
asm("ESTOP0"); //错误产生,程序停止
for(;;);
}
SPI
最新推荐文章于 2024-09-18 15:42:10 发布