2

主题

0

好友

6

积分

注册会员 当前离线

Rank: 2

UID
813404
帖子
4
精华
0
经验
6 点
金钱
2 ¥
注册时间
2016-5-1
发表于 2016-5-6 17:35 | 显示全部楼层
主控板是 STM32F407 正点原子开发板;
解码器使用AK4495解码器  ;
目前 24bit 16bit都能出声,但是32bit一直是噪音。
32bit 的发送方法是 :SD卡填充数据 ----> 双缓冲DMA  ---->AK4495   
读取32bit数据的格式为:   fatfs 直接读取一个数据块到数组,然后DMA直接发送数据  :
        if(bits==32)
        {
                f_read(audiodev.file,buf,size,(UINT*)&bread);       
                bread=bread;               
        }
开发板发送方式选择左对齐 AK4495接收配置为 左对齐  。
但是板子出声为噪声,是从SD卡读出来数据到数组以后,做的数据处理的不对吗?应该怎么解决这个问题呢?求前辈们指导啊!!

新人在这里附上自己写的AK4495驱动,抛砖引玉,请大家帮帮小弟哈。

#define CONTROL_1        0x00
        #define ACKS        7  //éèÖÃêÖ/×Ô¶ˉéèÖÃλ μ±ACKS éèÖÃλÎa1ê±,256fs /384fs »áμ¼ÖÂ3db±ä»ˉ ¶øÇòÕa¸öê±oò DFS2-0bit ÎTDèéèÖà ËùòÔéèÖÃμ½±£áô111                                   
        #define EXDF        6  //ía2¿à©Õ1ÂË2¨Æ÷éèÖÃλ
        #define ECS         5  //′ò¿a768K2éÑùéèÖÃλ
        #define DIF2        3  //½óêüI2S¸ñê½éèÖÃλ3
        #define DIF1        2  //½óêüI2S¸ñê½éèÖÃλ2
        #define DIF0        1   //½óêüI2S¸ñê½éèÖÃλ1
        #define RSTN        0   //Ïμí3Äú2¿ê±Öóê±Dò¸′λ

#define CONTROL_2        0x01
        #define DZFE        7  //êäèëêy¾Y0λ¼ì2a1|Äü¿aÆôλ ¿aÆôoó¿éòÔí¨1yDZFBà′¿ØÖÆDZFêä3ö½Åêä3öμçƽ
        #define DZFM        6  //êäèëêy¾Y0λ¼ì2a1|Äü¿aÆô
        #define SD          5  //PCMÂË2¨éèÖÃλ1
        #define DFS1        4  //′®DDÄ£ê½ÏÂêÖ¶ˉPCM2éÑùéèÖÃλ2
        #define DFS0        3  //′®DDÄ£ê½ÏÂêÖ¶ˉPCM2éÑùéèÖÃλ1
        #define DEM1        2  //ĬèÏ0¼′¿é
        #define DEM0        1  //ĬèÏ0¼′¿é
        #define SMUTE        0  //PCM/DSD¾2òô¿ØÖÆ

#define CONTROL_3        0x02
        #define DP          7 //DSD¿aÆôéèÖÃλ
        #define DCKS        5 //DSDÄ£ê½ÏÂμÄÏμí3ê±ÖóéèÖÃλ  0ê± 512fs£¨fs=44.1K£©=22.5792  1ê± 768fs £¨fs=44.1K£©=33.8688
        #define DCKB        4 //DSDÄ£ê½ÏÂêä3ö¼«DÔéèÖÃ,0ϽμÑØ 1éÏéyÑØ
        #define MONO        3 //μ¥éùμàmonoéèÖÃ
        #define DZFB        2 //DZFM êäèëêy¾Y0λ¼ì2a1|Äü¿aÆôoó¿éòÔí¨1yDZFBà′¿ØÖÆDZF½ÅμÄêä3öμçƽ
        #define SELLR       1 //μ¥éùμà×óóòéùμàÑ¡Ôñ 0λÎa×óéùμà 1λÎaóòéùμà
        #define SLOW        0  //PCMÂË2¨éèÖÃλ2

#define Lch_ATT                0x03  //×óéùμàòôá¿¿ØÖÆ
        #define ATT7        7
        #define ATT6        6
        #define ATT5        5
        #define ATT4        4
        #define ATT3        3
        #define ATT2        2
        #define ATT1        1
        #define ATT0        0

#define Rch_ATT                0x04 //óòéùμàòôá¿¿ØÖÆ
        #define ATT7        7
        #define ATT6        6
        #define ATT5        5
        #define ATT4        4
        #define ATT3        3
        #define ATT2        2
        #define ATT1        1
        #define ATT0        0

#define CONTROL_4        0x05
        #define INVL        7  //×óéùμàêä3ö·′Ïòλ
        #define INVR        6  //óòéùμàêä3ö·′Ïòλ
        #define DFS2        1  //′®DDÄ£ê½ÏÂêÖ¶ˉéèÖÃCM2éÑùÄ£ê½Î»3
        #define SSLOW        0  //3¬»oÂyPCMÂË2¨éèÖÃλ

#define CONTROL_5        0x06
        #define DDM                7  //DSDÄú2¿¾2òô1|ÄüéèÖÃλ
        #define DML                6  //DSDR/L DÅożì2a±ê־λ
        #define DMR                5  //DSDR/L DÅożì2a±ê־λ
        #define DMC                4  //μ±DDM ¿aÆôéèÖÃλÎa1ê±,í¨1yDMCà′¿ØÖÆêí·ÅêÇêÖ¶ˉ»1êÇ×Ô¶ˉ DCMÎa1£oêÖ¶ˉ Îa0£o×Ô¶ˉ
        #define DMRE               3  //μ±DDM bit =¡°1¡± & DMC bit =¡°1¡°¾2òô1|Äü¿aÆôê±,êí·Å¾2òôλ
        #define DSDD1              2  //DSDD bit ="1" μÄê±oò ′îÅäDSDò»Æe1yÂËìØDÔ 50/150K
                                #define DSDD0              1
        #define DSDSEL0            0  //DSDËù¶èéèÖà 1 : 2.8224(64fs)  5.6448(128fs)  11.2896(256fs)

#define CONTROL_6        0x07
        #define SYNCE        0  //¶àƬ2¢áaÏμí3í¬2½éèÖÃ

#define CONTROL_7        0x08
                                #define SC2                2  //òôÖêμ輶éèÖÃλ2
        #define SC1                1  //òôÖêμ輶éèÖÃλ1
        #define SC0                0  // òôÖêμ輶éèÖÃλ0

u8 AK4595_Write_Reg(u8 reg,u16 val)
{
        IIC_Start();
        IIC_Send_Byte(0x20);             //
        if(IIC_Wait_Ack())return 1;        //
    IIC_Send_Byte(reg&0xff);/
        if(IIC_Wait_Ack())return 2;        //
        IIC_Send_Byte(val&0XFF);        //
        if(IIC_Wait_Ack())return 3;        //
    IIC_Stop();
        AK4595_REGVAL_TBL[reg]=val;        //
        return 0;       
}  

u8 AK4595_SetLen(u8 len)
{
        u8 res=0;
        switch(len)
        {
                case 0x10://LSB 32bit
                        res=AK4595_Write_Reg(CONTROL_1,0x01);// 0000 0001
                break;
                case 0x14://LSB 20bit
                        res=AK4595_Write_Reg(CONTROL_1,0x03);// 0000 0011
                break;
                case 0x18://flp 24bit
                        res=AK4595_Write_Reg(CONTROL_1,0x07);// 0000 1001
                break;
                case 0x20://LSB 32bit
                        res=AK4595_Write_Reg(CONTROL_1,0x0B);// 0000 1011
                break;
        }
        return res;
}

u8 AK4595_SetLrck(u32 Lrck)
{       
        u8 res=0;
        if(Lrck<54100) res=AK4595_Write_Reg(CONTROL_2,0x22);// 0000 0001
        else if(Lrck>54100&&Lrck>108000) res=AK4595_Write_Reg(CONTROL_2,0x2a);// 0000 0011
        else if (Lrck>120000&&Lrck<216000) res=AK4595_Write_Reg(CONTROL_2,0x32);// 0000 1011
        return res;
}       

u8 AK4595_SetPcmDsd(u8 mode)
{
        u8 res=0;
        if(mode==0x01) res=AK4595_Write_Reg(CONTROL_3,0x80);// 0000 0001
        else          res=AK4595_Write_Reg(CONTROL_3,0x00);// 0000 0001
        return res;
}

u8 AK4595_Reset(u8 len)
{
        u8 res=0;
        switch(len)
        {
                case 0x10://×ó¶ÔÆë 16bit
                        res=AK4595_Write_Reg(CONTROL_1,0x01&0xfe);// 0000 0001
                break;
                case 0x14://×ó¶ÔÆë 20bit
                        res=AK4595_Write_Reg(CONTROL_1,0x03&0xfe);// 0000 0011
                break;
                case 0x18://flp 24bit
                        res=AK4595_Write_Reg(CONTROL_1,0x07&0xfe);// 0000 1001
                break;
                case 0x20://flp 32bit
                        res=AK4595_Write_Reg(CONTROL_1,0x0B&0xfe);// 0000 1011
                break;
//                default :
//                        break;
        }
        return res;
}       

4

主题

0

好友

29

积分

注册会员 当前离线

Rank: 2

UID
813612
帖子
29
精华
0
经验
29 点
金钱
21 ¥
注册时间
2016-5-5
发表于 2016-5-6 20:14 | 显示全部楼层
我在看天书。

2

主题

0

好友

6

积分

注册会员 当前离线

Rank: 2

UID
813404
帖子
4
精华
0
经验
6 点
金钱
2 ¥
注册时间
2016-5-1
 楼主| 发表于 2016-5-7 13:48 | 显示全部楼层
已经解决,真心谢谢江老师的热心指导!!!

19

主题

0

好友

64

积分
     

论坛游民 当前离线

Rank: 3Rank: 3

UID
90978
帖子
238
精华
0
经验
64 点
金钱
65 ¥
注册时间
2009-3-25
发表于 2016-5-12 13:05 | 显示全部楼层
自己写的固件呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc.

返回顶部