|
申明:未得本人同意,不得转载本文。
这是实现计算机与设备视频通话的一部分--语音部分。tlv320aic23是TI的音频CODEC,与以与TI DSP的MCBSP接口实现无缝连接,以前实现过TI的MCBSP与ADI的SPORT接口的无缝连接,所以这次用TI的tlv320aic23做音频接口芯片,与ADI的BF533直接相连实现语音通信。
通信过程为:计算机与设备通过以态网相连,上位机捕获计算机的MIC的PCM信号,以UDP的方式发送给设备,设备收到音频数据后送tlv320aic23进行播放;同样,tlv320aic23得到的设备MIC数据也用以态网发给上位机,上位机程序在计算机里播放声音,从而实现语音的双向通信。
在设备端,难点在于对tlv320aic23有初始化配置及SPORT的配置。由于tlv320aic23的数字接口最小为16位的两声道(共32位),所以在SPORT接收tlv320aic23的数据时,只接收一个声道的数据(16位),另一个声道的数据丢弃。对tlv320aic23数据接收和发送均采用DMA模式,双缓冲,这样不占用CPU资源还能减少声音的延时。下面贴出DSP端的代码供参考:
void sport_init(void) { *pSIC_IMASK |= 0x00000200;//Senable Sport0 RX interrupt *pSPORT0_RCR1 = 0x6400;// 时钟上升沿采数据和同步信号,early *pSPORT0_RCR2 = 0xF ;//| 0x200;//8 *pSPORT0_TCR1 = 0x6400;// 0x1400;//RFSR | 0x400|0x10000; *pSPORT0_TCR2 = 0xF; }
EX_INTERRUPT_HANDLER(SPORT0_ISR) { *pDMA1_IRQ_STATUS |= 0x0001; *pDMA2_IRQ_STATUS |= 0x0001; *pDMA1_CONFIG = (*pDMA1_CONFIG & 0xFFFE); *pDMA2_CONFIG = (*pDMA2_CONFIG & 0xFFFE); if(work_param.AIC32_in_index == 0 ) { *pDMA1_START_ADDR = (void *)iRxBuffer2; *pDMA2_START_ADDR = (void *)iTxBuffer1; work_param.AIC32_in_index = 1; } else { *pDMA1_START_ADDR = (void *)iRxBuffer1; *pDMA2_START_ADDR = (void *)iTxBuffer2; work_param.AIC32_in_index = 0; } *pDMA1_CONFIG = (*pDMA1_CONFIG | 0x01); *pDMA2_CONFIG = (*pDMA2_CONFIG | 0x01); work_param.SportBusy = 0; }
void Init_Sport_DMA(void) { // Map DMA1 to Sport0 RX //*pDMA1_PERIPHERAL_MAP = 0x1000; *pDMA1_CONFIG = 0x1086;//0x108A;//0x10A6; *pDMA1_X_MODIFY = 2; *pDMA1_START_ADDR = (void *)iRxBuffer1; *pDMA1_X_COUNT = 512;
*pDMA2_START_ADDR = (void *)iTxBuffer1; *pDMA2_CONFIG = 0x1084; *pDMA2_X_COUNT = 512; *pDMA2_X_MODIFY = 2; } //--------------------------------------------------------------------------// // : Enable_DMA_Sport // // // // Deion: Enable DMA1, DMA2, Sport0 TX and Sport0 RX // //--------------------------------------------------------------------------// void Enable_DMA_Sport0(void) { // enable DMAs //*pDMA2_CONFIG = (*pDMA2_CONFIG | DMAEN); *pDMA1_CONFIG = (*pDMA1_CONFIG | DMAEN); *pSPORT0_RCR1 = (*pSPORT0_RCR1 | RSPEN); *pDMA2_CONFIG |=0x0001;//Enable DMA channel,HWR374 *pSPORT0_TCR1 |= 0x0001;//Transmit enabled,HWR520 }
void Disable_DMA_Sport0(void) { // enable DMAs //*pDMA2_CONFIG = (*pDMA2_CONFIG | DMAEN); *pDMA1_CONFIG = (*pDMA1_CONFIG & 0xFFFE); *pSPORT0_RCR1 = (*pSPORT0_RCR1 & 0xFFFE); *pDMA2_CONFIG = (*pDMA2_CONFIG & 0xFFFE); *pSPORT0_TCR1 = (*pSPORT0_TCR1 & 0xFFFE); }
对tlv320aic23的初始化代码如下:
void AIC32_init(void)//对音频编解码芯片初始化 { write_audio_reg(0x0F,0);//复位AIC32 write_audio_reg(0x00,0x17); write_audio_reg(0x01,0x17); write_audio_reg(0x02,0x07f);
write_audio_reg(0x03,0x07f); write_audio_reg(0x04,0x14);//启动DAC和麦克风输入 write_audio_reg(0x05,0x02); write_audio_reg(0x06,1);//打开电源 write_audio_reg(0x07,0x43);// 数字音频格式设置:MS = 1, (主模式) IWL = 00 (输入长度16 位) FOR = 11(数据初始化,DSP初始化,帧同步来自于2个字) write_audio_reg(0x08,0x0D);//0D// 样本速率控制: USB 模式(主时钟MCLK = 12M) ,ADC,DAC的采样率为8khz, write_audio_reg(0x09,0x01);//数字接口激活 }
上位机软件的对声音的处理:读写音频数据均采用双缓冲实现,在收到计算机的MIC数据时就立即发送给设备,不用做缓存。在播放时,需要8Kbytes左右的循环缓冲,由于音频采样用16位宽,所以播放延时最大为0.5S。实验结果上位机的声音在设备里播放几乎没有延时。
|