heize 发表于 2015-1-22 13:07:35

AD1955使用音量寄存器调小音量是有噪声

有没有使用过AD1955的,使用默认的音量寄存器设置时,音质很好;但把值调小,比如0x7FFF(右声道)和0x7FFE(左声道)时,类似调频广播的那种莎莎的噪声很大


lusson 发表于 2015-1-22 13:31:58

之前试过WM8740的没有这个问题。1955没用过

cheungman 发表于 2015-1-22 14:24:28

没有这个问题,看看写入的寄存器数据是否错了,最好看一下。

heize 发表于 2015-1-22 15:51:37

cheungman 发表于 2015-1-22 14:24
没有这个问题,看看写入的寄存器数据是否错了,最好看一下。

用逻辑分析仪看了下,发出去的是没错。AD1955缺乏读,也不知道是不是真的写进去了

heize 发表于 2015-1-22 17:15:57

把左声道设成0xFF02,右声道设成0x0003,右声道没声了,左声道有强烈的莎莎声,是在搞不懂

fsclub 发表于 2015-1-22 17:38:44

程序?电路有吗?

heize 发表于 2015-1-22 19:20:45

原理图来了

heize 发表于 2015-1-22 19:27:37

程序片段

/******************************************************
* Function: AD1955 Init
* Input: uint16_t bitsPerSample
* Output: void
* Detail: None
*****************************************************/
void SND_AD1955Init(uint16_t bitsPerSample)
{
        uint8_t txbuf, rxbuf;
        dspi_status_t status;

        // Control Register 0
        switch(bitsPerSample)
        {
        case 16:
                txbuf= 0x0C;
                break;
        case 18:
                txbuf= 0x08;
                break;
        case 20:
                txbuf= 0x04;
                break;
        case 24:
                txbuf= 0x00;
                break;
        default:
                xprintf("AD1955\tbitsPerSample Error\n");
                break;
        }
        txbuf= 0x00;
        do {
                status= DSPI_DRV_MasterGetTransferStatus(FSL_SPICOM1, NULL);
                } while(status == kStatus_DSPI_Busy);
        if(kStatus_DSPI_Success != DSPI_DRV_MasterTransfer(FSL_SPICOM1, &AD_BusConfig0, txbuf, rxbuf, 2))
                xprintf("AD1955\tDSPI Failed 2\n");

        // Control Register 1
//        txbuf= 0x00;
//        txbuf= 0x01;
//        do {
//                status= DSPI_DRV_MasterGetTransferStatus(FSL_SPICOM1, NULL);
//                } while(status == kStatus_DSPI_Busy);
//        if(kStatus_DSPI_Success != DSPI_DRV_MasterTransfer(FSL_SPICOM1, &AD_BusConfig0, txbuf, rxbuf, 2))
//                xprintf("AD1955\tDSPI Failed 2\n");

        // Volume Register L
//        txbuf= 0x70;
//        txbuf= 0x02;
//        do {
//                status= DSPI_DRV_MasterGetTransferStatus(FSL_SPICOM1, NULL);
//                } while(status == kStatus_DSPI_Busy);
//        if(kStatus_DSPI_Success != DSPI_DRV_MasterTransfer(FSL_SPICOM1, &AD_BusConfig0, txbuf, rxbuf, 2))
//                xprintf("AD1955\tDSPI Failed 2\n");

        // Volume Register R
//        txbuf= 0x70;
//        txbuf= 0x03;
//        do {
//                status= DSPI_DRV_MasterGetTransferStatus(FSL_SPICOM1, NULL);
//                } while(status == kStatus_DSPI_Busy);
//        if(kStatus_DSPI_Success != DSPI_DRV_MasterTransfer(FSL_SPICOM1, &AD_BusConfig0, txbuf, rxbuf, 2))
//                xprintf("AD1955\tDSPI Failed 2\n");
}

heize 发表于 2015-1-24 20:16:57

cheungman 发表于 2015-1-22 14:24
没有这个问题,看看写入的寄存器数据是否错了,最好看一下。

总算是有点找到问题了,很奇怪!
貌似写寄存器时只有最后一条生效,并把其他的3个寄存器重设了。
我的I2S输入的是16bits的,所以设置音量时,Reg0被重设成了默认的24bits的,这才有了噪声。
这很难理解,设置一个寄存器会复位其他3个寄存器!

heize 发表于 2015-1-24 20:57:43

总算找到原因了,如果I2S MCLK不给时钟的话,只有最有一个寄存器设置值会生效!
也就是说,要在I2S有时钟时设置才有效

80162535 发表于 2015-1-25 22:53:41

多谢楼主分享,正准备搞 AD1955。
页: [1]
查看完整版本: AD1955使用音量寄存器调小音量是有噪声