📄 codec.c
字号:
/*H******************************************************************************* $Archive:: $* $Revision:: $* $Date:: $* $Author:: $** DESCRIPTION: TMS320C64xx TEB CODEC interface.** GLOBALS ** PUBLIC FUNCTIONS:* GLOBAL int CODEC_SetConfiguration( CODEC_CONFIG *pCodeConfig )* GLOBAL int CODEC_WriteMode( int ModeReg, int ModeVal )* GLOBAL int CODEC_AudioSample( AUDIO_SAMPLE pAudioSample )** PRIVATE FUNCTIONS:** USAGE/LIMITATIONS:** NOTES: Assumes TMS320C64x TEB, with CPLD connected to EMIF B, TBCE0,* little endian.***H***************************************************************************/#define codec_c/*---- compilation control switches ----------------------------------------*//****************************************************************************** INCLUDE FILES*****************************************************************************//*---- system and platform files -------------------------------------------*/#include <stdlib.h>#include <stdio.h>#include <c6x.h>/*---- program files -------------------------------------------------------*/#include "c6416teb.h"#include "cpld.h"#include "codec.h"/****************************************************************************** EXTERNAL REFERENCE *****************************************************************************//*---- data declarations ---------------------------------------------------*//*---- function prototypes -------------------------------------------------*//****************************************************************************** PUBLIC DECLARATIONS *****************************************************************************//*---- data declarations ---------------------------------------------------*//****************************************************************************** PRIVATE DECLARATIONS *****************************************************************************//*---- context -------------------------------------------------------------*/MCBSP_Handle hMcbsp = NULL;int sin_table[] = { 0, 23170, 32767, 23170, 0, -23170, -32767, -23170 };int ChannelMode = BOTH_CHANNEL;/*---- data declarations ---------------------------------------------------*//*---- function prototypes -------------------------------------------------*//*---- macros --------------------------------------------------------------*//****************************************************************************** PUBLIC FUNCTION DEFINITIONS*****************************************************************************//*F**************************************************************************** NAME: MCBSP_Init()** DESCRIPTION: Init the C64xx McBSP 0 * * NOTES:* *F***************************************************************************/void MCBSP_Init( void ){ // #PCR // FSXP/FSRP falling // CLKXP falling // CLKRP rising // # RCR // RWDLEN1 32 bits 0x5 // RFRLEN1 2 (Left/Right) // # XCR // XWDLEN1 32 bits 0x5 // XRRLEN1 2 (Left/Right) // # SPCR // RRST ON // RJUST Left-justify and zero fill LSB of DDR // XRST ON // FREE ON MCBSP_Config Config; MCBSP_getConfig(hMcbsp, &Config); Config.pcr = 0x0000000F; Config.rcr = 0x000001A0; Config.xcr = 0x000001A0; Config.spcr = 0x02014001; MCBSP_config(hMcbsp, &Config); // Dummy write MCBSP_write(hMcbsp, 0 ); }/*F**************************************************************************** NAME: MCBSP_Write()** DESCRIPTION: Wait for xrdy and write value to McBSP * * NOTES:* *F***************************************************************************/void MCBSP_Write( int Data ){ while(!MCBSP_xrdy(hMcbsp)); MCBSP_write(hMcbsp, (Uint32)Data );}/*F**************************************************************************** NAME: MCBSP_Read()** DESCRIPTION: Wait for rrdy and read value from McBSP * * NOTES:* *F***************************************************************************/int MCBSP_Read( void ){ Uint32 Temp; while(!MCBSP_rrdy(hMcbsp)); Temp = MCBSP_read(hMcbsp); return( Temp>>16 );}/*F**************************************************************************** NAME: CODEC_SetConfiguration()** DESCRIPTION: Set Codec config via the CPLD * * NOTES:* *F***************************************************************************/intCODEC_SetConfiguration( CODEC_CONFIG *pCodeConfig ){ CODEC_WriteMode( MODE_REG0, pCodeConfig->ModeReg0 ); CODEC_WriteMode( MODE_REG1, pCodeConfig->ModeReg1 ); CODEC_WriteMode( MODE_REG2, pCodeConfig->ModeReg2 ); CODEC_WriteMode( MODE_REG3, pCodeConfig->ModeReg3 ); return( 0 );}/*F**************************************************************************** NAME: CODEC_WriteMode()** DESCRIPTION: Write the code mode via the CPLD * * NOTES:* *F***************************************************************************/int CODEC_WriteMode( int ModeReg, int ModeVal ){ int ModeMask; int Timeout; switch( ModeReg ) { case 0: case 1: case 2: ModeMask = 0x01FF; break; case 3: ModeMask = 0x002E; break; default: return( 0 ); } ModeVal &= ModeMask; ModeVal |= (ModeReg << 9); Timeout = 1000; do { if( CPLD_IsCodecReady() ) { CPLD_WriteCodecMode( ModeVal ); return( ModeVal ); } }while( Timeout-- > 0 ); // Fail return 0 return(0);}/*F**************************************************************************** NAME: CODEC_AudioSample()** DESCRIPTION: Write/Read a audio sample to/from the right or left channel * * NOTES:* *F***************************************************************************/int CODEC_AudioSample( AUDIO_SAMPLE * pAudioSample ){ if( ChannelMode & RIGHT_CHANNEL ) { MCBSP_Write( pAudioSample->RChOut ); pAudioSample->RChIn = MCBSP_Read(); } if( ChannelMode & LEFT_CHANNEL ) { MCBSP_Write( pAudioSample->LChOut ); pAudioSample->LChIn = MCBSP_Read(); } return( 0 );}/*F**************************************************************************** NAME: CODEC_PlayTone()** DESCRIPTION: Play a tune, mate, uh I mean a tone. * * NOTES:* *F***************************************************************************/void CODEC_PlayTone( int Number, int TonePlayBk, int LR_Channel){ int i,j; AUDIO_SAMPLE AudioSample; CODEC_CONFIG CodecConfig = { MR0_DEFAULT, MR1_DEFAULT, MR2_DEFAULT, MR3_DEFAULT }; hMcbsp = MCBSP_open(MCBSP_DEV0, MCBSP_OPEN_RESET); CODEC_SetConfiguration( &CodecConfig ); MCBSP_Init(); if(TonePlayBk) { for (i=0;i<Number;i++) { for (j=0;j<8;j++) { // If both channels are on, (McBsp is two word frame) // then send tone data or 0 based on the user LR_Channel // request. // if( ChannelMode == BOTH_CHANNEL ) { MCBSP_Write( (LR_Channel & RIGHT_CHANNEL ) ? sin_table[j] : 0 ); MCBSP_Write( (LR_Channel & LEFT_CHANNEL ) ? sin_table[j] : 0 ); } else MCBSP_Write(sin_table[j]); } } } else { AudioSample.LChOut = 0; AudioSample.RChOut = 0; AudioSample.LChIn = 0; AudioSample.RChIn = 0; CODEC_AudioSample( &AudioSample ); for (i=0;i<Number;i++) { AudioSample.LChOut = AudioSample.LChIn; AudioSample.RChOut = AudioSample.RChIn; CODEC_AudioSample( &AudioSample ); } } MCBSP_close(hMcbsp); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -