【DSP】TMS320F28035串口SCI不定长字节数据FIFO自发自收,可自定义通信协议

/****************************************************************************
接收FIFO深度为1,即接收一个字节数据就触发FIFO中断,然后读取RXBUF中的数据即可
****************************************************************************/
#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
__interrupt void sciaTxFifoIsr(void);
__interrupt void sciaRxFifoIsr(void);
void scia_fifo_init(void);

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;
EDIS;   // This is needed to disable write to EALLOW protected registers

    scia_fifo_init();                     // Init SCI-A

  
    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
    IER = 0x100;                         // Enable CPU INT
    EINT;

    for(;;);
}

__interrupt void
sciaTxFifoIsr(void)
{
    //未使能FIFO发送中断,函数不执行。
    SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;  // Clear SCI Interrupt flag
    PieCtrlRegs.PIEACK.all|=0x100;      // Issue PIE ACK
}

__interrupt void
sciaRxFifoIsr(void)
{
    Uint16 rx;
    rx = SciaRegs.SCIRXBUF.all;  //读取接收缓存中的一个字节数据
scia_xmit(rx);                   //将接收到的一个字节数据发送出去

    SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;   // Clear Overflow flag
    SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;   // Clear Interrupt flag

    PieCtrlRegs.PIEACK.all|=0x100;       // Issue PIE ack
}

void
scia_xmit(int a)
{
    while (SciaRegs.SCIFFTX.bit.TXFFST != 0)
    {}
    SciaRegs.SCITXBUF=a;
}

void
scia_msg(char * msg)
{
    int i;
    i = 0;
    while(msg[i] != '\0')
    {
        scia_xmit(msg[i]);
        i++;
    }
}

void
scia_fifo_init()
{
    SciaRegs.SCICCR.all =0x0007;       //8位数据格式,选择地址位协议
    SciaRegs.SCICTL1.all =0x0003;      //使能SCI发送和接收
    SciaRegs.SCICTL2.bit.TXINTENA =1;  //使能发送中断(由于下面配置失能了FIFO发送中断,所以这里使不使能都没用)
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;//使能接收中断
    SciaRegs.SCIHBAUD = 0x0000;
    SciaRegs.SCILBAUD = 0x00c2;        //设置波特率9600
    SciaRegs.SCICCR.bit.LOOPBKENA =0;  // 关闭自测模式
    SciaRegs.SCIFFTX.all=0xC001;       //失能FIFO发送中断,设置发送FIFO深度为1
    SciaRegs.SCIFFRX.all=0x0021;       //使能FIFO接收中断,设置接收FIFO深度为1,接收一个字节数据就产生FIFO接收中断,效率不高,面对少量不定长数据发送比较合适。
    SciaRegs.SCIFFCT.all=0x00;         //FIFO控制寄存器
    SciaRegs.SCICTL1.all =0x0023;      // 禁止软复位
    SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1; //发送FIFO复位
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;  //接收FIFO复位
}

 

你可能感兴趣的:(DSP)