1. SCI FIFO發送流程
- 將內存數據放置發送緩存當中
ScibRegs.SCITXBUF=’A’;
- 發送緩存中的數據自動存到FIFO當中
ScibRegs.SCITXBUF中的數據會放入到發送FIFO中,最多16字節數據如果連續發送的字節數量大於16需要等待,否則發送的數據將會被覆蓋
- 發送FIFO將數據轉到發送移位寄存器TXSHF當中
FIFO會自動將數據發送到移位寄存器TXSHF中最終到TXD引腳
2. SCI FIFO接收流程
- 數據到達RXD引腳之後,檢測啓動位
- TXSHF移位到接收FIFO當中
當FIFO接收字節數量等於設置的接收FIFO深度ScibRegs.SCIFFRX.bit.RXFFIL = 8時產生一箇中斷
- 如果使能了接收中斷將會產生一箇中斷
3 代碼示例
3.1 初始化配置
該示例的主要功能
- 連續多數據發送
- 一次性接收8個字節數據並將其打印輸出
void scib_xmit(char a);
void scib_msg(char *msg, Uint16 len);
volatile Uint16 g_received_flag = 0;
Uint16 g_recv_buff[256];
void main(void)
{
Uint16 i;
char *msg;
InitSysCtrl();
InitSciGpio();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW; // This is needed to write to EALLOW protected registers
// PieVectTable.SCIRXINTA = &sciaRxFifoIsr;
// PieVectTable.SCITXINTA = &sciaTxFifoIsr;
PieVectTable.SCIRXINTB = &scibRxFifoIsr;
PieVectTable.SCITXINTB = &scibTxFifoIsr;
EDIS; // This is needed to disable write to EALLOW protected registers
scib_fifo_init(); // Init SCI-B
// Enable interrupts required for this example
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
// PieCtrlRegs.PIEIER9.bit.INTx4=1; // PIE Group 9, INT4
IER = 0x100; // Enable CPU INT
EINT;
msg = "123456789012345678901234567890\n\0";
scib_msg(msg,strlen(msg));
for(;;)
{
if(g_received_flag == 1)
{
g_received_flag = 0;
scib_msg(g_recv_buff, 8);//打印出接收到的數據
}
}
}
3.2 SCI 配置
void scib_fifo_init()
{
ScibRegs.SCICCR.all =0x0007; // 1 stop bit,No loopback No parity,8 char bits,async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// ScibRegs.SCICTL2.bit.TXINTENA =1;//禁用發送中斷
ScibRegs.SCICTL2.bit.RXBKINTENA =1;//使能接收中斷
//波特率設置寄存器BRR = LSPCLK/(波特率*8)-1
#if (CPU_FRQ_150MHZ)
ScibRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 37.5MHz.
ScibRegs.SCILBAUD =0x00E7;
#endif
ScibRegs.SCICCR.bit.LOOPBKENA = 0; // disable loop back Enable loop back
// ScibRegs.SCIFFTX.all=0xC028;
ScibRegs.SCIFFTX.bit.SCIRST = 1; //1-SCI重新開始接收和發送,0-復位SCI
ScibRegs.SCIFFTX.bit.SCIFFENA = 1; //FIFO使能
ScibRegs.SCIFFTX.bit.TXFFIL = 8; //發送FIFO8級即發送8個字節產生一次發送中斷,如果使能了
// ScibRegs.SCIFFTX.bit.TXFFIENA = 1; //發送FIFO中斷禁止使用
// ScibRegs.SCIFFRX.all=0x0028;
ScibRegs.SCIFFRX.bit.RXFFIENA = 1; //接收FIFO中斷使能
ScibRegs.SCIFFRX.bit.RXFFIL = 8; //接收FIFO8級即接收8個字節產生一次發送中斷,如果使能了
ScibRegs.SCIFFCT.all=0x00; //無發送延遲
ScibRegs.SCICTL1.bit.SWRESET =1; // 通過寫1重新使能SCI,該復位每種外設都有
ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1; //發送重新使能
ScibRegs.SCIFFRX.bit.RXFIFORESET=1; //接收重新使能
}
3.3 發送和接收
void scib_xmit(char a)
{
ScibRegs.SCITXBUF=a;
//在此做判斷,如果發送FIFO緩衝中數據 >= 16字節,要等待下直到FIFO小於16才能再次向FIFO中存數據
while(ScibRegs.SCIFFTX.bit.TXFFST >= 16){;}
}
void scib_msg(char * msg, Uint16 len)
{
int i;
for(i = 0;i < len;i++)
{
scib_xmit(msg[i]);
}
}
__interrupt void scibRxFifoIsr(void)
{
Uint16 i;
for(i=0;i<8;i++)
{
g_recv_buff[i] =ScibRegs.SCIRXBUF.all;
}
g_received_flag = 1;
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
}
4 總結
- 使用FIFO發送不能連續發送超過16字節數據,所以上面的程序進行了判斷
- 接收FIFO存在很明顯的缺陷:只有收到指定長度的數據時纔會產生中斷,對於固定長度的數據通信協議而言非常有幫助;但是對於變長的數據接收只能使用一個字節中斷一次的方式進行處理,這樣接收FIFO沒有任何的優勢。
- 發送FIFO不建議中斷使能,因爲它會頻繁中斷
- 總之DSP的SCI沒法做到變長數據幀中斷