📄 dsp28_mcbsp.c
字号:
//
// TMDX ALPHA RELEASE
// Intended for product evaluation purposes
//
//###########################################################################
//
// FILE: DSP28_McBSP.c
//
// TITLE: DSP28 Deviec McBSP Initialization & Support Functions.
//
//###########################################################################
//
// Ver | dd mmm yyyy | Who | Description of changes
// =====|=============|======|===============================================
// 0.55| 06 May 2002 | L.H. | EzDSP Alpha Release
// 0.56| 20 May 2002 | L.H. | No change
// 0.57| 27 May 2002 | L.H. | No change
//###########################################################################
#include "DSP28_Device.h"
#include "comm.h"
#include "mcbsp.h"
/***********************************************************************/
//系统缓冲区的定义:
//系统缓冲区的定义:
//第1个字节 :数据准备好
//第2个字节 :出现故障
//第3个字节 :有新帧
//第4个字节 :中断超时
//第5个字节 :较验出错
#define RECEIVE_RDY 0x1
#define MCBSP_ERR 0x2
#define RECEIVE_NEW 0x3
#define INT_ERR 0x4
#define CHECK_ERROR 0x5
unsigned int sys_statbuff[6];
//unsigned int RevBuffer[FRAMLENGTH];
//unsigned int datarevlength;
unsigned int timeout;
//---------------------------------------------------------------------------
// InitMcbsp:
//---------------------------------------------------------------------------
// This function initializes the McBSP to a known state.
//
void InitMcbsp(void)
{
//EALLOW;
//GpioMuxRegs.GPFMUX.all = 0x3F00;
//EDIS;
PieCtrl.PIEIER6.bit.INTx5 = 1;
PieCtrl.PIEIER6.bit.INTx6 = 1;
McbspRegs.MFFINT.bit.RINT=1;
McbspRegs.SPCR1.bit.RRST = 0;
McbspRegs.SPCR2.bit.XRST = 0;
McbspRegs.SPCR2.bit.GRST = 0;
McbspRegs.SPCR1.all = 0x0080;
McbspRegs.XCR1.all = 0x40;
McbspRegs.XCR2.all = 0x01;
McbspRegs.RCR1.all = 0x40;
McbspRegs.RCR2.all = 0x01;
McbspRegs.PCR1.all = 0x0A00;
McbspRegs.SPCR2.bit.GRST = 1;
McbspRegs.SPCR1.bit.RINTM=0;
McbspRegs.SPCR2.bit.XINTM=0;
NOP;
NOP;
McbspRegs.SRGR1.all = 0xffff;
McbspRegs.SRGR2.all = 0x2000;
McbspRegs.SPCR1.bit.RRST = 1;
McbspRegs.SPCR2.bit.XRST = 1;
NOP;
NOP;
}
unsigned int Mcbsp_TxRdy(void)
{
if(McbspRegs.SPCR2.bit.XRDY == 1)
{
return(1);
}
else
{
return(0);
}
}
unsigned int Mcbsp_RxRdy(void)
{
if(McbspRegs.SPCR1.bit.RRDY == 1)
{
return(1);
}
else
{
return(0);
}
}
/***********************************************************************/
/* 函数声明: MCBSP数据发送; 发送命令帧时用此函数 */
/* */
/* 函数功能: 每次发送一帧的长度 */
/* */
/* 参数: addr,发送数据的地址 */
/***********************************************************************/
void mcbsp_tx(unsigned int * addr)
{
int tempdata,tempnum;
unsigned int check = 0;
for(tempnum=0;tempnum<(FRAMLENGTH-1);tempnum++)
{
tempdata=*addr++;
check=check^tempdata;
while(Mcbsp_TxRdy() == 0);
McbspRegs.DXR1.all = tempdata;
}
if(tempnum==(FRAMLENGTH-1))
{
*addr=check;
while(Mcbsp_TxRdy() == 0);
McbspRegs.DXR1.all = check;
}
tempnum=0;
}
/***********************************************************************/
/* 函数声明: MCBSP数据接收 */
/* */
/* 函数功能: 响应中断,读取MCBSP的接收BUFFER内的数据,将数据 */
/* 放在RevBuffer变量中 */
/* */
/* 参数: */
/* Channel: 有效的串口句柄 */
/* datarevlength: 每次从缓冲区读取的长度 */
/* recvaddr: 缓冲区的首址 */
/* */
/* 返回值 0:接收完成 */
/* 1:数据未准备好 */
/* 0xFFFF:串口接收错误 */
/* 2:中断超时错误 */
/* 3: 较验出错 */
/***********************************************************************/
unsigned int mcbsp_rx(unsigned int * recvaddr)
{
unsigned int check = 0;
int j=0;
//数据未准备好
if(datarevlength<FRAMLENGTH)
{
sys_statbuff[RECEIVE_RDY]=1;
return 1;
}
//中断超时
if(timeout==0)
{
sys_statbuff[INT_ERR]=1;
datarevlength=0;
timeout = 0x8000;
return 2;
}
//串口接收错误
if(datarevlength>FRAMLENGTH)
{
sys_statbuff[RECEIVE_RDY] = 0;
sys_statbuff[MCBSP_ERR]=1;
datarevlength=0;
timeout = 0x8000;
return 0xffff;
}
//接收完成
if(datarevlength==FRAMLENGTH)
{
for(j = 0; j<FRAMLENGTH-1;j++)
{
*(recvaddr++) = RevBuffer[j];
check = check ^RevBuffer[j];
}
//接收校验
*recvaddr = RevBuffer[j];
if((*recvaddr) == check)
{
sys_statbuff[CHECK_ERROR] = 0;
sys_statbuff[RECEIVE_RDY] = 0;
}
//校验出错
else
{
sys_statbuff[CHECK_ERROR] = 1;
sys_statbuff[RECEIVE_RDY] = 0;
datarevlength=0;
timeout = 0x8000;
return 3;
}
sys_statbuff[RECEIVE_NEW]=1;
datarevlength=0;
timeout = 0x8000;
return 0;
}
}
/***********************************************************************/
/* 函数声明: 串口接收状态,并设置相应的寄存器默认值 */
/* */
/* 返回值 0:接收完成 */
/* 1:数据未准备好 */
/* 0xFFFF:串口接收错误 */
/* 2:中断超时错误 */
/* 3: 较验出错 */
/***********************************************************************/
int mcbsp_status()
{
/*中断超时错误*/
if(sys_statbuff[INT_ERR] ==1)
{
sys_statbuff[INT_ERR] = 0;
return 2;
}
/*串口接收错误*/
if(sys_statbuff[MCBSP_ERR] == 1)
{
sys_statbuff[MCBSP_ERR] = 0;
return 0xffff;
}
/*数据较验出错*/
if(sys_statbuff[CHECK_ERROR] == 1)
{
sys_statbuff[CHECK_ERROR] = 0;
return 3;
}
/*数据未准备好*/
if(sys_statbuff[RECEIVE_NEW] != 1)
{
return 1;
}
/*接收完成*/
else
{
sys_statbuff[RECEIVE_NEW] = 0;
}
return 0;
}
/////////////////////////////////////////////
interrupt void MRINTA_ISR(void) ;
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -