📄 csl_mcbsphwsetup.c
字号:
/** \file csl_mcbspHwSetup.c
*
* \brief File for functional layer of CSL API \a CSL_mcbspHwSetup()
*
* Description
* - The \a CSL_mcbspHwSetup() function contains definition of the
* functional layer API
*
* Path: \\(CSLPATH)\\ipmodules\\mcbsp\\src
*
*/
/** ==========================================================
* @modif SPCR1, SPCR2, RCR1, RCR2, XCR1, XCR2, SRGR1, SRGR2, MCR1,
*/
#include <csl_mcbsp.h>
/**
* Configures the MCBSP using the values passed in the setup structure.
*
* <b> Usage Constraints: </b>
* Both @a CSL_mcbspInit() and @a CSL_mcbspOpen() must be called successfully
* in that order before this function can be called. The setup structure
* consists of the logically grouped sub-structures. The main setup structure
* as well as these sub-structures must be filled up before calling this
* function
*
* @b Example:
* @verbatim
CSL_mcbspHandle hMcbsp;
CSL_McbspHwSetup hwSetup = CSL_MCBSP_HWSETUP_DEFAULTS;
...
// Init Successfully done
...
// Open Successfully done
...
CSL_mcbspHwSetup(hMcbsp, &hwSetup);
@endverbatim
*
* @return Status of the setup operation
*
*/
#pragma CODE_SECTION (CSL_mcbspHwSetup, ".text:csl_section:mcbsp");
CSL_Status CSL_mcbspHwSetup(
/** MCBSP handle returned by successful 'open' */
CSL_McbspHandle hMcbsp,
/** Pointer to the intialized setup structure */
CSL_McbspHwSetup *setup
)
{
CSL_McbspRegsOvly mcbspRegs = hMcbsp->regs;
if(setup == NULL) return (CSL_ESYS_INVPARAMS);
if (hMcbsp == NULL)
return CSL_ESYS_BADHANDLE;
/* Set Emulation Mode Configuration */
CSL_FINS(mcbspRegs->SPCR, MCBSP_SPCR_SOFT, setup->emumode );
CSL_FINS(mcbspRegs->SPCR, MCBSP_SPCR_FREE, setup->emumode >> 1);
/*Clock and Frame Sync Configuration*/
if(setup->clkset != NULL ){
CSL_McbspClkSetup clkCfg = *(setup->clkset);
mcbspRegs->PCR = CSL_FMK( MCBSP_PCR_FSRM, clkCfg.frmSyncRxMode )|
CSL_FMK( MCBSP_PCR_FSXM, clkCfg.frmSyncTxMode )|
CSL_FMK( MCBSP_PCR_FSRP, clkCfg.frmSyncRxPolarity )|
CSL_FMK( MCBSP_PCR_FSXP, clkCfg.frmSyncTxPolarity )|
CSL_FMK( MCBSP_PCR_CLKRM, clkCfg.clkRxMode )|
CSL_FMK( MCBSP_PCR_CLKXM, clkCfg.clkTxMode )|
CSL_FMK( MCBSP_PCR_CLKRP, clkCfg.clkRxPolarity )|
CSL_FMK( MCBSP_PCR_CLKXP, clkCfg.clkTxPolarity)|
CSL_FMK( MCBSP_PCR_SCLKME, clkCfg.srgInputClkMode >> 0x1 );
mcbspRegs->SRGR = CSL_FMK( MCBSP_SRGR_FWID, clkCfg.srgFrmPulseWidth )|
CSL_FMK( MCBSP_SRGR_CLKGDV, clkCfg.srgClkDivide )|
CSL_FMK( MCBSP_SRGR_FPER, clkCfg.srgFrmPeriod )|
CSL_FMK( MCBSP_SRGR_GSYNC, clkCfg.srgClkSync )|
CSL_FMK( MCBSP_SRGR_CLKSM, clkCfg.srgInputClkMode & 0x1)|
CSL_FMK( MCBSP_SRGR_CLKSP, clkCfg.srgClkPolarity )|
CSL_FMK( MCBSP_SRGR_FSGM, clkCfg.srgTxFrmSyncMode );
}
/*McBSP Global Configuration*/
if(setup->global!= NULL)
{
CSL_McbspGlobalSetup globalCfg = *(setup->global);
CSL_FINS( mcbspRegs->SPCR, MCBSP_SPCR_DLB, globalCfg.dlbMode );
CSL_FINS( mcbspRegs->SPCR, MCBSP_SPCR_CLKSTP, globalCfg.clkStopMode );
CSL_FINS( mcbspRegs->PCR, MCBSP_PCR_RIOEN, globalCfg.ioEnableMode & 0x1 );
CSL_FINS( mcbspRegs->PCR, MCBSP_PCR_XIOEN, globalCfg.ioEnableMode >> 1 );
}
/*Transmitter Configuration*/
if(setup->txdataset != NULL)
{
CSL_McbspDataSetup transmitterCfg = *(setup->txdataset);
CSL_FINS( mcbspRegs->SPCR, MCBSP_SPCR_XRST, 0 );
mcbspRegs->XCR = CSL_FMK( MCBSP_XCR_XWDLEN1, transmitterCfg.wordLength1 )|
CSL_FMK( MCBSP_XCR_XWDREVRS, transmitterCfg.wordReverse)|
CSL_FMK( MCBSP_XCR_XPHASE, transmitterCfg.phaseNum )|
CSL_FMK( MCBSP_XCR_XWDLEN2, transmitterCfg.wordLength2 )|
CSL_FMK( MCBSP_XCR_XFRLEN2, (transmitterCfg.frmLength2 - 1) )|
CSL_FMK( MCBSP_XCR_XFIG, transmitterCfg.frmSyncIgn )|
CSL_FMK( MCBSP_XCR_XCOMPAND, transmitterCfg.compand )|
CSL_FMK( MCBSP_XCR_XDATDLY, transmitterCfg.dataDelay );
if (setup->mulCh && setup->mulCh->tx512channel) {
CSL_FINS ( mcbspRegs->XFLR, MCBSP_XFLR_XFRLEN3, (transmitterCfg.frmLength1 - 1));
} else {
CSL_FINS( mcbspRegs->XCR, MCBSP_XCR_XFRLEN1, (transmitterCfg.frmLength1 - 1) );
}
CSL_FINS( mcbspRegs->SPCR, MCBSP_SPCR_DXENA, transmitterCfg.rjust_dxenable );
CSL_FINS( mcbspRegs->SPCR, MCBSP_SPCR_XINTM, transmitterCfg.IntEvent );
}
/*Receiver Configuration*/
if(setup->rxdataset != NULL)
{
CSL_McbspDataSetup receiverCfg = *(setup->rxdataset);
CSL_FINS( mcbspRegs->SPCR, MCBSP_SPCR_RRST, 0 );
mcbspRegs->RCR = CSL_FMK( MCBSP_RCR_RWDLEN1, receiverCfg.wordLength1 )|
CSL_FMK( MCBSP_RCR_RWDREVRS, receiverCfg.wordReverse )|
CSL_FMK( MCBSP_RCR_RPHASE, receiverCfg.phaseNum )|
CSL_FMK( MCBSP_RCR_RWDLEN2, receiverCfg.wordLength2 )|
CSL_FMK( MCBSP_RCR_RFRLEN2, (receiverCfg.frmLength2 - 1) )|
CSL_FMK( MCBSP_RCR_RFIG, receiverCfg.frmSyncIgn )|
CSL_FMK( MCBSP_RCR_RCOMPAND, receiverCfg.compand )|
CSL_FMK( MCBSP_RCR_RDATDLY, receiverCfg.dataDelay );
if (setup->mulCh && setup->mulCh->rx512channel) {
CSL_FINS ( mcbspRegs->RFLR, MCBSP_RFLR_RFRLEN3, (receiverCfg.frmLength1 - 1));
} else {
CSL_FINS( mcbspRegs->RCR, MCBSP_RCR_RFRLEN1, (receiverCfg.frmLength1 - 1) );
}
CSL_FINS( mcbspRegs->SPCR, MCBSP_SPCR_RJUST, receiverCfg.rjust_dxenable );
CSL_FINS( mcbspRegs->SPCR, MCBSP_SPCR_RINTM, receiverCfg.IntEvent );
}
/* Multi Channel Configuration */
if(setup->mulCh != NULL)
{
CSL_McbspMulChSetup multiChCfg = *(setup->mulCh);
mcbspRegs->MCR = CSL_FMK( MCBSP_MCR_RMCM, multiChCfg.rxMulChSel )|
CSL_FMK( MCBSP_MCR_RMCME, multiChCfg.rxPartition )|
CSL_FMK( MCBSP_MCR_RPABLK, multiChCfg.rxPartABlk )|
CSL_FMK( MCBSP_MCR_RPBBLK, multiChCfg.rxPartBBlk )|
CSL_FMK( MCBSP_MCR_REMODE, multiChCfg.rx512channel)|
CSL_FMK( MCBSP_MCR_XMCM, multiChCfg.txMulChSel )|
CSL_FMK( MCBSP_MCR_XMCME, multiChCfg.txPartition )|
CSL_FMK( MCBSP_MCR_XPABLK, multiChCfg.txPartABlk )|
CSL_FMK( MCBSP_MCR_XPBBLK, multiChCfg.txPartBBlk )|
CSL_FMK( MCBSP_MCR_XEMODE, multiChCfg.tx512channel)|
CSL_FMK( MCBSP_MCR_DX, setup->dxState);
}
mcbspRegs->RSYNCCNT = setup->rxsynccount;
mcbspRegs->XSYNCCNT = setup->txsynccount;
return(CSL_SOK);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -