//#####################################################################
//文件:Example_281xSpi_FFDLB_int.c
//發送的數據流如下:
//0000 0001 0002 0003 0004 0005 0006 0007
//0001 0002 0003 0004 0005 0006 0007 0008
//0002 0003 0004 0005 0006 0007 0008 0009
//....
//FFFE FFFF 0000 0001 0002 0003 0004 0005
//FFFF 0000 0001 0002 0003 0004 0005 0006
//etc..
//觀測變量:
// sdata[8]:要發送的數據
// rdata[8]:接收的數據
// rdata_point
//#####################################################################
#include "DSP281x_Device.h" //頭文件
#include "DSP281x_Examples.h"
//功能函數原型
//interrupt void ISRTimer2(void);
interrupt void spiTxFifoIsr(void);
interrupt void spiRxFifoIsr(void);
void delay_loop(void);
void spi_fifo_init(void);
void error();
//全局變量
Uint16 sdata[8]; //發送數據緩沖器
Uint16 rdata[8]; //接收數據緩沖器
Uint16 rdata_point; //跟蹤在數據流里檢測接收到的數據
//主程序
void main(void)
{
Uint16 i;
//Step 1. 初始化系統控制(PLL、看門狗、使能外設時鐘)
InitSysCtrl();
//Step 2. 初始化GPIO
//InitGpio(); //本例中略過
//在本程序中只需設置下列 GPIO 口為特殊功能口(SPI 口)
EALLOW;
GpioMuxRegs.GPFMUX.all=0x000F; //配置 GPIOs 為 SPI 引腳
//Port F MUX - x000 0000 0000 1111
EDIS;
//Step 3. 清除所有中斷、初始化 PIE 中斷向量表并禁止 CPU 中斷
DINT;
IER = 0x0000;
IFR = 0x0000;
//初始化 PIE 控制寄存器到默認狀態
InitPieCtrl();
//初始化 PIE 向量表使它們指向一些空的中斷服務子程序
InitPieVectTable();
//映射中斷向量
EALLOW;
PieVectTable.SPIRXINTA = &spiRxFifoIsr;
PieVectTable.SPITXINTA = &spiTxFifoIsr;
//Step 4. 初始化所有的外設
//InitPeripherals(); //本例中省略
spi_fifo_init(); //初始化SCI
//Step 5. 用戶程序段,使能中斷
//初始化發送數據緩沖器
for(i=0; i<8; i++)
{
sdata[i] = i;
}
rdata_point = 0;
//使能所需的中斷
PieCtrlRegs.PIECRTL.bit.ENPIE = 1; //使能 PIE 模塊
PieCtrlRegs.PIEIER6.bit.INTx1=1; //使能 PIE Group 6, INT 1
PieCtrlRegs.PIEIER6.bit.INTx2=1; //使能 PIE Group 6, INT 2
IER=0x20; //使能 CPU INT6
EINT; //使能全局中斷
//Step 6. 空循環
for(;;);
}
//用戶定義程序段
void delay_loop()
{
long i;
for (i = 0; i < 1000000; i++) {}
}
void error(void)
{
asm(" ESTOP0"); //出現錯誤,測試失敗,停止!
for (;;);
}
//SPI FIFO 初始化程序
void spi_fifo_init()
{
//初始化 SPI FIFO 寄存器組
SpiaRegs.SPICCR.bit.SPISWRESET=0; //復位SPI
SpiaRegs.SPICCR.all=0x001F; //16位數據位,自主循環模式
SpiaRegs.SPICTL.all=0x0017; //使能中斷,使能主從模式
SpiaRegs.SPISTS.all=0x0000;
SpiaRegs.SPIBRR=0x0063; //波特率
SpiaRegs.SPIFFTX.all=0xC028; //使能FIFO, 設置TX FIFO level為8
SpiaRegs.SPIFFRX.all=0x0028; //設置RX FIFO level為8
SpiaRegs.SPIFFCT.all=0x00;
SpiaRegs.SPIPRI.all=0x0010;
SpiaRegs.SPICCR.bit.SPISWRESET=1; //使能SPI
SpiaRegs.SPIFFTX.bit.TXFIFO=1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
}
//SPI發送中斷服務程序
interrupt void spiTxFifoIsr(void)
{
Uint16 i;
for(i=0;i<8;i++)
{
SpiaRegs.SPITXBUF=sdata[i]; //發送數據
}
for(i=0;i<8;i++) //每一次循環數據都加1
{
sdata[i]++;
}
SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1; //清除中斷標志位
PieCtrlRegs.PIEACK.all|=0x20;
}
//SPI 接收中斷服務程序
interrupt void spiRxFifoIsr(void)
{
Uint16 i;
for(i=0;i<8;i++)
{
rdata[i]=SpiaRegs.SPIRXBUF; //讀數據
}
for(i=0;i<8;i++) //檢測接收到的數據
{
if(rdata[i] != rdata_point+i) error();
}
rdata_point++;
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; //清除溢出標志位
SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; //清除中斷標志位
PieCtrlRegs.PIEACK.all|=0x20;
}