【求助】有没有人用过ISD4002-120PY

2019-07-15 17:56发布

这个芯片无论录音还是放音都只有一声轻微的“啪”声,连噪音都没有,是不是坏的,求助
程序:
【isd4002驱动】
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
sbit SS = P2^0;                      //ISD4000片选端
sbit SCLK = P2^2;                      //ISD4000时钟端
sbit MOSI = P2^1;                      //ISD4000数据输入
sbit MISO = P2^5;                      //ISD4000数据输出
sbit ISD_INT= P2^3;                   //中断
sbit LED = P0^0;                      //指示灯
/********以下是yus微秒延时函数********/
void    delay(uint yus)
{
        while(--yus !=0){_nop_();}
}
/********以下是xms毫秒延时函数********/
void Delay_ms(uint xms)                //@22.1184MHz
{
while(xms-- != 0)
{
        unsigned char i, j;

        _nop_();
        i = 4;
        j = 146;
        do
        {
                while (--j);
        } while (--i);
}
}
/********以下是SPI串行发送函数********/
void spi_send(uchar isdx)
{
        uchar  isd_count;
        SS=0;                     //ss=0,打开SPI通信
        SCLK=0;
        for(isd_count=0;isd_count<8;isd_count++) //先发低位再发高位,依次发送
        {
                if ((isdx&0x01)==1)
                MOSI=1;
                else
                MOSI=0;
                isdx=isdx>>1;
                SCLK=1;
                delay(2);
           SCLK=0;
                delay(2);
        }
}
/********以下是发送上电指令********/
void isd_powerup(void)
{
        delay(10);
        SS=0;
        spi_send(0x20);
        SS=1;
        Delay_ms(50);
}
/********以下是发送掉电指令函数********/
void isd_poweroff(void)
{ delay(10);
     spi_send(0x10);
SS=1;
Delay_ms(50);
}
/********以下是发送play(播放)指令函数********/
void isd_play(void)
{
        LED=0;
        spi_send(0xf0);
        SS=1;
}
/********以下是发送rec(录音)指令函数********/
void isd_rec(void)
{
        LED=0;
        spi_send(0xb0);
        SS=1;
}
/********以下是发送stop(停止)指令函数********/
void  isd_stop(void)
{
        delay(10);
        spi_send(0x30);
        SS=1;
        Delay_ms(50);
}
/********以下是发送setplay(放音起始地址)指令函数********/
void isd_setplay(uchar adl,uchar adh)
{
        spi_send(adl);    //发送起始地址低位
        adh=adh|0xe0;
        spi_send(adh);   //发送起始地址高位
        SS=1;
}
/********以下是发送setrec(录音起始地址)指令函数********/
void isd_setrec(uchar adl,uchar adh)
{
        spi_send(adl);    //发送起始地址低位
        adh=adh|0xa0;
        spi_send(adh);    //发送起始地址高位
        SS=1;
}
/********以下是检查芯片是否溢出函数(读OVF,并返回OVF值)********/
uchar check_ovf(void)
{
        SS=0;
        delay(2);
        SCLK=0;
        delay(2);
        SCLK=1;
        SCLK=0;
        delay(2);
        if (MISO==1)
        {
                SCLK=0;
                SS =1;                     //关闭spi通信端
                isd_stop();             //发送stop指令
                return 1;             //OVF为1,返回1
        }
        else
        {
                SCLK=0;
                SS =1;                 //关闭spi通信端
                isd_stop();             //发送stop指令
                return 0;             //OVF为0,返回0
        }
}

【主程序】
#include <reg51.h>
#include "ISD4002_drive.h"
#define uchar unsigned char
#define uint  unsigned int
sbit K1 = P3^6;                      //K1键
sbit K2 = P3^7;                     //K2键
sbit PR = P3^2;                      //录放控制端,PR=1录音, PR=0放音

void flash(void)
{
                LED=1;
                Delay_ms(100);
                LED=0;
                Delay_ms(100);
}
/********以下是录音函数********/
void  Record()
{
        while(!K1);
          isd_setrec(0x00,0x00);    //发送0x0000h地址的setplay指令
        isd_rec();            //发送rec指令
        LED = 1;
        Delay_ms(4000);
        LED = 0;                                         //录音完毕,LED熄灭
        isd_stop();                                     //发送停止命令
}
/********以下是放音函数********/
void  Play()
{               
        while(K1==0){;}                       
        isd_setplay(0x00,0x00);                     //发送setplay指令,从0x0000地址开始放音
        isd_play();                            //发送放音指令
        LED = 1;
        delay(20);
        while(ISD_INT==1)                 //等待放音完毕的EOM中断信号
        {flash();}
        LED=0;
        isd_stop();                         //放音完毕,发送stop指令
}
/********以下是主函数********/
void main(void)
{
        while(1)
        {
                if(K1 == 0)
                {
                Delay_ms(50);
                if(K1 == 0)
                {
                        isd_powerup();     //K1键按下,ISD上电
                        isd_poweroff();        //掉电
                        isd_powerup();        //上电
                 if(PR == 0) Record();
                 else Play();
                }
                }
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。