📄 mcbsp_inti.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 + -