📄 tmcbsp55.c.bak
字号:
//test mcbsp
#ifndef _MCBSP55_C
#define _MCBSP55_C
#include "includes.h"
#include "includes_async.h"
#include "dsp_includes.h"
/*
#define MCBSP_RX_MSK_BIT 0
#define MCBSP_TX_MSK_BIT 1
#define MCBSP_RX_USED_BIT 2
#define MCBSP_TX_USED_BIT 3
#define MCBSP_AS_GPIO 1
#define MCBSP_AS_NORMAL 0
*/
static volatile Uint16 mcbsp_msk=0; //共16比特,channel0 ~3各自占用5比特
/*
mcbsp_msk[4:0]--->mc_bsp0
mcbsp_msk[9:5]--->mc_bsp1
mcbsp_msk[14:10]--->mc_bsp2
bit0:0 接受初始化为 mcbsp,1初始化为io
bit1:0 发送初始化为 mcbsp,1初始化为io
bit2:
*/
Uint16 McBspGetMskBit(Uint16 dev_no,Uint16 bit_no)
{
Uint16 bit_num=0,bit_val=0;
bit_num=dev_no*5+bit_no;
bit_val=mcbsp_msk&(1<<bit_num);
if(bit_val)
return(1);
else
return(0);
}
void McBspSetMskBit(Uint16 dev_no,Uint16 bit_no,Uint16 bit_val)
{
Uint16 bit_num=0,bit_msk=0;
bit_num=dev_no*5+bit_no;
bit_msk=(1<<bit_num);
if(bit_val)
mcbsp_msk=mcbsp_msk|bit_msk;
else
mcbsp_msk=mcbsp_msk&(~bit_msk);
}
MCBSP_Handle InitMcBsp( Uint16 dev_no /*设备号:0,2*/ )
//做必要的缺省设置并打开一个mcbsp
//不支持multichannel、partion、channel的mask
{
Uint16 msk[3]={0x001f,0x03e0,0x7c00};
MCBSP_Config tempconfig1;
MCBSP_Handle handle1;
mcbsp_msk=mcbsp_msk&(~msk[dev_no]);
handle1 = MCBSP_open(dev_no, MCBSP_OPEN_RESET);
tempconfig1.spcr1 = MCBSP_SPCR1_RMK( MCBSP_SPCR1_DLB_OFF,
MCBSP_SPCR1_RJUST_RZF, //字符向lsb对齐,高位添0
MCBSP_SPCR1_CLKSTP_DISABLE, //正常,非spi方式
MCBSP_SPCR1_DXENA_OFF,
MCBSP_SPCR1_ABIS_DISABLE,
MCBSP_SPCR1_RINTM_RRDY,
MCBSP_SPCR1_RSYNCERR_NO,
MCBSP_SPCR1_RFULL_NO,
MCBSP_SPCR1_RRDY_NO,
MCBSP_SPCR1_RRST_DISABLE);
tempconfig1.spcr2 = MCBSP_SPCR2_RMK( MCBSP_SPCR2_FREE_YES, //emulator断点不影响mcbsp
MCBSP_SPCR2_SOFT_NO, //无影响
MCBSP_SPCR2_FRST_FSG,
MCBSP_SPCR2_GRST_CLKG,
MCBSP_SPCR2_XINTM_XRDY,
MCBSP_SPCR2_XSYNCERR_NO,
MCBSP_SPCR2_XEMPTY_YES,
MCBSP_SPCR2_XRDY_NO,
MCBSP_SPCR2_XRST_DISABLE);
tempconfig1.rcr1 = MCBSP_RCR1_RMK( MCBSP_RCR1_RFRLEN1_OF(0),
MCBSP_RCR1_RWDLEN1_16BIT);
tempconfig1.rcr2 = MCBSP_RCR2_RMK( MCBSP_RCR2_RPHASE_SINGLE, //单pahse方式
MCBSP_RCR2_RFRLEN2_OF(1),
MCBSP_RCR2_RWDLEN2_16BIT,
MCBSP_RCR2_RCOMPAND_MSB, //无compand,msb在先发
MCBSP_RCR2_RFIG_YES, //不理会不合适的fsync信号???应该置为no
MCBSP_RCR2_RDATDLY_0BIT);
tempconfig1.xcr1 = MCBSP_XCR1_RMK(MCBSP_XCR1_XFRLEN1_OF(1),
MCBSP_XCR1_XWDLEN1_16BIT);
tempconfig1.xcr2 = MCBSP_XCR2_RMK(MCBSP_XCR2_XPHASE_SINGLE,
MCBSP_XCR2_XFRLEN2_OF(1),
MCBSP_XCR2_XWDLEN2_16BIT,
MCBSP_XCR2_XCOMPAND_MSB,
MCBSP_XCR2_XFIG_YES,
MCBSP_XCR2_XDATDLY_0BIT);
tempconfig1.srgr1 = MCBSP_SRGR1_RMK(MCBSP_SRGR1_FWID_OF(1),
MCBSP_SRGR1_CLKGDV_OF(1));
tempconfig1.srgr2 = MCBSP_SRGR2_RMK(MCBSP_SRGR2_GSYNC_FREE, //忽略相当于忽略外部fsr
MCBSP_SRGR2_CLKSP_RISING,
MCBSP_SRGR2_CLKSM_INTERNAL,
MCBSP_SRGR2_FSGM_DXR2XSR,
MCBSP_SRGR2_FPER_OF(15));
tempconfig1.mcr1 = MCBSP_MCR1_RMK(MCBSP_MCR1_RMCME_NO,
MCBSP_MCR1_RPBBLK_SF1,
MCBSP_MCR1_RPABLK_SF0,
MCBSP_MCR1_RCBLK_SF0 ,
MCBSP_MCR1_RMCM_CHENABLE); //全部通道都设置为有效,非multi channel方式
tempconfig1.mcr2 = MCBSP_MCR2_RMK(MCBSP_MCR2_XMCME_NO,
MCBSP_MCR2_XPBBLK_SF1,
MCBSP_MCR2_XPABLK_SF0,
MCBSP_MCR2_XCBLK_SF0,
MCBSP_MCR2_XMCM_ENNOMASK); //所有通道都设置为有效,非multi channel方式
tempconfig1.pcr = MCBSP_PCR_RMK(MCBSP_PCR_IDLEEN_RESET,
MCBSP_PCR_XIOEN_SP,
MCBSP_PCR_RIOEN_SP,
MCBSP_PCR_FSXM_INTERNAL,
MCBSP_PCR_FSRM_EXTERNAL,
MCBSP_PCR_SCLKME_NO,
MCBSP_PCR_CLKSSTAT_0,
MCBSP_PCR_DXSTAT_0,
MCBSP_PCR_DRSTAT_0,
MCBSP_PCR_CLKXM_OUTPUT,
MCBSP_PCR_CLKRM_INPUT,
MCBSP_PCR_FSXP_ACTIVEHIGH,
MCBSP_PCR_FSRP_ACTIVEHIGH,
MCBSP_PCR_CLKXP_RISING,
MCBSP_PCR_CLKRP_FALLING);
tempconfig1.rcera = MCBSP_RCERA_DEFAULT;
tempconfig1.rcerb = MCBSP_RCERB_DEFAULT;
tempconfig1.rcerc = MCBSP_RCERC_DEFAULT;
tempconfig1.rcerd = MCBSP_RCERD_DEFAULT;
tempconfig1.rcere = MCBSP_RCERE_DEFAULT;
tempconfig1.rcerf = MCBSP_RCERF_DEFAULT;
tempconfig1.rcerg = MCBSP_RCERG_DEFAULT;
tempconfig1.rcerh = MCBSP_RCERH_DEFAULT;
tempconfig1.xcera = MCBSP_XCERA_DEFAULT;
tempconfig1.xcerb = MCBSP_XCERB_DEFAULT;
tempconfig1.xcerc = MCBSP_XCERC_DEFAULT;
tempconfig1.xcerd = MCBSP_XCERD_DEFAULT;
tempconfig1.xcere = MCBSP_XCERE_DEFAULT;
tempconfig1.xcerf = MCBSP_XCERF_DEFAULT;
tempconfig1.xcerg = MCBSP_XCERG_DEFAULT;
tempconfig1.xcerh = MCBSP_XCERH_DEFAULT;
MCBSP_config(handle1, &tempconfig1);
// MCBSP_start(HANDLE,MCBSP_RCV_START|MCBSP_XMIT_START|
// MCBSP_SRGR_START|MCBSP_SRGR_FRAMESYNC,0x300u);
return(handle1);
}
void McBspLocalLoopBack(MCBSP_Handle hmc,Uint16 loop) //loop=0:normal;1:loop back
{
MCBSP_FSET_H(hmc,SPCR1,DLB,loop);
}
void McBspSetRxGpio(MCBSP_Handle hmc,Uint16 port_mode )
//portmode=0 表示设置为正常(mcbsp),
// 1,表示设置为gpio
{
MCBSP_FSET_H(hmc,PCR,RIOEN,port_mode);
}
void McBspSetTxGpio(MCBSP_Handle hmc,Uint16 port_mode )
//portmode=0 表示设置为正常(mcbsp),
// 1,表示设置为gpio
{
MCBSP_FSET_H(hmc,PCR,XIOEN,port_mode);
}
void McBspSetRxFrameWord(MCBSP_Handle hmc,Uint16 word_len,Uint16 fr_len,Uint16 fr_wid,
Uint16 dat_dly /*数据首比特相对frame的延迟delay:0/1/2*/
)
/*
word_len取下值之一:
#define MCBSP8BIT 0
#define MCBSP12BIT 1
#define MCBSP16BIT 2
#define MCBSP20BIT 3
#define MCBSP24BIT 4
#define MCBSP32BIT 5
*/
{ Uint16 fclk_len=0;
Uint16 word_sz[6]={8,12,16,20,24,32};
fclk_len=fr_len*word_sz[word_len]-1;
MCBSP_FSET_H(hmc,RCR1,RWDLEN1,word_len);
MCBSP_FSET_H(hmc,RCR1,RFRLEN1,(fr_len-1)); //len个word
MCBSP_FSET_H(hmc,RCR2,RDATDLY,dat_dly);
MCBSP_FSET_H(hmc,SRGR2,FPER,fclk_len);
MCBSP_FSET_H(hmc,SRGR1,FWID,(fr_wid-1));
}
void McBspSetTxFrameWord(MCBSP_Handle hmc,Uint16 word_len,Uint16 fr_len,Uint16 fr_wid,
Uint16 dat_dly /*数据首比特相对frame的延迟delay:0/1/2*/
)
/*
word_len取下值之一:
#define MCBSP8BIT 0
#define MCBSP12BIT 1
#define MCBSP16BIT 2
#define MCBSP20BIT 3
#define MCBSP24BIT 4
#define MCBSP32BIT 5
*/
{ Uint16 fclk_len=0;
Uint16 word_sz[6]={8,12,16,20,24,32};
fclk_len=fr_len*word_sz[word_len]-1;
MCBSP_FSET_H(hmc,XCR1,XWDLEN1,word_len);
MCBSP_FSET_H(hmc,XCR1,XFRLEN1,(fr_len-1)); //len个word
MCBSP_FSET_H(hmc,XCR2,XDATDLY,dat_dly);
MCBSP_FSET_H(hmc,SRGR2,FPER,fclk_len);
MCBSP_FSET_H(hmc,SRGR1,FWID,(fr_wid-1));
}
void McBspSetRxFrame(MCBSP_Handle hmc,Uint16 fs_extern /*是否是外部fs*/,
Uint16 pola /*帧同步的极性*/
)
/*
#define MCBSP_EXTERNAL_FS 0 //外部帧同步信号
#define MCBSP_INTERNAL_FS 1 //内部帧同步信号
#define MCBSP_FS_POLAR_HIGH 0 //正极性
#define MCBSP_FS_POLAR_LOW 1 //负极性
*/
{
if(fs_extern==MCBSP_EXTERNAL_FS){
MCBSP_FSET_H(hmc,PCR,FSRM,0);
MCBSP_FSET_H(hmc,SRGR2,GSYNC,1); //始终与外部fsr同步
}
else{
MCBSP_FSET_H(hmc,PCR,FSRM,1);
MCBSP_FSET_H(hmc,SRGR2,GSYNC,0); //忽略相当于忽略外部fsr
}
MCBSP_FSET_H(hmc,PCR,FSRP,pola);
}
void McBspSetTxFrame(MCBSP_Handle hmc,Uint16 fs_extern /*是否是外部fs*/,
Uint16 pola /*帧同步的极性*/
)
/*
#define MCBSP_EXTERNAL_FS 0
#define MCBSP_INTERNAL_FS 1
#define MCBSP_FS_POLAR_HIGH 0 //正极性
#define MCBSP_FS_POLAR_LOW 1 //负极性
*/
{
if(fs_extern==MCBSP_EXTERNAL_FS){
MCBSP_FSET_H(hmc,PCR,FSXM,0);
}
else{
MCBSP_FSET_H(hmc,PCR,FSXM,1);
}
//MCBSP_FSET_H(hmc,SPGR2,GSYNC,0); //忽略相当于忽略外部fsr
MCBSP_FSET_H(hmc,SRGR2,FSGM,1); //1:通过sample rate generator产生fs;0:每发一个数据产生一个fs
MCBSP_FSET_H(hmc,PCR,FSXP,pola);
}
void McBspSetTxClk(MCBSP_Handle hmc,Uint16 div /*分频比*/,Uint16 clk_src /*是否是外部fs*/,
Uint16 pola /*帧同步的极性*/
)
/*
#define MCBSP_EXTERNAL_SGR_CLK 0
#define MCBSP_CPU_SGR_CLK 1
#define MCBSP_CLKR_CLK 2
#define MCBSP_CLKX_CLK 3
#define MCBSP_CLKR_SGR_CLK 4
#define MCBSP_CLKX_SGR_CLK 5
#define MCBSP_CLK_POLAR_UP 1 //上升沿采样
#define MCBSP_CLK_POLAR_DOWN 0 //下降沿采样
#define MCBSP_CLK_SRC_YES 0
#define MCBSP_CLK_SRC_NO 1
*/
{
switch(clk_src){
case MCBSP_EXTERNAL_SGR_CLK:
MCBSP_FSET_H(hmc,PCR,CLKXM,1);
MCBSP_FSET_H(hmc,SRGR2,CLKSM,0);
MCBSP_FSET_H(hmc,PCR,SCLKME,0);
MCBSP_FSET_H(hmc,SRGR2,CLKSP,(1^pola));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -