TMS320F2812外设例程系列之McBsp
//#####################################################################
//文件: Example_281xMCBSP_FFDLB_int.c
//功能: 设置McBSP为内部自循环模式,发送数据,接收数据,并比较发送与接收的数据 //发送数据如下:
//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.. //观测变量: //    sdata //    rdata //    rdata_point
//#####################################################################
#include "DSP281x_Device.h"   //头文件
#include "DSP281x_Examples.h" //函数声明
interrupt void mcbspTxFifoIsr(void); interrupt void mcbspRxFifoIsr(void); void mcbsp_init(void); void error(void); //全局变量
Uint16 sdata[8];    //发送数据 Uint16 rdata[8];    //接收数据 Uint16 rdata_point; //主程序 void main(void) {
Uint16 i;
//步骤1.初始化系统控制(PLL, 看门狗,使能外设时钟)
InitSysCtrl();   //步骤2.初始化 GPIO   //InitGpio(); //本例中略过   //只需配置McBSP功能GPIO
InitMcbspGpio();    //配置GPIO为McBSP引脚   //步骤3.清除所有中断并初始化PIE向量表
//关CPU所有中断    DINT;
//初始化PIE控制    InitPieCtrl();
//禁止CPU所有中断并清除所有中断标志位    IER = 0x0000;    IFR = 0x0000;
//初始化 PIE 中断向量表    InitPieVectTable();    EALLOW;
PieVectTable.MRINTA= &mcbspRxFifoIsr;    PieVectTable.MXINTA=&mcbspTxFifoIsr;    EDIS;
//步骤4.初始化所有外设
//InitPeripherals();   //本例中不需要    mcbsp_init();    //只需初始化McBSP   //步骤5. 用户代码段, 使能中断   //初始化发送数据缓冲器    for(i=0; i<8; i++)    {
sdata[i]=i;    }
rdata_point = 0;   //使能本例所需中断
PieCtrlRegs.PIECRTL.bit.ENPIE = 1;  //使能 PIE 模块
PieCtrlRegs.PIEIER6.bit.INTx5=1;    //使能 PIE Group 6, INT 5
PieCtrlRegs.PIEIER6.bit.INTx6=1;    //使能 PIE Group 6, INT 6
IER=0x20;    //使能 CPU INT6    EINT;    //使能全局中断   //步骤6. 空循环    for(;;);  }
void error(void) {
asm("   ESTOP0"); // 测试失败! 停止!    for (;;);  }
//McBSP 初始化函数 void mcbsp_init() {
//复位 McBSP
McbspaRegs.SPCR2.bit.FRST=0;   //帧同步信号产生器复位
McbspaRegs.SPCR2.bit.GRST=0;   //复位采样率发生器
McbspaRegs.SPCR2.bit.XRST=0;   //发送器复位    McbspaRegs.SPCR1.bit.RRST=0;   //接收器复位   //初始化 McBSP 寄存器组
//McBSP register 配置为数字自循环模式
McbspaRegs.SPCR2.all=0x0000;    //发送器禁止    McbspaRegs.SPCR1.all=0x8000;    //接收器禁止    McbspaRegs.RCR2.all=0x0001;
//接收帧位单相位帧,每帧一个串行字,每个串行字位8位,无压缩扩展模式,1位数据延时
McbspaRegs.RCR1.all=0x0;   //接收帧长度为每帧一个串行字,每个串行字位8位    McbspaRegs.XCR2.all=0x0001;
//发送帧位单相位帧,每帧一个串行字,每个串行字位8位,无压缩扩展模式,1位数据延时
McbspaRegs.XCR1.all=0x0;   //发送帧长度为每帧一
个串行字,每个串行字位8位    McbspaRegs.SRGR2.all=0x3140;
McbspaRegs.SRGR1.all=0x010f;   //配置采样率生成器
McbspaRegs.MCR2.all=0x0;    McbspaRegs.MCR1.all=0x0;    McbspaRegs.PCR.all=0x00a00;    McbspaRegs.MFFTX.all=0x4028;    McbspaRegs.MFFRX.all=0x0028;    McbspaRegs.MFFCT.all=0x0000;    McbspaRegs.MFFINT.all=0x0000;    McbspaRegs.MFFST.all=0x000;   //使能 FIFO
McbspaRegs.MFFTX.bit.TXFIFO_RESET=1;    McbspaRegs.MFFRX.bit.RXFIFO_RESET=1;   //使能采样率生成器
McbspaRegs.SPCR2.bit.GRST=1;    delay_loop();   //使能接收/发送单元
McbspaRegs.SPCR2.bit.XRST=1;    McbspaRegs.SPCR1.bit.RRST=1;   //帧同步信号产生器复位
McbspaRegs.SPCR2.bit.FRST=1;  }
//McBSP发送中断服务程序
interrupt void mcbspTxFifoIsr(void) {
Uint16 i;
for(i=0; i<8; i++)    {
McbspaRegs.DXR1.all=sdata[i];    }
//下一个要发送的数据    for(i=0; i<8; i++)    {
sdata[i] = sdata[i]+1;      sdata[i] = sdata[i] & 0x00FF;    }
McbspaRegs.MFFTX.bit.TXFFINT_CLEAR=1;
PieCtrlRegs.PIEACK.all|=0x20;    //发送PIE应答信号  }
//McBSP 接收中断服务程序
interrupt void mcbspRxFifoIsr(void)
{
Uint16 i;
for(i=0; i<8; i++)    {
rdata[i]=McbspaRegs.DRR1.all;    }
for(i=0; i<8; i++)    {
if (rdata[i] != ( (rdata_point+i) & 0x00FF) ) error();    }
rdata_point = (rdata_point+1) & 0x00FF;    McbspaRegs.MFFRX.bit.RXFFOVF_CLEAR=1;   //清除溢出标志位
McbspaRegs.MFFRX.bit.RXFFINT_CLEAR=1;   //清除中断标志位
PieCtrlRegs.PIEACK.all|=0x20;    //发送PIE应答信号  }