//################################################################################
//
// 程序功能描述:
// 该程序为一个SCI中断发送、接收典型程序,采用内部连接的自循环模式,即自己发送,自// 己接收,采用中断的方式发送和接收。本程序中发送、接收的数据流如下所示:
//############################################################################
// The 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..
//
// The 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位数据位,同步模式,
SciaRegs.SCICTL1.all =0x0003; // 使能发送、接收和内部时钟,禁止 RX ERR、SLEEP、//TXWAKE
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;
}
//===========================================================================
// No more.
//===========================================================================
评论0