//#####################################################################
//文件: 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應答信號
}