ISD4000系列2-16min語音錄放晶片

ISD4000系列2-16min語音錄放晶片是一款單電源單片語音錄放電路,採用多電平直接模擬量存儲技術,可反覆錄音10萬次。

基本介紹

  • 中文名:ISD4000系列2-16min語音錄放晶片
  • 型    號:SD4002-120
  • 錄音時間:2
  • 輸入取樣排列:8.0
概述,晶片封裝,晶片引腳描述,晶片SPI控制協定,信息快進,上電順序,晶片控制例程,

概述

ISD4000系列語音晶片是美國ISD公司生產的2.7V~3.3V單電源單片語音錄放電路。
ISD4000系列語音晶片採用多電平直接模擬量存儲技術。每個取樣值直接存儲在片內快閃記憶體中,因此能夠非常真實、自然地再現語音、音樂、音調和效果聲,避免了一般固體錄音電路因量化和壓縮造成的量化噪聲和“金屬聲”。取樣頻率可分為4.0kHz、5.3kHz、6.4kHz、8.0kHz,取樣頻率越低,錄音時間越長,而音質有所下降,片內信息存於快閃記憶體中,可在斷電情況下保存100年(典型值),可反覆錄音10萬次。
ISD4000系列語音晶片有ISD4002、ISD4003ISD4004這三個系列,共16中型號,不同型號的引腳功能和套用電路相同,只是錄音時間等參數有些差異,具體區別如下表所示。
型 號
錄音時間(min)
輸入取樣排列 (kHz)
典型頻寬(kHz)
最大段數
最小段長(ms)
外部鐘頻(kHz)
ISD4002-120
2
8.0
3.4
600
200
1024
ISD4002-150
2.5
6.4
2.7
600
250
819.2
ISD4002-180
3
5.3
2.3
600
300
682.7
ISD4002-240
4
4.0
1.7
600
400
512
ISD4003-04M
4
8.0
3.4
1200
200
1024
ISD4003-05M
5
6.4
2.7
1200
250
819.2
ISD4003-06M
6
5.3
2.3
1200
300
682.7
ISD4003-08M
8
4.0
1.7
1200
400
512
ISD4004-08M
8
8.0
3.4
2400
200
1024
ISD4004-10M
10
6.4
2.7
2400
250
819.2
ISD4004-12M
12
5.3
2.3
2400
300
682.7
ISD4004-16M
16
4.0
1.7
2400
400
512

晶片封裝

ISD4000系列語音晶片有DIP/SOIC、TSOP等封裝形式,如下圖。
ISD4000晶片封裝ISD4000晶片封裝

晶片引腳描述

電源:(VCCA,VCCD) :為使噪聲最小,晶片的模擬和數字電路使用不同的電源匯流排,並且分別引到外封裝的不同管腳上,模擬和數字電源端最好分別走線,儘可能在靠近供電端處相連,而去耦電容應儘量靠近器件。
地線(VSSA,VSSD) :晶片內部的模擬和數字電路也使用不同的地線。
同相模擬輸入(ANA IN+):這是錄音信號的同相輸入端。輸入放大器可用單端或差分驅動。單端輸入時,信號由耦合電容輸入,最大幅度為峰峰值32mV,耦合電容和本端的3KΩ電阻輸入阻抗決定了晶片頻帶的低端截止頻率。差分驅動時,信號最大幅度為峰峰值16mV,為ISD33000 系列相同。
反相模擬輸入(ANA IN-) :差分驅動時,這是錄音信號的反相輸入端。信號通過耦合電容輸入,最大幅度為峰峰值16mV
音頻輸出(AUD OUT) :提供音頻輸出,可驅動5KΩ的負載。
片選(SS): 此端為低,即向該ISD4004 晶片傳送指令,兩條指令之間為高電平
串列輸入(MOSI) :此端為串列輸入端,主控制器應在串列時鐘上升沿之前半個周期將數據放到本端,供ISD 輸入。
串列輸出(MISO) :ISD 的串列輸出端。ISD 未選中時,本端呈高阻態
串列時鐘(SCLK) : ISD 的時鐘輸入端,由主控制器產生,用於同步MOSI 和MISO 的數據傳輸。數據在SCLK上升沿鎖存到ISD,在下降沿移出ISD。
中斷(/INT) :本端為漏極開路輸出。ISD 在任何操作(包括快進)中檢測到EOM 或OVF 時,本端變低並保持。中斷狀態在下一個SPI 周期開始時清除。中斷狀態也可用RINT 指令讀取。OVF 標誌----指示ISD的錄、放操作已到達存儲器的未尾。EOM 標誌----只在放音中檢測到內部的EOM 標誌時,此狀態位才置1。
行地址時鐘(RAC):漏極開路輸出。每個RAC 周期表示ISD 存儲器的操作進行了一行(ISD4004 系列中的  存貯器共2400 行)。該信號175ms 保持高電平,低電平為25ms。快進模式下,RAC 的218.75μs 是高電平,31.25μs 為低電平。該端可用於存儲管理技術。
外部時鐘(XCLK) :本端內部有下拉元件。晶片內部的採樣時鐘在出廠前已調校,誤差在 +1%內。商業級晶片在整個溫度和電壓範圍內, 頻率變化在+2.25%內。工業級晶片在整個溫度和電壓範圍內,頻率變化在-6/+4%內,此時建議使用穩壓電源。若要求更高精度,可從本端輸入外部時鐘(如前表所列)。由於內部的防混淆及平滑濾波器已設定,故上述推薦的時鐘頻率不應改變。輸入時鐘的占空比無關緊要,因內部首先進行了分頻。在不外接地時鐘時,此端必須接地。
自動靜噪(AMCAP) :當錄音信號電平下降到內部設定的某一閾值以下時,自動靜噪功能使信號衰弱,這樣有助於養活無信號(靜音)時的噪聲。通常本端對地接1mF 的電容,構成內部信號電平峰值檢測電路的一部分。檢出的峰值電平與內部設定的閾值作比較,決定自動靜噪功能的翻轉點。大信號時,自動靜噪電路不衰減,靜音時衰減6dB。1mF 的電容也影響自動靜噪電路對信號幅度的回響速度。本端接VCCA 則禁止自動靜噪

晶片SPI控制協定

ISD4004 工作於SPI 串列接口。SPI 協定是一個同步串列數據傳輸協定,協定假定微控制器的SPI 移位暫存器在SCLK 的下降沿動作,因此對ISD4004 而言,在時鐘止升沿鎖存MOSI 引腳的數據,在下降沿將數據送至MISO 引腳。協定的具體內容為:
1.所有串列數據傳輸開始於SS 下降沿。
2.SS 在傳輸期間必須保持為低電平,在兩條指令之間則保持為高電平
3.數據在時鐘上升沿移入,在下降沿移出。
4.SS 變低,輸入指令和地址後,ISD 才能開始錄放操作。
5.指令格式是(8 位控制碼)加(16 位地址碼)。
6.ISD 的任何操作(含快進)如果遇到EOM 或OVF,則產生一個中斷,該中斷狀態在下一個SPI 周期開始時被清除。
7.使用"讀"指令使中斷狀態位移出ISD 的MISO 引腳時,控制及地址數據也應同步從MOSI 端移入。因此要注意移入的數據是否與器件當前進行的操作兼容。當然,也允許在一個SPI 周期里,同時執行讀狀態和開始新的操作(即新移入的數據與器件當前的操作可以不兼容)。
8.所有操作在運行位(RUN)置1 時開始,置0 時結束。
9.所有指令都在SS 端上升沿開始執行。

信息快進

用戶不必知道信息的確切地址,就能快進跳過一條信息。信息快進只用於放音模式。放音速度是正  常的1600 倍,遇到EOM 後停止,然後內部地址計數器加1,指向下條信息的開始處。

上電順序

器件延時TPUD(8kHz 採樣時,約為25 毫秒)後才能開始操作。因此,用戶發完上電指令後,必須等待  TPUD,才能發出一條操作指令。  例如,從00 從處發音,應遵循如下時序:  1. 發POWERUP 命令;  2. 等待TPUD(上電延時);  3. 發地址值為00 的SETPLAY 命令;  4. 發PLAY 命令。  器件會從此00 地址開始放音,當出現EOM 時,立即中斷,停止放音。  如果從00 處錄音,則按以下時序:  1. 發POWER UP 命令;  2. 等待TPUD(上電延時);  3. 發POWER UP 命令  4. 等待2 倍TPUD;  5. 發地址值為00 的SETREC 命令;  6. 發REC 命令。  器件便從00 地址開始錄音,一直到出現OVF(存貯器末尾)時,錄音停止。

晶片控制例程

#include <reg51.h>
sbit SS = P1^0; //片選
sbit SCLK = P1^1; //ISD4003時鐘
sbit MOSI = P1^2; //數據輸入
sbit MISO = P1^3; //數據輸出
sbit LED = P1^7; //指示燈
sbit ISD_INT= P3^2; //中斷
sbit AN = P1^6; //執行
sbit STOP = P1^5; //復位
sbit PR = P1^4; //PR=1錄音? PR=0放音
void delay(unsigned int time) //延遲n微秒
{
while(time!=0)
{
time-- ;
}
}
void delayms(unsigned int time) //延遲n毫秒
{ TMOD=0x01;
for(time;time>0;time--)
{
TH0=0xfc;
TL0=0x18;
TR0=1;
while(TF0!=1)
{;}
TF0=0;
TR0=0;
}
}
//************************************
//ISD4002 spi串列傳送子程式,8位數據
//************************************
void spi_send(unsigned char isdx)
{ unsigned char isx_counter;
SS=0; //ss=0,打開spi通信端
SCLK=0;
for(isx_counter=0;isx_counter<8;isx_counter++) //先發低位再發高位,依次傳送。
{ if ((isdx&0x01)==1)
MOSI=1;
else
MOSI=0;
isdx=isdx>>1;
SCLK=1;
delay(2);
SCLK=0;
delay(2);
}
}
//*******************************
//傳送stop指令
//*******************************
void isd_stop(void)
{ delay(10);
spi_send(0x30);
SS=1;
delayms(50);
}
//*******************************
//傳送上電指令,並延遲50ms
//*******************************
void isd_pu(void)
{ delay(10);
SS=0;
spi_send(0x20);
SS=1;
delayms(50);
}
//*******************************
//傳送掉電指令,並延遲50ms
//*******************************
void isd_pd(void)
{ delay(10);
spi_send(0x10);
SS=1;
delayms(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;
}
//*******************************
//傳送setplay指令
//*******************************
void isd_setplay(unsigned char adl,unsigned char adh)
{
spi_send(adl); //傳送放音起始地址低位
adh=adh|0xe0;
spi_send(adh); //傳送放音起始地址高位
SS=1;
}
//*******************************
//傳送setrec指令
//*******************************
void isd_setrec(unsigned char adl,unsigned char adh)
{
spi_send(adl); //傳送放音起始地址低位
adh=adh|0xa0;
spi_send(adh); //傳送放音起始地址高位
SS=1;
}
//************************************
//晶片溢出,LED閃爍提醒停止錄音
//************************************
void isd_overflow(void)
{
while(AN==0)
{LED=1;
delayms(300);
LED=0;
delayms(300);
}
}
//************************************
//檢查晶片是否溢出(讀OVF,並返回OVF值)
//************************************
unsigned char chk_isdovf(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
}
}
//************************************************************************
//主程式
//功能:1.錄音時,按住AN鍵,LED點亮開始錄音,鬆開AN即可停止錄音
// 再次按下AN鍵,LED點亮開始錄第二段音,依次類推,直到晶片溢出。
// 按stop鍵晶片復位
// 2.放音時,按一下AN鍵,即播放一段語音。 按stop鍵晶片復位。
//************************************************************************
void main(void)
{unsigned char ovflog;
{
P0=P1=P2=P3=0xff; //初始化
while (AN==1) //等待AN鍵按下
{
if (AN==0) //按鍵防抖動
{delayms(20);}
}
isd_pu(); //?AN鍵按下,ISD上電並延遲50ms
isd_pd();
isd_pu();
if (PR==1) //如果PR=1則轉入錄音部分
{
delayms(500); //延遲錄音
isd_setrec(0x00,0x00); //傳送0x0000h地址的setplay指令
do
{ isd_rec(); //傳送rec指令
delay(20);
while(AN==0) //等待錄音完畢
{if (ISD_INT==0) //如果晶片溢出,進行LED閃爍提示,
isd_overflow(); //如果取消錄音(鬆開AN鍵)則停止錄音,晶片復位
}
if (ISD_INT==0)
break;
LED=1; //錄音完畢,LED熄滅
isd_stop(); //傳送停止命令
while(AN==1) //如果AN再次按下,開始錄製下一段語音
{if(STOP==0) //如果按下STOP按鍵,則晶片復位
break;
if (AN==0)
delayms(500);
}
}while(AN==0);
}
else //如果PR==0則轉入放音部分
{
while(AN==0){;}
isd_setplay(0x00,0x00); //傳送setplay指令,從0x0000地址開始放音
do
{
isd_play(); //傳送放音指令
delay(20);
while(ISD_INT==1) //等待放音完畢的EOM中斷信號
{;}
LED=1;
isd_stop(); //放音完畢,傳送stop指令
if (ovflog=chk_isdovf()) //檢查晶片是否溢出 ,如溢出則停止放音,晶片復位
break;
while(AN==1) //等待AN鍵再次按下
{if (STOP==0)
delayms(20);
if (STOP==0)
break;
if(AN==0)
delayms(20);
}
LED=0;
}while(AN==0); // AN鍵再次按下,播放下一段語音
}
isd_stop();
isd_pd();
}
}
/*注意:與ISD4002/03不同的是,由於ISD4004晶片的語音地址是16位,在傳送帶地址指令(如setplay,setrec,setmc)時,需要先傳送兩個位元組的地址信息,再傳送一個位元組的命令字,ISD4004的程式編寫與ISD4002/03的區別,僅此而已。
//例如,ISD4004的setplay指令程式應為:
void isd_setplay(unsigned char adl,unsigned char adh)
{
delayms(1);
spi_send(adl); //傳送放音起始地址低位
delay(2);
spi_send(adh); //傳送放音起始地址高位
delay(2);
spi_send(0xe0); //傳送setplay指令位元組
SS=1;
}*/

相關詞條

熱門詞條

聯絡我們