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

📄 mcbsp_inti.c

📁 TI DSP TMS320C643 McBSP源代码
💻 C
字号:
/************************************************************
  Copyright (C), 2007 by SEED Electronic Technology LTD.
  FileName: Mcbsp_inti.c
  Author:  Ya.X      Version : V1.0         Date:2007-09-20
  Description:   McBSP的配置
                 与McBSP处理相关的一些函数,包括:
				 McBSP初始化,发送和接收函数
*************************************************************/
#include <stdio.h>
#include <csl.h>
#include <csl_mcbsp.h>
#include <csl_mcbsphal.h>

#include "DEC643.h"
#include "comm.h"

MCBSP_Handle     hMcbsp;

/*发送帧缓冲区*/
unsigned short   mcbspx[FRAMLENGTH];
PMcbspForDec643  psend = (PMcbspForDec643)mcbspx;

/*McBSP配置结构体*/
static MCBSP_Config MyMcBSPConfig =
{
	MCBSP_SPCR_RMK 	//Serial Port Control Register (SPCR)
	(        
		MCBSP_SPCR_FREE_YES, 		// Serial clock free running mode(FREE) 
		MCBSP_SPCR_SOFT_YES, 		// Serial clock emulation mode(SOFT)
		MCBSP_SPCR_FRST_YES, 		// Frame sync generator reset(FRST)
		MCBSP_SPCR_GRST_YES, 		// Sample rate generator reset(GRST)
		MCBSP_SPCR_XINTM_XRDY, 		// Transmit interrupt mode(XINTM) 
		MCBSP_SPCR_XSYNCERR_NO,		// Transmit synchronization error  
		MCBSP_SPCR_XRST_YES, 		// Transmitter reset(XRST) 
		MCBSP_SPCR_DLB_OFF,   		// Digital loopback(DLB) mode 
		MCBSP_SPCR_RJUST_RZF,		// Receive data sign-extension and
		 							//   justification mode(RJUST)
		MCBSP_SPCR_CLKSTP_DISABLE, 	// Clock stop(CLKSTP) mode non_SPI mode
		MCBSP_SPCR_DXENA_OFF, 		// DX Enabler(DXENA) -Extra delay for
									//   DX turn-on time.
		MCBSP_SPCR_RINTM_RRDY, 		// Receive interrupt(RINT) mode
		MCBSP_SPCR_RSYNCERR_NO, 	// Receive synchronization error(RSYNCERR)
		MCBSP_SPCR_RRST_YES 		// Receiver reset(RRST)
	),
    
	MCBSP_RCR_RMK	// Receive Control Register (RCR)
	(  
		MCBSP_RCR_RPHASE_SINGLE, 	// Receive phases 
		MCBSP_RCR_RFRLEN2_OF(0), 	// Receive frame length 
									//   in phase 2(RFRLEN2) 
		MCBSP_RCR_RWDLEN2_8BIT,		// Receive element length 
									//   in phase 2(RWDLEN2)  
		MCBSP_RCR_RCOMPAND_MSB,		// Receive companding mode (RCOMPAND)  
		MCBSP_RCR_RFIG_YES, 		// Receive frame ignore(RFIG)
		MCBSP_RCR_RDATDLY_1BIT,		// Receive data delay(RDATDLY)
		MCBSP_RCR_RFRLEN1_OF(0), 	// Receive frame length 
									//   in phase 1(RFRLEN1)
		MCBSP_RCR_RWDLEN1_16BIT,	// Receive element length 
									//   in phase 1(RWDLEN1)
		MCBSP_RCR_RWDREVRS_DISABLE	// Receive 32-bit bit reversal 
									//   feature.(RWDREVRS)
	),
	MCBSP_XCR_RMK	//Transmit Control Register (XCR)
	(            
		MCBSP_XCR_XPHASE_SINGLE,	// Transmit phases
		MCBSP_XCR_XFRLEN2_OF(0),	// Transmit frame length 
									//   in phase 2(XFRLEN2) 
		MCBSP_XCR_XWDLEN2_8BIT, 	// Transmit element length
		 							//   in phase 2
		MCBSP_XCR_XCOMPAND_MSB, 	// Transmit companding mode(XCOMPAND)
		MCBSP_XCR_XFIG_YES, 		// Transmit frame ignore(XFIG)
		MCBSP_XCR_XDATDLY_1BIT, 	// Transmit data delay(XDATDLY)
		MCBSP_XCR_XFRLEN1_OF(0), 	// Transmit frame length 
									//   in phase 1(XFRLEN1)
		MCBSP_XCR_XWDLEN1_16BIT, 	// Transmit element length 
									//   in phase 1(XWDLEN1)
		MCBSP_XCR_XWDREVRS_DISABLE 	// Transmit 32-bit bit reversal feature
	),
	MCBSP_SRGR_RMK	//serial port sample rate generator register(SRGR)
	( 
		MCBSP_SRGR_GSYNC_FREE,		// Sample rate generator clock 
									//   synchronization(GSYNC).
		MCBSP_SRGR_CLKSP_RISING,	// CLKS polarity clock edge select(CLKSP)
		MCBSP_SRGR_CLKSM_INTERNAL,	// MCBSP sample rate generator clock
		 							//   mode(CLKSM)
		MCBSP_SRGR_FSGM_DXR2XSR,	// Sample rate generator transmit frame
			 						//   synchronization
		MCBSP_SRGR_FPER_OF(0),		// Frame period(FPER)
		MCBSP_SRGR_FWID_OF(239),		// Frame width(FWID)
		MCBSP_SRGR_CLKGDV_OF(239)	// Sample rate generator clock
			 						//   divider(CLKGDV)
	),
	MCBSP_MCR_DEFAULT, 				// Using default value of MCR register
	MCBSP_RCERE0_DEFAULT,			// Using default value of RCERE registers
	MCBSP_RCERE1_DEFAULT,
	MCBSP_RCERE2_DEFAULT,
	MCBSP_RCERE3_DEFAULT,
	MCBSP_XCERE0_DEFAULT,			// Using default value of XCERE registers
	MCBSP_XCERE1_DEFAULT,
	MCBSP_XCERE2_DEFAULT,
	MCBSP_XCERE3_DEFAULT,
	MCBSP_PCR_RMK	//serial port pin control register(PCR)
	(   
		MCBSP_PCR_XIOEN_SP, 		// Transmitter in general-purpose I/O mode
		MCBSP_PCR_RIOEN_SP, 		// Receiver in general-purpose I/O mode
		MCBSP_PCR_FSXM_INTERNAL, 	// Transmit frame synchronization mode
		MCBSP_PCR_FSRM_EXTERNAL, 	// Receive frame synchronization mode
		MCBSP_PCR_CLKXM_OUTPUT, 	// Transmitter clock mode (CLKXM)
		MCBSP_PCR_CLKRM_INPUT, 		// Receiver clock mode (CLKRM)
		MCBSP_PCR_CLKSSTAT_0, 		// CLKS pin status(CLKSSTAT)
		MCBSP_PCR_DXSTAT_0,   		// DX pin status(DXSTAT)
		MCBSP_PCR_FSXP_ACTIVEHIGH, 	// Transmit frame synchronization polarity(FSXP)
		MCBSP_PCR_FSRP_ACTIVEHIGH, 	// Receive frame synchronization polarity(FSRP)
		MCBSP_PCR_CLKXP_RISING, 	// Transmit clock polarity(CLKXP)
		MCBSP_PCR_CLKRP_FALLING 	// Receive clock polarity(CLKRP)
	)
};

/***********************************************************
  Function:       McBSP_init
  Description:    McBSP初始化,包括McBSP的打开、配置、启动
  Calls:          No
  Called By:      main
  Input:          No
  Output:         No
  Return:         No
  Others:         No
************************************************************/
void McBSP_init()
{
    /* Let's open up serial port 0 */
    hMcbsp = MCBSP_open(MCBSP_DEV0, MCBSP_OPEN_RESET);
  
    /* We'll set it up for digital loopback, 32bit mode. We have */
    /* to setup the sample rate generator to allow self clocking.*/
    MCBSP_config(hMcbsp,&MyMcBSPConfig);

    /* Now that the port is setup, let's enable it in steps. */
    MCBSP_start(hMcbsp, MCBSP_RCV_START | MCBSP_XMIT_START |
   				MCBSP_SRGR_START | MCBSP_SRGR_FRAMESYNC,
   			    0xFFFF);
}

/***********************************************************
  Function:       mcbsp_tx
  Description:    通过McBSP发送一帧数据(128 short)
  Calls:          No
  Called By:      
  Input:          addr: McBSP帧数据的地址
  Output:         No
  Return:         No
  Others:         No
************************************************************/
void mcbsp_tx(unsigned short * addr)
{
	unsigned short i,tmp;
	unsigned short check = 0;

    //send McBSP_Frame
    for(i=0; i < (FRAMLENGTH-1); i++)
	{
	    tmp = *(addr++);
	    check = check^tmp;
    	while (!MCBSP_xrdy(hMcbsp));
    	    MCBSP_write(hMcbsp,tmp);
   	}

	//send McBSP_Frame check bit
	if( (FRAMLENGTH-1) == i )
    {
		*addr=check;	     
		while(MCBSP_xrdy(hMcbsp)==0);                    	
			MCBSP_write(hMcbsp,check);
	}	 	
}

/***********************************************************
  Function:       Mcbsp_Wordsend
  Description:    通过McBSP发送文字信息
  Calls:          mcbsp_tx()
  Called By:      main
  Input:          d_sam: 待发送文字的字数
				  Buffer:存放文字信息的缓冲区地址
				  type: 指定当前发送数据的类型;
				  		文字(CHAR_DATASEND)
				  		数字(NUM_DATASEND)
  Output:         No
  Return:         No
  Others:         No
************************************************************/
void Mcbsp_Wordsend( int d_sam, unsigned short *Buffer,unsigned short type)
{   
	int  i;
	unsigned short  tmp;
	unsigned short  tmpH,tmpL;
  
    //填充mcbsp帧信息
    psend->Length  = FRAMLENGTH;
    psend->Type    = type;
    psend->Mutul   = FRAME_SING;
    psend->Data[0] = d_sam;

	//将文字信息进行little endian到big endian的置换
    for( i=0; i<d_sam; i++ )
    {
		tmp  = *(Buffer+i);
		tmpH = (tmp>>8)&0xFF;
		tmpL = tmp&0xFF;
		psend->Data[1+i] = (tmpL<<8) | tmpH ;
    }

    //发送一帧数据
    mcbsp_tx(mcbspx);    
}
                                
/***********************************************************
  Function:       Mcbsp_Datasend
  Description:    通过McBSP发送数字信息
  Calls:          mcbsp_tx()
  Called By:      main
  Input:          d_sam: 待发送数字的个数
				  Buffer:存放数字的缓冲区地址
				  type: 指定当前发送数据的类型;
				  		文字(CHAR_DATASEND)
				  		数字(NUM_DATASEND)
  Output:         No
  Return:         No
  Others:         No
************************************************************/
void Mcbsp_Datasend(int d_sam, unsigned short *Buffer, unsigned short type)
{   
	int i;

    //填充mcbsp帧信息 
    psend->Length   = FRAMLENGTH;
    psend->Type     = type;
    psend->Mutul    = FRAME_SING;
    psend->Data[0]  = d_sam;

	//填充数据信息
    for( i=0; i<d_sam; i++)
	{
	    psend->Data[1+i] = *(Buffer+i);
    }

	//发送一帧数据
    mcbsp_tx(mcbspx);   
}

/***********************************************************************/
//	No	more
/***********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -