ISD4004

串列輸入(MOSI) 串列輸出(MISO) 6.ISD

ISD4004 系列單片語音錄放

一、 簡述

●單片8 至16 分鐘語音錄放
●內置微控制器串列通信接口
●3V 單電源工作
●多段信息處理
●工作電流25-30mA,維持電流1μA
●不耗電信息保存100 年(典型值)
●高質量、自然的語音還原技術
●10 萬次錄音周期(典型值)
●自動靜噪功能
●片內免調整時鐘,可選用外部時鐘

型 號 時 間 輸入採樣 典型頻寬 最大段數 最小段長 外部鍾頻
ISD4004-08 8分鐘 8.0kHz 3.4kHz 1200 200ms 1024.0kHz
ISD4004-10 10分鐘 6.4kHz 2.7kHz 1200 250ms 819.2kHz
ISD4004-12 12分鐘 5.3kHz 2.3kHz 1200 300ms 682.7kHz
ISD4004-16 16分鐘 4.0kHz 1.7kHz 1200 400ms 512.0kHz
ISD4004 系列工作電壓3V,單片錄放時間8 至16 分鐘,音質好,適用於行動電話及其他攜帶型電子產品中。晶片採用CMOS 技術,內含振盪器、防混淆濾波器、平滑濾波器、音頻放大器、自動靜噪及高密度多電平閃爍存貯陳列。晶片設計是基於所有操作必須由微控制器控制,操作命令可通過串列通信接口(SPI 或Microwire)送入。晶片採用多電平直接模擬量存儲技術, 每個採樣值直接存貯在片內閃爍存貯器中,因此能夠非常真實、自然地再現語音、音樂、音調和效果聲,避免了一般固體錄音電路因量化和壓縮造成的量化噪聲和"金屬聲"。採樣頻率可為 4.0,5.3,6.4,8.0kHz,頻率越低,錄放時間越長,而音質則有所下降,片內信息存於閃爍存貯器中,可在斷電情況下保存100 年(典型值),反覆錄音10 萬次。

二、引腳描述

電源:(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(存貯器末尾)時,錄音停止。
 ISD4002/4003/4004晶片參數表

型號 存儲時間
(秒)
可分
段數
信息分辯
率(毫秒)
採樣頻
率(HZ)
濾波器
頻寬(HZ)
控制碼+地址位
ISD4002-120 120 600 200 8.0K 3.4K 5+11
ISD4002-180 180 600 300 5.3k 2.3k 5+11
ISD4002-240 240 600 400 4.0k 1.7k 5+11
ISD4003-04 240 1200 200 8.0K 3.4K 5+11
ISD4003-06 360 1200 300 5.3K 2.3K 5+11
ISD4003-08 480 1200 400 4.0K 1.7K 5+11
ISD4004-08 480 2400 200 8.0K 3.4K 8+16
ISD4004-16 960 2400 400 4.0K 1.7K 8+16
以上晶片由ISD3340K編程拷貝機編程、拷貝。
************ISD4004操作流程

// 主程式
//
// 功能:1.錄音時,按住AN鍵,LED點亮開始錄音,鬆開AN即可停止錄音
// 再次按下AN鍵,LED點亮開始錄第二段音,依次類推,直到晶片溢出。
// 按stop鍵晶片復位
// 2.放音時,按一下AN鍵,即播放一段語音。 按stop鍵晶片復位。
//************************************************************************
#include <reg52.h>
sbit SS =P1^0; //片選
sbit MOSI=P1^1; //數據輸入
sbit MISO=P1^2; //數據輸出
sbit SCLK=P1^3; //ISD4004時鐘
sbit INT =P1^4; //中斷
sbit LED =P1^7; //指示燈
sbit LED1=P1^6; //指示燈:亮是錄音/不亮是放音
sbit PR =P3^3; //錄音和放音選擇開關
sbit STOP=P3^4; //復位
sbit AN =P3^5; //執行
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;
}
}
void isd_send(unsigned char ISDX)//spi串列傳送子程式,8位數據
{
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);
}
}
void isd_stop()//stop指令(停止當前操作)
{
delay(10);
isd_send(0x30);
SS=1;
delayms(50);
}
void isd_powerup()//傳送上電指令
{
delay(10);
SS=0;
isd_send(0x20);
SS=1;
delayms(50);
}
void isd_stopwrdn()//傳送掉電指令
{
delay(10);
isd_send(0x10);
SS=1;
delayms(50);
}
void isd_play()//傳送play指令
{
LED=0;
isd_send(0xf0);
SS=1;
}
void isd_rec()//傳送rec指令
{
LED=0;
isd_send(0xb0);
SS=1;
}
void isd_setplay(unsigned char adl,unsigned char ADH)//傳送setplay指令
{
delayms(1);
isd_send(adl); //傳送放音起始地址低位
delay(2);
isd_send(adh); //傳送放音起始地址高位
delay(2);
isd_send(0xe0); //傳送setplay指令字
SS=1;
}
void isd_setrec(unsigned char adl,unsigned char adh)//傳送setrec指令
{
delayms(1);
isd_send(adl); //傳送放音起始地址低位
delay(2);
isd_send(adh); //傳送放音起始地址高位
delay(2);
isd_send(0xa0); //傳送setplay指令位元組
SS=1;
}
void isd_overflow()//晶片溢出,LED閃爍提醒停止錄音
{
while(AN==0)
{
LED=1;
delayms(300);
LED=0;
delayms(300);
}
}
unsigned char chk_isdovf()//檢查晶片是否溢出(讀OVF,並返回OVF值)
{
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
}
}
void main(void)
{
unsigned char ovflog;
while(1)
{
if(PR==0) {delayms(8);LED1=~LED1;while(PR==0);}
if(LED1==0)//如果PR=0則轉入錄音部分
{
if(AN==0)
{
isd_powerup(); //AN鍵按下,ISD上電並延遲50ms
isd_stopwrdn();
isd_powerup();
LED1=0;//表示錄音模式
delayms(500); //延遲500ms錄音
isd_setrec(0x00,0x00); //傳送0x0000h地址的setplay指令
do
{
isd_rec(); //傳送rec指令
while(AN==0) //等待錄音完畢
{
if(INT==0) //如果晶片溢出,進行LED閃爍提示,
isd_overflow(); //如果取消錄音(鬆開AN鍵)則停止錄音,晶片復位
}
if(INT==0)
break;
LED=1; //錄音完畢,LED熄滅
isd_stop(); //傳送停止命令
while(AN==1) //如果AN再次按下,開始錄製下一段語音
{
if(isd_stop==0) //如果按下STOP按鍵,則晶片復位
break;
if(AN==0)
delayms(500);
}
}
while(AN==0);
}
}
if(LED1==1)//如果PR=0則轉入放音部分 //如果PR==1則轉入放音部分
{
if(AN==0)
{
isd_powerup(); //AN鍵按下,ISD上電並延遲50ms
isd_stopwrdn();
isd_powerup();
LED1=1;//表示錄音模式
while(AN==0)
{;}
isd_setplay(0x00,0x00); //傳送setplay指令,從0x0000地址開始放音
do
{
isd_play(); //傳送放音指令
delay(20);
while(INT==1) //等待放音完畢的EOM中斷信號
{;}
LED=1;
isd_stop(); //放音完畢,傳送stop指令
if (ovflog=chk_isdovf()) //檢查晶片是否溢出 ,如溢出則停止放音,晶片復位
break;
while(AN==1) //等待AN鍵再次按下
{
if(isd_stop==0)
break;
if(AN==0)
delayms(20);
}
}
while(AN==0); // AN鍵再次按下,播放下一段語音
// isd_stop();
// isd_stopwrdn();
}
}
}

相關詞條

熱門詞條

聯絡我們