//#####################################################################
//文件: Example_281xSci_FFDLB_int.c
//說明: 該程序是SCI中斷發(fā)送、接收的典型程序,
// 采用內(nèi)部連接的自循環(huán)模式,即自發(fā)、自接
//#####################################################################
//SCI-A 發(fā)送的數(shù)據(jù)流:
//00 01 02 03 04 05 06 07
//01 02 03 04 05 06 07 08
//02 03 04 05 06 07 08 09
//....
//FE FF 00 01 02 03 04 05
//FF 00 01 02 03 04 05 06
//etc..
//SCI-B 發(fā)送的數(shù)據(jù)流:
//FF FE FD FC FB FA F9 F8
//FE FD FC FB FA F9 F8 F7
//FD FC FB FA F9 F8 F7 F6
//....
//01 00 FF FE FD FC FB FA
//00 FF FE FD FC FB FA F9
//etc..
//檢查變量:
// SCI-A SCI-B
// ----------------------
// sdataA sdataB //發(fā)送的數(shù)據(jù)
// rdataA rdataB //接收的數(shù)據(jù)
// rdata_pointA rdata_pointB //用來檢查接收到的數(shù)據(jù)
//#####################################################################
#include "DSP281x_Device.h" //F2812頭文件
#include "DSP281x_Examples.h"
#define CPU_FREQ 150E6
#define LSPCLK_FREQ CPU_FREQ/4
#define SCI_FREQ 100E3
#define SCI_PRD (LSPCLK_FREQ/(SCI_FREQ*8))-1
//功能函數(shù)原型
interrupt void sciaTxFifoIsr(void);
interrupt void sciaRxFifoIsr(void);
interrupt void scibTxFifoIsr(void);
interrupt void scibRxFifoIsr(void);
void scia_fifo_init(void);
void scib_fifo_init(void);
void error(void);
//全局變量
Uint16 sdataA[8]; //SCI-A發(fā)送的數(shù)據(jù)
Uint16 sdataB[8]; //SCI-B發(fā)送的數(shù)據(jù)
Uint16 rdataA[8]; //SCI-A接收的數(shù)據(jù)
Uint16 rdataB[8]; //SCI-B接收的數(shù)據(jù)
Uint16 rdata_pointA; //用于檢查接收到的數(shù)據(jù)
Uint16 rdata_pointB;
//主程序
void main(void)
{
Uint16 i;
//步驟1.初始化系統(tǒng)控制
//PLL, 看門狗,使能外設(shè)時鐘
InitSysCtrl();
//步驟2.初始化GPIO
//InitGpio(); //在這里省略,只需配置以下與SCI有關(guān)的GPIO即可
EALLOW; //注意,需要EALLOE保護(hù)
GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 1;
GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 1;
EDIS; //與EALLOW對應(yīng)使用
//步驟3.清除所有的中斷并初始化PIE中斷向量表
DINT; //禁止CPU中斷
InitPieCtrl(); //初始化PIE控制寄存器
IER = 0x0000; //禁止 CPU 中斷,并清除所有的 CPU 中斷標(biāo)志
IFR = 0x0000;
InitPieVectTable(); //初始化 PIE 中斷向量表,將相應(yīng)的中斷向量指向中斷服務(wù)程
//序,當(dāng)中斷發(fā)生時跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序處
EALLOW; //寄存器需要 EALLOE 保護(hù)
PieVectTable.RXAINT = &sciaRxFifoIsr;
PieVectTable.TXAINT = &sciaTxFifoIsr;
PieVectTable.RXBINT = &scibRxFifoIsr;
PieVectTable.TXBINT = &scibTxFifoIsr;
EDIS; //與 EALLOW 對應(yīng)使用
//步驟4.初始化外設(shè)
//InitPeripherals(); //在本程序中可以省略
scia_fifo_init(); //初始化SCI-A
scib_fifo_init(); //初始化SCI-B
//步驟5.用戶程序段,使能中斷
//初始化要發(fā)送的數(shù)據(jù)
for(i = 0; i<8; i++)
{
sdataA[i] = i;
}
for(i = 0; i<8; i++)
{
sdataB[i] = 0xFF - i;
}
rdata_pointA = sdataA[0];
rdata_pointB = sdataB[0];
//使能所需的中斷
PieCtrlRegs.PIECRTL.bit.ENPIE = 1; //使能 PIE 模塊
PieCtrlRegs.PIEIER9.bit.INTx1=1; //PIE Group 9, INT1
PieCtrlRegs.PIEIER9.bit.INTx2=1; //PIE Group 9, INT2
PieCtrlRegs.PIEIER9.bit.INTx3=1; //PIE Group 9, INT3
PieCtrlRegs.PIEIER9.bit.INTx4=1; //PIE Group 9, INT4
IER = 0x100; //使能 CPU 中斷
EINT;
//步驟6.空循環(huán)
for(;;);
}
void error(void)
{
asm(" ESTOP0"); //Test failed!! Stop!
for (;;);
}
//SCIA 發(fā)送中斷服務(wù)程序
interrupt void sciaTxFifoIsr(void)
{
Uint16 i;
for(i=0; i< 8; i++)
{
SciaRegs.SCITXBUF=sdataA[i]; //發(fā)送數(shù)據(jù)
}
for(i=0; i< 8; i++) //要發(fā)送的下一個數(shù)據(jù)
{
sdataA[i] = (sdataA[i]+1) & 0x00FF;
}
SciaRegs.SCIFFTX.bit.TXINTCLR=1; //清除 SCI 中斷使能位
PieCtrlRegs.PIEACK.all|=0x100;
}
//SCIA 接收中斷服務(wù)程序
interrupt void sciaRxFifoIsr(void)
{
Uint16 i;
for(i=0;i<8;i++)
{
rdataA[i]=SciaRegs.SCIRXBUF.all; //讀取數(shù)據(jù)
}
for(i=0;i<8;i++) //檢查接收到的數(shù)據(jù)
{
if(rdataA[i] != ( (rdata_pointA+i) & 0x00FF) ) error();
}
rdata_pointA = (rdata_pointA+1) & 0x00FF;
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1; //清除溢出標(biāo)志位
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; //清除中斷標(biāo)志位
PieCtrlRegs.PIEACK.all|=0x100;
}
//SCIA 初始化函數(shù)
void scia_fifo_init()
{
SciaRegs.SCICCR.all =0x0007;
//一個停止位,沒有奇偶校驗位,8位數(shù)據(jù)位,同步模式
//使能發(fā)送、接收和內(nèi)部時鐘,禁止RX ERR、SLEEP、TXWAKE
SciaRegs.SCICTL1.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
SciaRegs.SCIHBAUD = 0x0000;
SciaRegs.SCILBAUD = SCI_PRD;
SciaRegs.SCICCR.bit.LOOPBKENA =1; //使能內(nèi)部自循環(huán)
SciaRegs.SCIFFTX.all=0xC028;
SciaRegs.SCIFFRX.all=0x0028;
SciaRegs.SCIFFCT.all=0x00;
SciaRegs.SCICTL1.all =0x0023;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}
//SCIB 發(fā)送中斷服務(wù)程序
interrupt void scibTxFifoIsr(void)
{
Uint16 i;
for(i=0; i< 8; i++)
{
ScibRegs.SCITXBUF=sdataB[i]; //發(fā)送數(shù)據(jù)
}
for(i=0; i< 8; i++) //要發(fā)送的下一個數(shù)據(jù)
{
sdataB[i] = (sdataB[i]-1) & 0x00FF;
}
ScibRegs.SCIFFTX.bit.TXINTCLR=1; //清除 SCI 中斷標(biāo)志位
PieCtrlRegs.PIEACK.all|=0x100;
}
//SCIB 接收中斷服務(wù)程序
interrupt void scibRxFifoIsr(void)
{
Uint16 i;
for(i=0;i<8;i++)
{
rdataB[i]=ScibRegs.SCIRXBUF.all; //讀取數(shù)據(jù)
}
for(i=0;i<8;i++) //檢查接收到的數(shù)據(jù)
{
if(rdataB[i] != ( (rdata_pointB-i) & 0x00FF) ) error();
}
rdata_pointB = (rdata_pointB-1) & 0x00FF;
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1; //清除溢出標(biāo)志位
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; //清除中斷標(biāo)志位
PieCtrlRegs.PIEACK.all|=0x100;
}
//SCIB 初始化函數(shù)
void scib_fifo_init()
{
ScibRegs.SCICCR.all =0x0007;
//一個停止位,沒有奇偶校驗位,8位數(shù)據(jù)位,同步模式,空閑線模式
ScibRegs.SCICTL1.all =0x0003;
//使能發(fā)送、接收和內(nèi)部時鐘,禁止RX ERR、SLEEP、TXWAKE
ScibRegs.SCICTL2.bit.TXINTENA =1;
ScibRegs.SCICTL2.bit.RXBKINTENA =1;
ScibRegs.SCIHBAUD =0x0000;
ScibRegs.SCILBAUD =SCI_PRD;
ScibRegs.SCICCR.bit.LOOPBKENA =1; //使能內(nèi)部自循環(huán)
ScibRegs.SCIFFTX.all=0xC028;
ScibRegs.SCIFFRX.all=0x0028;
ScibRegs.SCIFFCT.all=0x00;
ScibRegs.SCICTL1.all =0x0023;
ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
}
//#####################################################################
//文件: Example_281xSci_FFDLB.c
//說明: 該程序是SCI內(nèi)部自測試程序,程序首先發(fā)送數(shù)據(jù)0x00到0xFF,
// 然后接收數(shù)據(jù),并將接收到的數(shù)據(jù)與發(fā)送的數(shù)據(jù)進(jìn)行比較
//測試變量: ErrorCount:接收數(shù)據(jù)中錯位數(shù)據(jù)的個數(shù)
//#####################################################################
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
//功能函數(shù)原型
void scia_loopback_init(void);
void scia_fifo_init(void);
void scia_xmit(int a);
void error(int);
interrupt void scia_rx_isr(void);
interrupt void scia_tx_isr(void);
//全局變量
Uint16 LoopCount;
Uint16 ErrorCount;
//主程序
void main(void)
{
InitSysCtrl();
DINT;
IER = 0x0000;
IFR = 0x0000;
for(;;)
if(ReceivedChar != SendChar) error(1);
}
void error(int ErrorFlag)
{
}
//測試1, SCIA DLB, 8位數(shù)據(jù)格式, 波特率為0x000F, default, 1個停止位,沒有奇偶校驗位
void scia_loopback_init()
{
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
SciaRegs.SCICCR.bit.LOOPBKENA =1; //使能自循環(huán)
SciaRegs.SCICTL1.all =0x0023;
}
//發(fā)送數(shù)據(jù)函數(shù)
void scia_xmit(int a)
{
}
//初始化SCI FIFO
void scia_fifo_init()
{
}