DSP

DSP28335串口使用(查询发,中断收)

2019-07-13 10:21发布

SCI.C #include "sci.h"
//串口BGPIO初始化
void InitSciB()
{
    EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;   // Enable pull-up for GPIO62 (SCITXDB)
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;    // Enable pull-up for GPIO63 (SCIRXDB)
   GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;  // Asynch input GPIO19 (SCITXDB)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;  // Asynch input GPIO23 (SCIRXDB)
    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 2;   // Configure GPIO19 for SCITXDB operation
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2;   // Configure GPIO23 for SCIRXDB operation
    EDIS;


    ScibRegs.SCICCR.all =0x0007;   // 1 stop bit,  No loopback,No parity,8 char bits,async mode, idle-line protoco
    ScibRegs.SCICTL1.all =0x0003;  // enable TX, RX, internal SCICLK,
                                       // Disable RX ERR, SLEEP, TXWAKE
    ScibRegs.SCICTL2.all =0x0003;  //接收中断使能
    ScibRegs.SCICTL2.bit.RXBKINTENA =1;
    #if (CPU_FRQ_150MHZ)
      #if(BUADRATE_9600)      //设置波特率
    ScibRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 37.5MHz.
    ScibRegs.SCILBAUD    =0x00E7;
      #endif
       #if(BUADRATE_115200)
    ScibRegs.SCIHBAUD    =0x0000;  // 115200 baud @LSPCLK = 37.5MHz.
        ScibRegs.SCILBAUD    =0x0028;
       #endif
    #endif
    #if (CPU_FRQ_100MHZ)
        ScibRegs.SCIHBAUD    =0x0001;  // 9600 baud @LSPCLK = 20MHz.
        ScibRegs.SCILBAUD    =0x0044;
    #endif
   // ScibRegs.SCIFFTX.all=0xC000;  //FIFO功能使能
    ScibRegs.SCIFFRX.all=0x0021;  //接收FIFO的深度为最低的5位,此处设置为1,没接受到一个字符都会产生接收中断
   // ScibRegs.SCIFFCT.all=0x00;
    ScibRegs.SCICTL1.all =0x0023;  // Relinquish SCI from Reset
    //ScibRegs.SCIFFRX.bit.RXFIFORESET=1;  //复位接收FIFO
}


// Transmit a character from the SCI
void put_char(char a)
{
    while (ScibRegs.SCICTL2.bit.TXRDY == 0);
    ScibRegs.SCITXBUF=a;
}


void put_string(char * putchar)
{
    while(*putchar!= 0x00)
    {
    put_char(*putchar++);
    }
}

//串口B接收中断
interrupt void SciB_RxInterIsr(void)
{
    u8 res;
    res = (ScibRegs.SCIRXBUF.all) & 0x00FF;
   // put_char(res);
    switch(res)
    {
    case '0':  put_char('I'); break;
    case '1':  put_char(' '); break;
    case '2':  put_char('l'); break;
    case '3':  put_char('O'); break;
    case '4':  put_char('V'); break;
    case '5':  put_char('E'); break;
    case '6':  put_char(' '); break;
    case '7':  put_char('Y'); break;
    case '8':  put_char('O'); break;
    case '9':  put_char('U'); break;
    default :  break;
    }
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;  // Clear Overflow flag
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
}
main函数中相关函数和设置  InitSciB();  //串口B初始化
 PieVectTable.SCIRXINTB = &SciB_RxInterIsr;   //SCIBX接收中断服务程序
 IER |= M_INT9;    //开启CPU中断 组9  SCI_RX  CANB中断线1
  PieCtrlRegs.PIEIER9.bit.INTx3=1;     //串口B接收中断  PIE Group 9, INT3