TMS320F28335的SCI通信-FIFO中断通信实验
這兩天在調28335的SCI通信,現在把實驗過程跟大家分享:1.實驗過程:通過串口調試助手1向DSP的SCIA接口發送一段代碼,DSP接收到數據之后通過SCIB接口發送到串口軟件2.同樣串口軟件通過SCIB向DSP發送數據,DSP通過SCIA發送到串口軟件1.
2.實驗說明:本例中使用了接收FIFO中斷,但是并沒有使用發送FIFO中斷,而是使用判斷標志位的方法發送數據。
3.實驗代碼:
#include "DSP28x_Project.h"? ???// Device Headerfile and Examples Include File
#include "string.h"
// Prototype statements for functions found within this file.
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);
void scib_xmit(int a);
void scib_msg(char *msg);
void scia_xmit(int a);
void scia_msg(char *msg);
char m[12]={'1','2','3','4','5','6','7','8','a','s','d','f'};
void main(void)
{
? ?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
? ?scia_fifo_init();??// Init SCI-A
? ?scib_fifo_init();??// Init SCI-B
? ?scib_msg(m);
? ?scia_msg(m);//先發送數據判斷串口是否工作正常
// Enable interrupts required for this example
? ?PieCtrlRegs.PIECTRL.bit.ENPIE = 1;? ?// Enable the PIE block
? ?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;? ? ? ? // Enable CPU INT
? ?EINT;
? ? ? ? while(1)
? ? ? ? {
? ? ? ? }
}
void error(void)
{
? ? asm("? ???ESTOP0"); // Test failed!! Stop!
? ? for (;;);
}
interrupt void sciaTxFifoIsr(void)
{
? ? ? ? Uint16 i;
? ? ? ? for(i=0;i<12;i++)
? ? ? ? {
? ? ? ? ? ? ? ? SciaRegs.SCITXBUF=m;
? ? ? ? }
//? ? ? ? ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;//清楚發送FIFO中斷標志位。在此處如果清零會導致發送FIFO中斷一直產生,因此要關閉才行
? ? ? ? PieCtrlRegs.PIEACK.bit.ACK9=1;
}
interrupt void sciaRxFifoIsr(void)
{
? ? ? ? Uint16 i;
? ? ? ? for(i=0;i<12;i++)
? ? ? ? {
? ? ? ? ? ? ? ? m=SciaRegs.SCIRXBUF.all;
? ? ? ? }
? ? ? ? scib_msg(m);
? ? ? ? SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
//? ? ? ? ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
? ? ? ? PieCtrlRegs.PIEACK.bit.ACK9=1;
}
void scia_fifo_init()
{
? ?SciaRegs.SCICCR.all =0x0007;? ? // 1 stop bit,??No loopback
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// No parity,8 char bits,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// async mode, idle-line protocol
? ?SciaRegs.SCICTL1.all =0x0003;? ?// enable TX, RX, internal SCICLK,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// Disable RX ERR, SLEEP, TXWAKE
//? ?ScibRegs.SCICTL2.bit.TXINTENA =1;
//? ?ScibRegs.SCICTL2.bit.RXBKINTENA =1;
? ?SciaRegs.SCIHBAUD? ? =0x0000;
? ?SciaRegs.SCILBAUD? ? =0x0079;
? ?SciaRegs.SCIFFTX.bit.SCIFFENA=1;//使能FIFO
? ?SciaRegs.SCIFFTX.bit.SCIRST=1;//繼續執行功能
? ?SciaRegs.SCIFFTX.bit.TXFFIENA=0;//不使能發送FIFO中斷
? ?SciaRegs.SCIFFTX.bit.TXFFIL=0x0C;//12級FIFO使能
? ?SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;
? ?SciaRegs.SCIFFTX.bit.TXFIFOXRESET=0;
? ?SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;
? ?SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;
? ?SciaRegs.SCIFFRX.bit.RXFIFORESET=0;
? ?SciaRegs.SCIFFRX.bit.RXFFIENA=1;
? ?SciaRegs.SCIFFRX.bit.RXFFIL=0x0C;
? ?SciaRegs.SCIFFCT.all=0x00;
? ?SciaRegs.SCICTL1.bit.SWRESET=1;//Relinquish SCI from Reset
? ?SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
? ?SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
}
interrupt void scibTxFifoIsr(void)
{
? ? ? ? Uint16 i;
? ? ? ? for(i=0;i<12;i++)
? ? ? ? {
? ? ? ? ? ? ? ? ScibRegs.SCITXBUF=m;
? ? ? ? }
//? ? ? ? ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;//清除發送FIFO中斷標志位。在此處如果清零會導致發送FIFO中斷一直產生,因此要關閉才行
? ? ? ? PieCtrlRegs.PIEACK.bit.ACK9=1;
}
interrupt void scibRxFifoIsr(void)
{
? ? ? ? Uint16 i;
? ? ? ? for(i=0;i<12;i++)
? ? ? ? {
? ? ? ? ? ? ? ? m=ScibRegs.SCIRXBUF.all;
? ? ? ? }
? ? ? ? scia_msg(m);
? ? ? ? ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;
//? ? ? ? ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
? ? ? ? PieCtrlRegs.PIEACK.bit.ACK9=1;
}
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,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// Disable RX ERR, SLEEP, TXWAKE
//? ?ScibRegs.SCICTL2.bit.TXINTENA =1;
//? ?ScibRegs.SCICTL2.bit.RXBKINTENA =1;
? ?ScibRegs.SCIHBAUD? ? =0x0000;
? ?ScibRegs.SCILBAUD? ? =0x0079;
? ?ScibRegs.SCIFFTX.bit.SCIFFENA=1;//使能FIFO
? ?ScibRegs.SCIFFTX.bit.SCIRST=1;//繼續執行功能
? ?ScibRegs.SCIFFTX.bit.TXFFIENA=0;//不使能發送FIFO中斷
? ?ScibRegs.SCIFFTX.bit.TXFFIL=0x0C;//12級FIFO使能
? ?ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
? ?ScibRegs.SCIFFTX.bit.TXFIFOXRESET=0;
//? ?ScibRegs.SCIFFTX.all=0xC02C;
? ?ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;
? ?ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;
? ?ScibRegs.SCIFFRX.bit.RXFIFORESET=0;
? ?ScibRegs.SCIFFRX.bit.RXFFIENA=1;
? ?ScibRegs.SCIFFRX.bit.RXFFIL=0x0C;
? ?ScibRegs.SCIFFCT.all=0x00;
? ?ScibRegs.SCICTL1.bit.SWRESET=1;//Relinquish SCI from Reset
? ?ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
? ?ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
}
// Transmit a character from the SCI
void scib_xmit(int a)
{
? ? while (ScibRegs.SCICTL2.bit.TXRDY == 0) {}
? ? ScibRegs.SCITXBUF=a;
}
void scib_msg(char * msg)
{
? ? Uint16 len;
? ? Uint16 i;
? ? len=(strlen(msg)-1);
? ? for(i=0;i<len;i++)
? ? {
? ? ? ? ? ? scib_xmit(msg);
? ? }
//? ?return 0;
}
void scia_xmit(int a)//單個字符發送代碼
{
? ? while (SciaRegs.SCICTL2.bit.TXRDY == 0) {}
? ? SciaRegs.SCITXBUF=a;
}
void scia_msg(char * msg)//發送字符串代碼
{
? ? Uint16 len;
? ? Uint16 i;
? ? len=(strlen(msg)-1);
? ? for(i=0;i<len;i++)
? ? {
? ? ? ? ? ? scia_xmit(msg);
? ? }
//? ?return 0;
}
//===========================================================================
// No more.
//===========================================================================
4.實驗結果如下所示:
?
5.說明:因為使用了FIFO中斷,因此只有FIFO接收到12個數據之后才會進入中斷讀取數據,因此一次接收的數據不是很完全。使用FIFO的好處就是避免程序頻繁進入中斷。為了避免出現亂碼,要根據要發送的字節來選擇合適的波特率。串口1軟件就是我自己寫的軟件(就是圖中大的串口顯示的),串口2就是浮在串口1軟件上面的那個。
6.下面一段代碼是用發送FIFO中斷發送數據的,給大家參考。
#include "DSP28x_Project.h"? ???// Device Headerfile and Examples Include File
// Prototype statements for functions found within this file.
interrupt void scibTxFifoIsr(void);
interrupt void scibRxFifoIsr(void);
void scib_fifo_init(void);
void error(void);
char m[12]="12345678abcd";
void main(void)
{
? ?InitSysCtrl();
? ?InitSciGpio();
? ?DINT;
? ?InitPieCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
? ?IER = 0x0000;
? ?IFR = 0x0000;
? ?InitPieVectTable();
? ?EALLOW;? ? ? ? // This is needed to write to EALLOW protected registers
? ?PieVectTable.SCIRXINTB = &scibRxFifoIsr;
? ?PieVectTable.SCITXINTB = &scibTxFifoIsr;
? ?EDIS;? ?// This is needed to disable write to EALLOW protected registers
? ?scib_fifo_init();??// Init SCI-B
? ?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;
? ? ? ? for(;;);
}
void error(void)
{
? ? asm("? ???ESTOP0"); // Test failed!! Stop!
? ? for (;;);
}
interrupt void scibTxFifoIsr(void)
{
? ? ? ? Uint16 i;
? ? ? ? for(i=0;i<12;i++)
? ? ? ? {
? ? ? ? ? ? ? ? ScibRegs.SCITXBUF=m;
? ? ? ? }
//? ? ? ? ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;//清楚發送FIFO中斷標志位。在此處如果清零會導致發送FIFO中斷一直產生,因此要關閉才行
? ? ? ? PieCtrlRegs.PIEACK.bit.ACK9=1;
}
interrupt void scibRxFifoIsr(void)
{
? ? ? ? Uint16 i;
? ? ? ? for(i=0;i<12;i++)
? ? ? ? {
? ? ? ? ? ? ? ? m=ScibRegs.SCIRXBUF.all;
? ? ? ? }
? ? ? ? ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;
? ? ? ? ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
? ? ? ? PieCtrlRegs.PIEACK.bit.ACK9=1;
}
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,
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???// Disable RX ERR, SLEEP, TXWAKE
//? ?ScibRegs.SCICTL2.bit.TXINTENA =1;
//? ?ScibRegs.SCICTL2.bit.RXBKINTENA =1;
? ?ScibRegs.SCIHBAUD? ? =0x0001;
? ?ScibRegs.SCILBAUD? ? =0x00E7;
? ?ScibRegs.SCIFFTX.bit.SCIFFENA=1;//使能FIFO
? ?ScibRegs.SCIFFTX.bit.SCIRST=1;//繼續執行功能
? ?ScibRegs.SCIFFTX.bit.TXFFIENA=1;//使能發送FIFO中斷
? ?ScibRegs.SCIFFTX.bit.TXFFIL=0x0C;//12級FIFO使能
? ?ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
? ?ScibRegs.SCIFFTX.bit.TXFIFOXRESET=0;
? ?ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;
? ?ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;
? ?ScibRegs.SCIFFRX.bit.RXFIFORESET=0;
? ?ScibRegs.SCIFFRX.bit.RXFFIENA=1;
? ?ScibRegs.SCIFFRX.bit.RXFFIL=0x0C;
? ?ScibRegs.SCIFFCT.all=0x00;
? ?ScibRegs.SCICTL1.bit.SWRESET=1;//Relinquish SCI from Reset
? ?ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
? ?ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
}
//===========================================================================
// No more.
//===========================================================================
之前上網查資料的時候,看到有人說在不使用FIFO的情況下需要先發送一個數據才能進入中斷??梢允褂? ? ? ? ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;來控制發送FIFO中斷的進入。當想發送數據的時候就將中斷標志清零,進入中斷程序之后再進行數據加載發送。還可以添加標志位來確定在中斷程序中發送那些數據。
大家如果覺得代碼有問題,希望大家留言。
此帖出自TI C2000論壇
總結
以上是生活随笔為你收集整理的TMS320F28335的SCI通信-FIFO中断通信实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TMS320F28335项目开发记录9_
- 下一篇: DSP 的双缓冲串口程序设计