您的位置:首页 > 其它

STM32 PCM1770调试

2015-11-24 22:13 323 查看
本文初步介绍了PCM1770配置方法与调试过程,希望能起到抛砖引玉的作用。 PCM1770是24位的DAC,支持I2S信号输入,可直接驱动耳机,也可加后级功放来驱动喇叭,应用电压范围为-0.3V至4V,普通的3V3就可以。

     如图1所示,该DAC对22KHZ以上频率有60dB的衰减,相当于自带一个低通滤波,减少了后级的干扰。

     如图2所示,该DAC在3V3电压条件下有100dB的信噪比,72dB的分离度确实低了点,用来玩玩还行。



                                                                                                                             
图1



                                                                                                                            图2

接下来讲PCM1770的上电时序,芯片手册中如图3对上电时序描写的很清楚,就是在VCC起来至少1ms之后,将PD引脚拉高,在1024个内部系统时钟后,芯片内部会自动复位,之后双输出会拉高表示复位成功。可以利用GPIO进行PD的操作,也可利用单片机内部的Reset引脚进行硬件复位,我采用了第二种方法,复位电路如图4,时序如图5,CH1是RESET端(PD),CH2是VCC,可见,PD拉高是在VCC拉高1.2ms之后,满足PCM1770的复位时序要求。



                                                                                                    
图3


  


                                     图4                                                                                                                                     图5

        再来看看PCM1770的配置寄存器和寄存器的写入时序,常用到的寄存器如图6,关于软件静音、音量衰减、模拟混合等功能可按自己的需求去配置,因为我们用到的数据传输格式为I2S,故在这里必须要配置音频数据传输格式选择寄存器,由图7可得,输出传输数据协议的选择主要是配置FMT寄存器的3个位,使用I2S进行数据传输需将FMT配置为001,从图6看出FMT的3个位位于寄存器3,地址为03h,因此可知要写入数据为0000 0011 0000 0001b。



                                                                                                                            图6



                                                                                                                          
图7



                                                                                                                          
图8



                                                                                                                         
图9
       

      寄存器的写入时序如图8和图9,图8对其进行了简单的描述,就是指MS拉低,MC作为时钟运行,MD发送16位的数据,前8位为写入寄存器的地址,后8位为写入的数据;图9对时序进行了详细的规定,对此编写的简单代码如下。

void init_hardware(){
int i=15;
GPIO_ResetBits(GPIOC, GPIO_Pin_10);//MC
delay_nms(2);
GPIO_ResetBits(GPIOC, GPIO_Pin_7);//MS
delay_nms(2);
  while(i>=0){
delay_nms(1);
  GPIO_ResetBits(GPIOC, GPIO_Pin_10);//第1次上升沿
if(i==0){
GPIO_SetBits(GPIOC, GPIO_Pin_12);
  }else if(i==9){
GPIO_SetBits(GPIOC, GPIO_Pin_12);
}else if(i==8){
  GPIO_SetBits(GPIOC, GPIO_Pin_12);
}else{
 
GPIO_ResetBits(GPIOC, GPIO_Pin_12);
}
delay_nms(1);
GPIO_SetBits(GPIOC, GPIO_Pin_10);
i--;
}
GPIO_SetBits(GPIOC, GPIO_Pin_12);//MD
delay_nms(2);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息