载入中...

大飞工作室主要从事应用软件开发和各类电子设计及相关技术服务。大飞工作室将为您提供以下服务:单片机、DSP、FPGA等各种电子产品设计及图像处理相关应用软件开发,并有自主研发的高帧频摄像机出售。联系QQ:56085一九五, 手机:18007135四二二,邮箱:手机号@189.cn
载入中...

留言簿

公告

最新日志

最新评论

搜索

登陆

友情连接

统计

2010-6-5 2:45:00
[原创]BF533与tlv320aic23接口实现 

申明:未得本人同意,不得转载本文。

这是实现计算机与设备视频通话的一部分--语音部分。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。实验结果上位机的声音在设备里播放几乎没有延时。

posted @ 2010-6-5 2:45:00 dpf_eei 阅读全文 | 回复(0) | 引用通告 | 编辑
发表评论:
载入中...