<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        TMS320F2812外設例程系列之SCI

        作者:佚名   來源:不詳   點擊數:  更新時間:2014年08月17日   【字體:

         


        //#####################################################################
        //文件:  Example_281xSci_FFDLB_int.c
        //說明:  該程序是SCI中斷發送、接收的典型程序,
        //       采用內部連接的自循環模式,即自發、自接
        //#####################################################################
        //SCI-A 發送的數據流:
        //00 01 02 03 04 05 06 07
        //01 02 03 04 05 06 07 08
        //02 03 04 05 06 07 08 09
        //....
        //FE FF 00 01 02 03 04 05
        //FF 00 01 02 03 04 05 06
        //etc..
        //SCI-B 發送的數據流:
        //FF FE FD FC FB FA F9 F8
        //FE FD FC FB FA F9 F8 F7
        //FD FC FB FA F9 F8 F7 F6
        //....
        //01 00 FF FE FD FC FB FA
        //00 FF FE FD FC FB FA F9
        //etc..
        //檢查變量:
        //     SCI-A           SCI-B
        //     ----------------------
        //     sdataA          sdataB           //發送的數據
        //     rdataA          rdataB           //接收的數據
        //     rdata_pointA    rdata_pointB   //用來檢查接收到的數據
        //#####################################################################
        #include "DSP281x_Device.h"           //F2812頭文件
        #include "DSP281x_Examples.h"  
        #define CPU_FREQ 150E6
        #define LSPCLK_FREQ CPU_FREQ/4
        #define SCI_FREQ 100E3
        #define SCI_PRD (LSPCLK_FREQ/(SCI_FREQ*8))-1
        //功能函數原型
        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);
        //全局變量
        Uint16 sdataA[8];     //SCI-A發送的數據
        Uint16 sdataB[8];     //SCI-B發送的數據
        Uint16 rdataA[8];     //SCI-A接收的數據
        Uint16 rdataB[8];     //SCI-B接收的數據
        Uint16 rdata_pointA;   //用于檢查接收到的數據
        Uint16 rdata_pointB;
        //主程序
        void main(void)
        {
            Uint16 i;
          //步驟1.初始化系統控制
          //PLL, 看門狗,使能外設時鐘
            InitSysCtrl();
          //步驟2.初始化GPIO
          //InitGpio(); //在這里省略,只需配置以下與SCI有關的GPIO即可
            EALLOW;             //注意,需要EALLOE保護
            GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
            GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
            GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 1;
            GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 1;
            EDIS;               //與EALLOW對應使用
          //步驟3.清除所有的中斷并初始化PIE中斷向量表
            DINT;               //禁止CPU中斷
            InitPieCtrl();       //初始化PIE控制寄存器
            IER = 0x0000;       //禁止 CPU 中斷,并清除所有的 CPU 中斷標志
            IFR = 0x0000;
            InitPieVectTable(); //初始化 PIE 中斷向量表,將相應的中斷向量指向中斷服務程
          //序,當中斷發生時跳轉到相應的中斷服務程序處
            EALLOW;         //寄存器需要 EALLOE 保護 
            PieVectTable.RXAINT = &sciaRxFifoIsr;
            PieVectTable.TXAINT = &sciaTxFifoIsr;
            PieVectTable.RXBINT = &scibRxFifoIsr;
            PieVectTable.TXBINT = &scibTxFifoIsr;
            EDIS;   //與 EALLOW 對應使用
          //步驟4.初始化外設
          //InitPeripherals();       //在本程序中可以省略
                scia_fifo_init();       //初始化SCI-A
                scib_fifo_init();       //初始化SCI-B
          //步驟5.用戶程序段,使能中斷
          //初始化要發送的數據
            for(i = 0; i<8; i++)
            {
              sdataA[i] = i;
            }
            for(i = 0; i<8; i++)
            {
              sdataB[i] = 0xFF - i;
            }
            rdata_pointA = sdataA[0];
            rdata_pointB = sdataB[0];
          //使能所需的中斷
            PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   //使能 PIE 模塊
            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;                     //使能 CPU 中斷
            EINT;
          //步驟6.空循環
          for(;;);
        }
        void error(void)
        {
            asm("     ESTOP0"); //Test failed!! Stop!
            for (;;);
        }
        //SCIA 發送中斷服務程序
        interrupt void sciaTxFifoIsr(void)
        {
            Uint16 i;
            for(i=0; i< 8; i++)
            {
            SciaRegs.SCITXBUF=sdataA[i];     //發送數據
        }
            for(i=0; i< 8; i++)                   //要發送的下一個數據
            {
            sdataA[i] = (sdataA[i]+1) & 0x00FF;
        }
        SciaRegs.SCIFFTX.bit.TXINTCLR=1;     //清除 SCI 中斷使能位
        PieCtrlRegs.PIEACK.all|=0x100;     
        }
        //SCIA 接收中斷服務程序
        interrupt void sciaRxFifoIsr(void)
        {
            Uint16 i;
        for(i=0;i<8;i++)
        {
          rdataA[i]=SciaRegs.SCIRXBUF.all; //讀取數據
        }
        for(i=0;i<8;i++)                       //檢查接收到的數據
        {
          if(rdataA[i] != ( (rdata_pointA+i) & 0x00FF) ) error();
        }
        rdata_pointA = (rdata_pointA+1) & 0x00FF;
        SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;     //清除溢出標志位
        SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;     //清除中斷標志位
        PieCtrlRegs.PIEACK.all|=0x100;        
        }
        //SCIA 初始化函數
        void scia_fifo_init()
        {
            SciaRegs.SCICCR.all =0x0007;
            //一個停止位,沒有奇偶校驗位,8位數據位,同步模式
          //使能發送、接收和內部時鐘,禁止RX ERR、SLEEP、TXWAKE
            SciaRegs.SCICTL1.all =0x0003;  
            SciaRegs.SCICTL2.bit.TXINTENA =1;
            SciaRegs.SCICTL2.bit.RXBKINTENA =1;
            SciaRegs.SCIHBAUD = 0x0000;
            SciaRegs.SCILBAUD = SCI_PRD;
            SciaRegs.SCICCR.bit.LOOPBKENA =1;   //使能內部自循環
            SciaRegs.SCIFFTX.all=0xC028;
            SciaRegs.SCIFFRX.all=0x0028;
            SciaRegs.SCIFFCT.all=0x00;
            SciaRegs.SCICTL1.all =0x0023;    
            SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
            SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
        }
        //SCIB 發送中斷服務程序
        interrupt void scibTxFifoIsr(void)
        {
            Uint16 i;
            for(i=0; i< 8; i++)
            {
            ScibRegs.SCITXBUF=sdataB[i];     //發送數據
        }
            for(i=0; i< 8; i++)                     //要發送的下一個數據
            {
            sdataB[i] = (sdataB[i]-1) & 0x00FF;
        }
        ScibRegs.SCIFFTX.bit.TXINTCLR=1;     //清除 SCI 中斷標志位 
        PieCtrlRegs.PIEACK.all|=0x100;      
        }
        //SCIB 接收中斷服務程序
        interrupt void scibRxFifoIsr(void)
        {
            Uint16 i;
        for(i=0;i<8;i++)
        {
          rdataB[i]=ScibRegs.SCIRXBUF.all; //讀取數據
        }
        for(i=0;i<8;i++)                       //檢查接收到的數據
        {
          if(rdataB[i] != ( (rdata_pointB-i) & 0x00FF) ) error();
        }
        rdata_pointB = (rdata_pointB-1) & 0x00FF;
        ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;     //清除溢出標志位
        ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;   //清除中斷標志位
        PieCtrlRegs.PIEACK.all|=0x100;  
        }
        //SCIB 初始化函數
        void scib_fifo_init()
        {
            ScibRegs.SCICCR.all =0x0007; 
            //一個停止位,沒有奇偶校驗位,8位數據位,同步模式,空閑線模式
            ScibRegs.SCICTL1.all =0x0003;
            //使能發送、接收和內部時鐘,禁止RX ERR、SLEEP、TXWAKE
            ScibRegs.SCICTL2.bit.TXINTENA =1;
            ScibRegs.SCICTL2.bit.RXBKINTENA =1;
            ScibRegs.SCIHBAUD    =0x0000;
            ScibRegs.SCILBAUD    =SCI_PRD;
            ScibRegs.SCICCR.bit.LOOPBKENA =1;   //使能內部自循環
            ScibRegs.SCIFFTX.all=0xC028;
            ScibRegs.SCIFFRX.all=0x0028;
            ScibRegs.SCIFFCT.all=0x00;
            ScibRegs.SCICTL1.all =0x0023;   
            ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
            ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
        }
         
         
         //#####################################################################
        //文件:  Example_281xSci_FFDLB.c
        //說明:  該程序是SCI內部自測試程序,程序首先發送數據0x00到0xFF,
        //       然后接收數據,并將接收到的數據與發送的數據進行比較
        //測試變量: ErrorCount:接收數據中錯位數據的個數
        //#####################################################################
        #include "DSP281x_Device.h"
        #include "DSP281x_Examples.h"
        //功能函數原型
        void scia_loopback_init(void);
        void scia_fifo_init(void);
        void scia_xmit(int a);
        void error(int);
        interrupt void scia_rx_isr(void);
        interrupt void scia_tx_isr(void);
        //全局變量
        Uint16 LoopCount;
        Uint16 ErrorCount; 
        //主程序
        void main(void)
        {
            Uint16 SendChar;
            Uint16 ReceivedChar;
            //步驟1.初始化系統控制(PLL,看門狗,使能外設時鐘)
        InitSysCtrl();
          //步驟2.初始化GPIO
            //InitGpio(); //在本例中可以省略,只需配置與SCI相關的GPIO即可
            EALLOW;
            GpioMuxRegs.GPFMUX.all=0x0030;   //設置I/O口為SCI口 
            EDIS;
          //步驟3.初始化中斷向量表,禁止并清除所有的 CPU 中斷
        DINT;
        IER = 0x0000;
        IFR = 0x0000;
          //初始化 PIE 控制寄存器到默認狀態
            //InitPieCtrl();       //本例子中不用 PIE
            InitPieVectTable();  
            EnableInterrupts();   //使能 CPU 和 PIE 中斷
          //步驟4.初始化所有的外設
            //InitPeripherals(); //SCI測試時跳過此函數
          //步驟5.用戶定義程序段、分配向量、使能中斷
            LoopCount = 0;
            ErrorCount = 0;
            scia_fifo_init();     //初始化SCI FIFO
            scia_loopback_init();   //初始化 SCI 為自循環模式
            SendChar = 0;           //初始化發送變量
          //步驟6.發送數據并檢測接收到的數據
        for(;;)
           
                scia_xmit(SendChar);
                while(SciaRegs.SCIFFRX.bit.RXFIFST !=1) { } 
          //等待 XRDY =1 (空閑態),即等待數據發送
            ReceivedChar = SciaRegs.SCIRXBUF.all; //檢測接收到的數據
        if(ReceivedChar != SendChar) error(1);
                SendChar++;           //轉移到下一個發送的數據,并重復該操作
                SendChar &= 0x00FF; //限制發送數據為8位格式
            LoopCount++;
            }
        }
        void error(int ErrorFlag)
        {
            ErrorCount++;
          //asm("     ESTOP0");  //Uncomment to stop the test here
          //for (;;);
        }
        //測試1, SCIA DLB, 8位數據格式, 波特率為0x000F, default, 1個停止位,沒有奇偶校驗位 
        void scia_loopback_init()
        {    
            //注意,如果SCIA的時鐘沒有打開,那么需要軟件打開,用InitSysCtrl()函數
            SciaRegs.SCICCR.all =0x0007;  
          //1個停止位、無奇偶校驗位、8位數據格式、同步模式、空閑線模式
            SciaRegs.SCICTL1.all =0x0003;  
          //使能發送、接收、和內部時鐘,禁止RX EER、SLEEP、TXWAKE
          SciaRegs.SCICTL2.all =0x0003; 
          SciaRegs.SCICTL2.bit.TXINTENA =1;
        SciaRegs.SCICTL2.bit.RXBKINTENA =1;
            SciaRegs.SCIHBAUD=0x0000;
            SciaRegs.SCILBAUD=0x000F;
        SciaRegs.SCICCR.bit.LOOPBKENA =1; //使能自循環  
        SciaRegs.SCICTL1.all =0x0023;    
        }
        //發送數據函數
        void scia_xmit(int a)
        {
            SciaRegs.SCITXBUF=a;
        }    
        //初始化SCI FIFO
        void scia_fifo_init()
        {
            SciaRegs.SCIFFTX.all=0xE040;
            SciaRegs.SCIFFRX.all=0x204f;
            SciaRegs.SCIFFCT.all=0x0;
        }  
         
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮