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

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

        TMS320F2812外設例程系列之SPI

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

         

         
        //#####################################################################
        //文件:Example_281xSpi_FFDLB_int.c
        //發送的數據流如下:
        //0000 0001 0002 0003 0004 0005 0006 0007
        //0001 0002 0003 0004 0005 0006 0007 0008
        //0002 0003 0004 0005 0006 0007 0008 0009
        //....
        //FFFE FFFF 0000 0001 0002 0003 0004 0005
        //FFFF 0000 0001 0002 0003 0004 0005 0006
        //etc..
        //觀測變量:
        //     sdata[8]:要發送的數據
        //     rdata[8]:接收的數據
        //     rdata_point  
        //#####################################################################
        #include "DSP281x_Device.h"     //頭文件
        #include "DSP281x_Examples.h"   
        //功能函數原型
        //interrupt void ISRTimer2(void);
        interrupt void spiTxFifoIsr(void);
        interrupt void spiRxFifoIsr(void);
        void delay_loop(void);
        void spi_fifo_init(void);
        void error();
        //全局變量
        Uint16 sdata[8];     //發送數據緩沖器
        Uint16 rdata[8];     //接收數據緩沖器
        Uint16 rdata_point;   //跟蹤在數據流里檢測接收到的數據
        //主程序
        void main(void)
        {
            Uint16 i;
          //Step 1. 初始化系統控制(PLL、看門狗、使能外設時鐘)
            InitSysCtrl();
          //Step 2. 初始化GPIO
          //InitGpio();    //本例中略過
          //在本程序中只需設置下列 GPIO 口為特殊功能口(SPI 口)
            EALLOW;
            GpioMuxRegs.GPFMUX.all=0x000F;   //配置 GPIOs 為 SPI 引腳
            //Port F MUX - x000 0000 0000 1111
            EDIS;
          //Step 3. 清除所有中斷、初始化 PIE 中斷向量表并禁止 CPU 中斷
            DINT;
            IER = 0x0000;
            IFR = 0x0000;
          //初始化 PIE 控制寄存器到默認狀態
            InitPieCtrl();
          //初始化 PIE 向量表使它們指向一些空的中斷服務子程序
            InitPieVectTable();
          //映射中斷向量
            EALLOW;
            PieVectTable.SPIRXINTA = &spiRxFifoIsr;
            PieVectTable.SPITXINTA = &spiTxFifoIsr;
          //Step 4. 初始化所有的外設
          //InitPeripherals();   //本例中省略
            spi_fifo_init();   //初始化SCI
          //Step 5. 用戶程序段,使能中斷
          //初始化發送數據緩沖器
            for(i=0; i<8; i++)
            {
              sdata[i] = i;
            }
            rdata_point = 0;
          //使能所需的中斷
            PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   //使能 PIE 模塊
            PieCtrlRegs.PIEIER6.bit.INTx1=1;     //使能 PIE Group 6, INT 1
            PieCtrlRegs.PIEIER6.bit.INTx2=1;     //使能 PIE Group 6, INT 2
            IER=0x20;                             //使能 CPU INT6
            EINT;                                 //使能全局中斷
          //Step 6. 空循環
          for(;;);
        }
        //用戶定義程序段
        void delay_loop()
        {
            long      i;
            for (i = 0; i < 1000000; i++) {}
        }
        void error(void)
        {
            asm("     ESTOP0");   //出現錯誤,測試失敗,停止!
            for (;;);
        }
        //SPI FIFO 初始化程序
        void spi_fifo_init()
        {
          //初始化 SPI FIFO 寄存器組
            SpiaRegs.SPICCR.bit.SPISWRESET=0; //復位SPI
            SpiaRegs.SPICCR.all=0x001F;       //16位數據位,自主循環模式
            SpiaRegs.SPICTL.all=0x0017;       //使能中斷,使能主從模式
            SpiaRegs.SPISTS.all=0x0000;
            SpiaRegs.SPIBRR=0x0063;           //波特率
            SpiaRegs.SPIFFTX.all=0xC028;       //使能FIFO, 設置TX FIFO level為8
            SpiaRegs.SPIFFRX.all=0x0028;       //設置RX FIFO level為8
            SpiaRegs.SPIFFCT.all=0x00;
            SpiaRegs.SPIPRI.all=0x0010;
            SpiaRegs.SPICCR.bit.SPISWRESET=1;   //使能SPI
            SpiaRegs.SPIFFTX.bit.TXFIFO=1;
            SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
        }
        //SPI發送中斷服務程序
        interrupt void spiTxFifoIsr(void)
        {
          Uint16 i;
            for(i=0;i<8;i++)
            {
            SpiaRegs.SPITXBUF=sdata[i];       //發送數據
            }
        for(i=0;i<8;i++)                         //每一次循環數據都加1 
        {
            sdata[i]++;
            }
            SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;   //清除中斷標志位
        PieCtrlRegs.PIEACK.all|=0x20;  
        }
        //SPI 接收中斷服務程序
        interrupt void spiRxFifoIsr(void)
        {
            Uint16 i;
            for(i=0;i<8;i++)
            {
            rdata[i]=SpiaRegs.SPIRXBUF; //讀數據
        }
        for(i=0;i<8;i++)                     //檢測接收到的數據
        {
            if(rdata[i] != rdata_point+i) error();
        }
        rdata_point++;
        SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;   //清除溢出標志位
        SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; //清除中斷標志位
        PieCtrlRegs.PIEACK.all|=0x20;      
        }
         
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮