1、SCI通信格式中數(shù)據(jù)位數(shù)1~8與FIFO深度1~16
SCI通信格式中的數(shù)據(jù)位數(shù)是指采用SCI傳輸數(shù)據(jù)時一幀數(shù)據(jù)的位數(shù),一幀傳輸1~8位,則兩幀傳輸2~16位;FIFO深度是指有多少數(shù)據(jù)存入到FIFO中時會產(chǎn)生中斷請求事件,F(xiàn)IFO的深度設(shè)定時當(dāng)然要大于所定義的數(shù)據(jù)格式的位數(shù),數(shù)據(jù)位數(shù)一定的情況下,深度越大所發(fā)生的中斷請求頻率越低。
2、實(shí)際測試
當(dāng)波特率設(shè)定為19200時,以串口調(diào)試軟件“xfcom21.exe”測試數(shù)據(jù)位分別為1~8,深度分別為1~16。
串口調(diào)試軟件截圖
結(jié)果為:
數(shù)據(jù)位<7位時,無論FIFO深度為多少,傳輸均錯誤,數(shù)據(jù)位為7或8位時,F(xiàn)IFO深度在大于數(shù)據(jù)位的情況下,傳輸均正確;且當(dāng)數(shù)據(jù)位=深度時,傳輸?shù)臄?shù)據(jù)在自行設(shè)定的buffer數(shù)組中各位始終保持不變,穩(wěn)定傳輸,當(dāng)數(shù)據(jù)位小于8位時,buffer數(shù)組中各位輪流變換傳輸,且變換與FIFO深度與數(shù)據(jù)位數(shù)有關(guān)系。
說明對于FIFO堆棧深度的設(shè)定只影響中斷產(chǎn)生事件的頻率,SCI串口傳輸時設(shè)定數(shù)據(jù)位數(shù)為7或8位傳輸較為穩(wěn)定。
3、測試所用程序
void InitSci(void)
{
SciaRegs.SCICCR.bit.STOPBITS=0; //1位停止位
SciaRegs.SCICCR.bit.PARITYENA=0; //禁止極性功能
SciaRegs.SCICCR.bit.LOOPBKENA=0; //禁止回送測試模式功能
SciaRegs.SCICCR.bit.ADDRIDLE_MODE=0; //空閑線模式
SciaRegs.SCICCR.bit.SCICHAR=7; //8位數(shù)據(jù)位
SciaRegs.SCICTL1.bit.TXENA=1; //SCIA模塊的發(fā)送使能
SciaRegs.SCICTL1.bit.RXENA=1; //SCIA模塊的接收使能
SciaRegs.SCIHBAUD=0;
SciaRegs.SCILBAUD=0xC2; //波特率為19200
SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1; //重新使能發(fā)送FIFO的操作
SciaRegs.SCIFFTX.bit.SCIFFENA=1; //使能SCI FIFO的功能
SciaRegs.SCIFFTX.bit.TXFFST=0; //發(fā)送FIFO隊(duì)列為空
SciaRegs.SCIFFTX.bit.TXFFINT=0; //沒有產(chǎn)生發(fā)送FIFO中斷
SciaRegs.SCIFFTX.bit.TXINTCLR=0; //沒有清除TXFFINT的標(biāo)志位
SciaRegs.SCIFFTX.bit.TXFFIENA=1; //使能發(fā)送FIFO中斷
SciaRegs.SCIFFTX.bit.TXFFILIL=0; //發(fā)送中斷級別為0,也就是當(dāng)發(fā)送FIFO為空時發(fā)生中斷
SciaRegs.SCIFFRX.bit.RXFFOVF=0; //接收FIFO沒有溢出
SciaRegs.SCIFFRX.bit.RXOVF_CLR=1; //對RXFFOVF標(biāo)志位沒有影響
SciaRegs.SCIFFRX.bit.RXFIFORESET=1; //重新使能接收FIFO的操作
SciaRegs.SCIFFRX.bit.RXFIFST=0; //接收FIFO隊(duì)列為空
SciaRegs.SCIFFRX.bit.RXFFINT=0; //沒有產(chǎn)生接收中斷
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1; //清除接收中斷標(biāo)志位
SciaRegs.SCIFFRX.bit.RXFFIENA=1; //使能FIFO接收中斷
SciaRegs.SCIFFRX.bit.RXFFIL=8; //FIFO接收中斷級別為8.也就是說當(dāng)接收FIFO中有8個字符時發(fā)生中斷
SciaRegs.SCICTL1.bit.SWRESET=1; //重啟SCI
}
DSP28_DefaultIsr.c文件下相應(yīng)中斷函數(shù)處:
interrupt void SCIRXINTA_ISR(void) // SCI-A接收中斷函數(shù)
{
int i;
for(i=0;i<8;i++)
{
buffer[i] = SciaRegs.SCIRXBUF.all; //接收數(shù)據(jù)
}
// if(strncmp(buffer,"hellodsp",8)==0)
// {
SciaRegs.SCIFFTX.bit.TXINTCLR=1; //清除發(fā)送中斷標(biāo)志位,使其響應(yīng)新的中斷
// }
SciaRegs.SCIFFRX.bit.RXFIFORESET=0;
SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
PieCtrl.PIEACK.all=0x0100; //使得同組其他中斷能夠得到響應(yīng)
EINT; //開全局中斷vcc
}
interrupt void SCITXINTA_ISR(void) // SCI-A發(fā)送中斷函數(shù)
{
int i;
for(i=0;i<8;i++)
{
SciaRegs.SCITXBUF=buffer[i]; //發(fā)送數(shù)據(jù)
}
PieCtrl.PIEACK.all=0x0100; //使得同組其他中斷能夠得到響應(yīng)
EINT; //開全局中斷
}