- 积分
- 6
- 在线时间
- 5 小时
- 最后登录
- 2016-5-26
- 阅读权限
- 40
- 精华
- 0
- UID
- 813404
- 帖子
- 4
- 精华
- 0
- 经验
- 6 点
- 金钱
- 2 ¥
- 注册时间
- 2016-5-1
|
主控板是 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;
}
|
|