专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

TMS320F2812外设例程系列之McBsp

作者:佚名   来源:不详   点击数:  更新时间:2014年08月16日   【字体:

 

 
//#####################################################################
//文件:  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应答信号
}
 
关闭窗口