这次问一下有关isd4004语音芯片的问题,现在的问题在于: 我写的代码可以顺利的播放语音芯片里面的内容,但是不能录音。不知道为啥。 刚买isd4004的时候让老板作为测试在芯片里面录了一小段语音。现在可以把录制的内容放出来,但是遗憾的是,我自己写的录音程序无法讲自己的声音录进去, 就是虽然我执行了录音程序,但是再次同样地址播放的时候还是原来老板录好的声音。所以录音不成功。下面是我的代码,请教以下大家哪里有错。 谢谢大家!
//////////////////函数申明区//////////////////////// void delay4004(unsigned int time); void spi_send(uchar data4004); //isd4004spi发送数据函数 void isd_stop(void); //发送停止指令 void isd_pu(void); //上电指令 void isd_pd(void); //下电指令 void isd_play(void); //播放指令 void isd_rec(void); //录音指令 void isd_setplay(uchar adl,uchar adh); //设置播放模式指令 void isd_setrec(unsigned char adl,unsigned char adh); //设置录音模式指令 //unsigned char chk_isdovf(void) //检查是否溢出函数 ////////////////////////////////////////////////// void init12864(uchar c_command,uchar c_time); void print12864(uchar c_12864add,uchar c_12864hdate,uchar c_12864ldate,uchar c_12864time); uchar keyboard(uchar c_break);
void delay4004(unsigned int time) //延迟n 微秒 { while(time--) { ; } }
//************************************ //ISD4002 spi 串行发送子程序,8 位数据 //************************************ void spi_send(uchar data4004) { unsigned char isx_counter; SCLK=0; SS=0; //ss=0,打开spi 通信端 for(isx_counter=0;isx_counter <8;isx_counter++) //先发低位再发高位,依次发送。 { if ((data4004&0x01)==1) MOSI=1; else MOSI=0; data4004=data4004>>1; SCLK=0; //下降沿发送数据 delay4004(2); SCLK=1; delay4004(2); } }
//******************************* //发送stop 指令 //******************************* void isd_stop(void) { delay4004(10); SS=0; spi_send(0x30); SS=1; // delay4004ms(50); }
//******************************* //发送上电指令,并延迟50ms //******************************* void isd_pu(void) { delay4004(10); SS=0; spi_send(0x20); SS=1; // delay4004ms(50); } //******************************* //发送掉电指令,并延迟50ms //******************************* void isd_pd(void) { delay4004(10); SS=0; spi_send(0x10); SS=1; // delay4004ms(50); } //******************************* //发送play 指令 //******************************* void isd_play(void) { spi_send(0xf0); SS=1; } //******************************* //发送rec 指令 //******************************* void isd_rec(void) { spi_send(0xb0); SS=1; } //******************************* //发送setplay 指令 //******************************* void isd_setplay(uchar adl,uchar adh) { delay4004(1); spi_send(adl); //发送放音起始地址低位 delay4004(2); spi_send(adh); //发送放音起始地址高位 delay4004(2); spi_send(0xe0); //发送setplay 指令字节 SS=1; } //******************************* //发送setrec 指令 //******************************* void isd_setrec(unsigned char adl,unsigned char adh) { spi_send(adl); //发送放音起始地址低位 delay4004(2); spi_send(adh); //发送放音起始地址高位 delay4004(2); spi_send(0xa0); SS=1; }
void isd4004(uchar c_select) { uint isd4004add=0; SS=MOSI=MISO=SCLK=ISD_INT=RAC=1; ISD_INT=0; RAC=0; init12864(0x01,0); print12864(0x80,'o','k',0); if(c_select=='A') { print12864(0x80,'A','!',0); isd_pu(); delay4004(5118); isd_pu(); delay4004(5118); delay4004(5118); delay4004(5118); isd_setrec(0x00,0x00); isd_rec(); while(1) { if(ISD_INT==1) { if(RAC==1) { delay4004(2000); isd4004add++; print12864(0x90,isd4004add/1000+0x30,isd4004add%1000/100+0x30,0); print12864(0x92,isd4004add%100/10+0x30,isd4004add%10+0x30,0); if(keyboard(0))break; } }
if(keyboard(0)){print12864(0x82,'f','a',0);break;} } isd_stop(); isd_pd(); } if(c_select=='B') { isd4004add=0; print12864(0x98,'B','!',0); isd_pu(); delay4004(5118); isd_setplay(0x00,0x00); isd_play(); while(1) //等待放音完毕的EOM 中断信号 { if(RAC==0) { delay4004(2000); isd4004add++; print12864(0x90,isd4004add/1000+0x30,isd4004add%1000/100+0x30,0); print12864(0x92,isd4004add%100/10+0x30,isd4004add%10+0x30,0); if(keyboard(0))break; } if(keyboard(0)){print12864(0x82,'f','a',0); break;} } isd_stop(); isd_pd(); } }
谢谢大家! |