?? tmcbsp55.c.bak
字號(hào):
//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 發(fā)送初始化為 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 /*設(shè)備號(hào):0,2*/ )
//做必要的缺省設(shè)置并打開(kāi)一個(gè)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對(duì)齊,高位添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斷點(diǎn)不影響mcbsp
MCBSP_SPCR2_SOFT_NO, //無(wú)影響
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, //無(wú)compand,msb在先發(fā)
MCBSP_RCR2_RFIG_YES, //不理會(huì)不合適的fsync信號(hào)???應(yīng)該置為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, //忽略相當(dāng)于忽略外部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); //全部通道都設(shè)置為有效,非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); //所有通道都設(shè)置為有效,非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 表示設(shè)置為正常(mcbsp),
// 1,表示設(shè)置為gpio
{
MCBSP_FSET_H(hmc,PCR,RIOEN,port_mode);
}
void McBspSetTxGpio(MCBSP_Handle hmc,Uint16 port_mode )
//portmode=0 表示設(shè)置為正常(mcbsp),
// 1,表示設(shè)置為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 /*數(shù)據(jù)首比特相對(duì)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個(gè)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 /*數(shù)據(jù)首比特相對(duì)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個(gè)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 //外部幀同步信號(hào)
#define MCBSP_INTERNAL_FS 1 //內(nèi)部幀同步信號(hào)
#define MCBSP_FS_POLAR_HIGH 0 //正極性
#define MCBSP_FS_POLAR_LOW 1 //負(fù)極性
*/
{
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); //忽略相當(dāng)于忽略外部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 //負(fù)極性
*/
{
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); //忽略相當(dāng)于忽略外部fsr
MCBSP_FSET_H(hmc,SRGR2,FSGM,1); //1:通過(guò)sample rate generator產(chǎn)生fs;0:每發(fā)一個(gè)數(shù)據(jù)產(chǎn)生一個(gè)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));
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -