久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計實例 >> 瀏覽文章

TMS320F2812外設(shè)例程系列之SCI

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

 


//#####################################################################
//文件:  Example_281xSci_FFDLB_int.c
//說明:  該程序是SCI中斷發(fā)送、接收的典型程序,
//       采用內(nèi)部連接的自循環(huán)模式,即自發(fā)、自接
//#####################################################################
//SCI-A 發(fā)送的數(shù)據(jù)流:
//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 發(fā)送的數(shù)據(jù)流:
//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           //發(fā)送的數(shù)據(jù)
//     rdataA          rdataB           //接收的數(shù)據(jù)
//     rdata_pointA    rdata_pointB   //用來檢查接收到的數(shù)據(jù)
//#####################################################################
#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
//功能函數(shù)原型
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發(fā)送的數(shù)據(jù)
Uint16 sdataB[8];     //SCI-B發(fā)送的數(shù)據(jù)
Uint16 rdataA[8];     //SCI-A接收的數(shù)據(jù)
Uint16 rdataB[8];     //SCI-B接收的數(shù)據(jù)
Uint16 rdata_pointA;   //用于檢查接收到的數(shù)據(jù)
Uint16 rdata_pointB;
//主程序
void main(void)
{
    Uint16 i;
  //步驟1.初始化系統(tǒng)控制
  //PLL, 看門狗,使能外設(shè)時鐘
    InitSysCtrl();
  //步驟2.初始化GPIO
  //InitGpio(); //在這里省略,只需配置以下與SCI有關(guān)的GPIO即可
    EALLOW;             //注意,需要EALLOE保護(hù)
    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對應(yīng)使用
  //步驟3.清除所有的中斷并初始化PIE中斷向量表
    DINT;               //禁止CPU中斷
    InitPieCtrl();       //初始化PIE控制寄存器
    IER = 0x0000;       //禁止 CPU 中斷,并清除所有的 CPU 中斷標(biāo)志
    IFR = 0x0000;
    InitPieVectTable(); //初始化 PIE 中斷向量表,將相應(yīng)的中斷向量指向中斷服務(wù)程
  //序,當(dāng)中斷發(fā)生時跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序處
    EALLOW;         //寄存器需要 EALLOE 保護(hù) 
    PieVectTable.RXAINT = &sciaRxFifoIsr;
    PieVectTable.TXAINT = &sciaTxFifoIsr;
    PieVectTable.RXBINT = &scibRxFifoIsr;
    PieVectTable.TXBINT = &scibTxFifoIsr;
    EDIS;   //與 EALLOW 對應(yīng)使用
  //步驟4.初始化外設(shè)
  //InitPeripherals();       //在本程序中可以省略
        scia_fifo_init();       //初始化SCI-A
        scib_fifo_init();       //初始化SCI-B
  //步驟5.用戶程序段,使能中斷
  //初始化要發(fā)送的數(shù)據(jù)
    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.空循環(huán)
  for(;;);
}
void error(void)
{
    asm("     ESTOP0"); //Test failed!! Stop!
    for (;;);
}
//SCIA 發(fā)送中斷服務(wù)程序
interrupt void sciaTxFifoIsr(void)
{
    Uint16 i;
    for(i=0; i< 8; i++)
    {
    SciaRegs.SCITXBUF=sdataA[i];     //發(fā)送數(shù)據(jù)
}
    for(i=0; i< 8; i++)                   //要發(fā)送的下一個數(shù)據(jù)
    {
    sdataA[i] = (sdataA[i]+1) & 0x00FF;
}
SciaRegs.SCIFFTX.bit.TXINTCLR=1;     //清除 SCI 中斷使能位
PieCtrlRegs.PIEACK.all|=0x100;     
}
//SCIA 接收中斷服務(wù)程序
interrupt void sciaRxFifoIsr(void)
{
    Uint16 i;
for(i=0;i<8;i++)
{
  rdataA[i]=SciaRegs.SCIRXBUF.all; //讀取數(shù)據(jù)
}
for(i=0;i<8;i++)                       //檢查接收到的數(shù)據(jù)
{
  if(rdataA[i] != ( (rdata_pointA+i) & 0x00FF) ) error();
}
rdata_pointA = (rdata_pointA+1) & 0x00FF;
SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;     //清除溢出標(biāo)志位
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;     //清除中斷標(biāo)志位
PieCtrlRegs.PIEACK.all|=0x100;        
}
//SCIA 初始化函數(shù)
void scia_fifo_init()
{
    SciaRegs.SCICCR.all =0x0007;
    //一個停止位,沒有奇偶校驗位,8位數(shù)據(jù)位,同步模式
  //使能發(fā)送、接收和內(nèi)部時鐘,禁止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;   //使能內(nèi)部自循環(huán)
    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 發(fā)送中斷服務(wù)程序
interrupt void scibTxFifoIsr(void)
{
    Uint16 i;
    for(i=0; i< 8; i++)
    {
    ScibRegs.SCITXBUF=sdataB[i];     //發(fā)送數(shù)據(jù)
}
    for(i=0; i< 8; i++)                     //要發(fā)送的下一個數(shù)據(jù)
    {
    sdataB[i] = (sdataB[i]-1) & 0x00FF;
}
ScibRegs.SCIFFTX.bit.TXINTCLR=1;     //清除 SCI 中斷標(biāo)志位 
PieCtrlRegs.PIEACK.all|=0x100;      
}
//SCIB 接收中斷服務(wù)程序
interrupt void scibRxFifoIsr(void)
{
    Uint16 i;
for(i=0;i<8;i++)
{
  rdataB[i]=ScibRegs.SCIRXBUF.all; //讀取數(shù)據(jù)
}
for(i=0;i<8;i++)                       //檢查接收到的數(shù)據(jù)
{
  if(rdataB[i] != ( (rdata_pointB-i) & 0x00FF) ) error();
}
rdata_pointB = (rdata_pointB-1) & 0x00FF;
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;     //清除溢出標(biāo)志位
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;   //清除中斷標(biāo)志位
PieCtrlRegs.PIEACK.all|=0x100;  
}
//SCIB 初始化函數(shù)
void scib_fifo_init()
{
    ScibRegs.SCICCR.all =0x0007; 
    //一個停止位,沒有奇偶校驗位,8位數(shù)據(jù)位,同步模式,空閑線模式
    ScibRegs.SCICTL1.all =0x0003;
    //使能發(fā)送、接收和內(nèi)部時鐘,禁止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;   //使能內(nèi)部自循環(huán)
    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內(nèi)部自測試程序,程序首先發(fā)送數(shù)據(jù)0x00到0xFF,
//       然后接收數(shù)據(jù),并將接收到的數(shù)據(jù)與發(fā)送的數(shù)據(jù)進(jìn)行比較
//測試變量: ErrorCount:接收數(shù)據(jù)中錯位數(shù)據(jù)的個數(shù)
//#####################################################################
#include "DSP281x_Device.h"
#include "DSP281x_Examples.h"
//功能函數(shù)原型
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.初始化系統(tǒng)控制(PLL,看門狗,使能外設(shè)時鐘)
InitSysCtrl();
  //步驟2.初始化GPIO
    //InitGpio(); //在本例中可以省略,只需配置與SCI相關(guān)的GPIO即可
    EALLOW;
    GpioMuxRegs.GPFMUX.all=0x0030;   //設(shè)置I/O口為SCI口 
    EDIS;
  //步驟3.初始化中斷向量表,禁止并清除所有的 CPU 中斷
DINT;
IER = 0x0000;
IFR = 0x0000;
  //初始化 PIE 控制寄存器到默認(rèn)狀態(tài)
    //InitPieCtrl();       //本例子中不用 PIE
    InitPieVectTable();  
    EnableInterrupts();   //使能 CPU 和 PIE 中斷
  //步驟4.初始化所有的外設(shè)
    //InitPeripherals(); //SCI測試時跳過此函數(shù)
  //步驟5.用戶定義程序段、分配向量、使能中斷
    LoopCount = 0;
    ErrorCount = 0;
    scia_fifo_init();     //初始化SCI FIFO
    scia_loopback_init();   //初始化 SCI 為自循環(huán)模式
    SendChar = 0;           //初始化發(fā)送變量
  //步驟6.發(fā)送數(shù)據(jù)并檢測接收到的數(shù)據(jù)
for(;;)
   
        scia_xmit(SendChar);
        while(SciaRegs.SCIFFRX.bit.RXFIFST !=1) { } 
  //等待 XRDY =1 (空閑態(tài)),即等待數(shù)據(jù)發(fā)送
    ReceivedChar = SciaRegs.SCIRXBUF.all; //檢測接收到的數(shù)據(jù)
if(ReceivedChar != SendChar) error(1);
        SendChar++;           //轉(zhuǎn)移到下一個發(fā)送的數(shù)據(jù),并重復(fù)該操作
        SendChar &= 0x00FF; //限制發(fā)送數(shù)據(jù)為8位格式
    LoopCount++;
    }
}
void error(int ErrorFlag)
{
    ErrorCount++;
  //asm("     ESTOP0");  //Uncomment to stop the test here
  //for (;;);
}
//測試1, SCIA DLB, 8位數(shù)據(jù)格式, 波特率為0x000F, default, 1個停止位,沒有奇偶校驗位 
void scia_loopback_init()
{    
    //注意,如果SCIA的時鐘沒有打開,那么需要軟件打開,用InitSysCtrl()函數(shù)
    SciaRegs.SCICCR.all =0x0007;  
  //1個停止位、無奇偶校驗位、8位數(shù)據(jù)格式、同步模式、空閑線模式
    SciaRegs.SCICTL1.all =0x0003;  
  //使能發(fā)送、接收、和內(nèi)部時鐘,禁止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; //使能自循環(huán)  
SciaRegs.SCICTL1.all =0x0023;    
}
//發(fā)送數(shù)據(jù)函數(shù)
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;
}  
 
關(guān)閉窗口
主站蜘蛛池模板: 日日做夜夜爽毛片麻豆 | 日韩欧美国产一区二区 | 天天影视综合 | 国产精品免费一区二区三区四区 | 亚洲国产一区在线 | 国内自拍偷拍一区 | 国产99久久 | 国产日韩一区二区三区 | 91欧美| www国产精品 | 欧美一区二区三区在线 | 九色av| 日韩欧美在| 成人福利影院 | 国产资源视频 | 中文字幕免费 | 日韩视频一区二区 | av一级| 中国av在线免费观看 | 成人精品国产一区二区4080 | 久久99精品久久久久子伦 | 色婷婷精品国产一区二区三区 | 精品视频一区二区 | 91精品国产综合久久国产大片 | 日韩精品网站 | 日韩中文字幕在线观看 | 成人一区二区视频 | 一区二区精品 | 国产精品久久精品 | 在线一区二区三区 | 国产一区二区三区高清 | 亚洲国产一区视频 | 日本成人免费观看 | 亚洲精品美女 | 91在线看网站 | 九九99九九精彩46 | 亚洲一区二区三区在线视频 | 蜜臀久久| 日韩在线91| 国产xxxx在线 | 国产一区二区久久 |