⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsp28_mcbsp.c

📁 该代码是用vc编写的基于dsp2812电机控制的代码
💻 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 + -