語音晶片
ISD1700系列晶片是Winbond推出的單片優質語音錄放電路,該晶片提供多項新功能,包括內置專利的多信息管理系統,新信息提示(vAlert),雙運作模式(獨立&嵌入式),以及可定製的信息操作指示音效。晶片內部包含有自動增益控制、麥克風前置擴大器、揚聲器驅動線路、振盪器與記憶體等的全方位整合系統功能。
★ 功能特點
· 可錄、放音十萬次,存儲內容可以斷電保留一百年
· 按鍵模式和MCU串列控制模式(SPI協定)
· MIC和ANAin兩種錄音模式
· PWM和AUD/AUX三种放音輸出方式
· 可處理多達255段以上信息
· 有豐富多樣的工作狀態提示
· 多種採樣頻率對應多種錄放時間
· 音質好,電壓範圍寬,套用靈活
★ 電特性
· 工作電壓:DC2.4V~5.5V,,最高不能超過6V
· 靜態電流:0.5 ~1 μA
· 工作電流:20mA
型號參數列表及管腳定義列表
ISD1730 | ISD1740 | ISD1750 | ISD1760 | ISD1790 | 振盪電阻 | |
12kHz | 20秒 | 26秒 | 33秒 | 40秒 | 60秒 | 60kΩ |
8kHz | 30秒 | 40秒 | 50秒 | 60秒 | 90秒 | 80kΩ |
6.4kHz | 37秒 | 50秒 | 62秒 | 75秒 | 112秒 | 100kΩ |
5.3kHz | 45秒 | 60秒 | 75秒 | 90秒 | 135秒 | 120kΩ |
4kHz | 60秒 | 80秒 | 100秒 | 120秒 | 180秒 | 160kΩ |
ISD17120 | ISD17150 | ISD17180 | ISD17210 | ISD17240 | 振盪電阻 | |
12kHz | 80秒 | 100秒 | 120秒 | 140秒 | 160秒 | 60kΩ |
8kHz | 120秒 | 150秒 | 180秒 | 210秒 | 240秒 | 80kΩ |
6.4kHz | 150秒 | 187秒 | 225秒 | 262秒 | 300秒 | 100kΩ |
5.3kHz | 181秒 | 226秒 | 271秒 | 317秒 | 362秒 | 120kΩ |
4kHz | 240秒 | 300秒 | 360秒 | 420秒 | 480秒 | 160kΩ |
引腳名稱 | PDIP/SOIC封裝 | TSOP封裝 | 引腳說明 |
VCCD | 1 | 22 | 數字電路電源 |
/LED | 2 | 23 | LED指示信號輸出 |
/RESET | 3 | 24 | 晶片復位 |
MISO | 4 | 25 | SPI接口的串列輸出。ISD1700在 SCLK下降沿之前的半個周期將數據放置在MISO端。數據在SCLK的下降沿時移出 |
MOSI | 5 | 26 | SPI接口的數據輸入連線埠。主控制晶片在SCLK上升沿之前的半個周期將數據放置在MOSI端。數據在SCLK上升沿被鎖存在晶片內。此管腳在空閒時,應該被拉高 |
SCLK | 6 | 27 | SPI接口的時鐘。由主控制晶片產生,並且被用來同步晶片MOSI和MISO端各自的數據輸入和輸出。此管腳空閒時,必須拉高。 |
/SS | 7 | 28 | 為低時,選擇該晶片成為當前被控制設備並且開啟SPI接口。空閒時,需要拉高 |
VSSA | 8 | 1 | 模擬地 |
Anain | 9 | 2 | 晶片錄音或直通時,輔助的模擬輸入。需要一個交流耦合電容(典型值為0.1uF),並且輸入信號的幅值不能超出1.0Vpp。APC暫存器的D3可以決定Anain信號被立刻錄製到存儲器中,與Mic信號混合被錄製到存儲器中,或者被快取到喇叭端並經由直通線路從AUD/AUX輸出。 |
MIC+ | 10 | 3 | 麥克風輸入+ |
MIC- | 11 | 4 | 麥克風輸入- |
VSSP2 | 12 | 5 | 負極PWM喇叭驅動器地 |
SP- | 13 | 6 | 喇叭輸出- |
VCCP | 14 | 7 | PWM喇叭驅動器電源 |
SP+ | 15 | 8 | 喇叭輸出+ |
VSSP1 | 16 | 9 | 正極PWM喇叭驅動器地 |
AUD/ AUX | 17 | 10 | 輔助輸出,決定於APC暫存器的D7,用來輸出一個AUD或AUX輸出。AUD是一個單端電流輸出,而AuxOut是一個單端電壓輸出。他們能夠被用來驅動一個外部揚聲器。出廠默認設定為AUD。APC暫存器的D9可以使其掉電 |
AGC | 18 | 11 | 自動增益控制 |
/VOL | 19 | 12 | 音量控制 |
ROSC | 20 | 13 | 振盪電阻ROSC用一個電阻連線到地,決定晶片的採樣頻率 |
VCCA | 21 | 14 | 模擬電路電源 |
/FT | 22 | 15 | 在獨立按鍵模式下,當FT一直為低,Anain直通線路被激活。Anain信號被立刻從Anain經由音量控制線路發射到喇叭以及AUD/AUX輸出。不過,當在SPI模式下,SPI無視這個輸入,而且直通線路被APC暫存器的D0所控制。該管腳有一個內部上拉和防抖動設計,允許使用按鍵開關來控制開始和結束。 |
/PLAY | 23 | 16 | 播放控制端,有電平觸發和脈衝觸發兩種模式 |
/REC | 24 | 17 | 錄音控制端,低電平有效 |
/ERASE | 25 | 18 | 擦除控制端,低電平有效 |
/FWD | 26 | 19 | 快進控制端,低電平有效 |
RDY /INT | 27 | 20 | 一個開路輸出。 Ready( 獨立模式 ) 該管腳在錄音,放音,擦除和指向操作時保持為低,保持為高時進入掉電狀態 Interrupt(SPI 模式 ) 在完成SPI命令後,會產生一個低信號的中斷。一旦中斷消除,該腳變回為高。 |
VSSD | 28 | 21 | 數字地 |
ISD17240工作電路
獨立按鍵電路
ISD1700的獨立按鍵工作模式錄放電路非常簡單(後附圖),而且功能強大。不僅有錄、放功能,還有快進、擦除、音量控制、直通放音和復位等功能。這些功能僅僅通過按鍵就可完成。
SPI協定工作電路
ISD17240SPI操作例程
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
//******************定義連線埠******************//
sbit SS = P1^0;
sbit SCK = P1^1;
sbit MOSI = P1^2;
sbit MISO = P1^3;
sbit PR = P1^4;//PLAY = 0;REC = 1;
sbit STOP = P1^5;
sbit AN = P1^6;
sbit LED = P1^7;
//******************定義ISD1700狀態暫存器及各標誌位******************//
uchar bdata SR0_L;//SR0暫存器低位、高位
uchar bdata SR0_H;
uchar bdata SR1;//SR1暫存器
uchar APC_L = 0, APC_H = 0;//APC暫存器
uchar PLAYADDL = 0, PLAYADDH = 0;//放音指針低位、高位
uchar RECADDL = 0, RECADDH = 0;//錄音指針低位、高位
sbit CMD_ERR = SR0_L^0;//SPI指令無效標誌位
sbit FULL = SR0_L^1;//晶片存儲空間滿標誌位
sbit PU = SR0_L^2;//上電標誌位
sbit EOM = SR0_L^3;//EOM標誌位
sbit INT = SR0_L^4;//操作完成標誌位
sbit RDY = SR1^0;//晶片空閒標誌位
sbit ERASE = SR1^1;//擦除標誌位
sbit PLAY = SR1^2;//放音標誌位
sbit REC = SR1^3;//錄音標誌位
//******************定義標誌位******************//
uchar bdata fang;
sbit PR_fang = fang^1;//錄音、放音標誌位,放音=0,錄音=1
sbit Erase_fang = fang^4;//擦出標誌位
sbit STOP_fang = fang^7;//停止放音標誌位
//******************延時μs******************//
void delay(uint time)//延時n微秒
{
while(time!=0)
{
time--;
}
}
//******************延時ms******************//
void delayms(uint time)//延時n毫秒
{
for(time; time>0; time--)
{
TH0 = 0xfc;
TL0 = 0x18;
TR0 = 1;//計數器0啟動
while(TF0!=1);//計數溢出處理
TF0 = 0;
TR0 = 0;
}
}
//******************CPU初始化******************//
void cpu_init (void)
{
P1 = 0xFF;
P2 = 0xFF;
P3 = 0xFF;
TMOD = 0x01;//定時器初始化,工作於方式1
EA = 0;//關中斷
fang = 0;//標誌位歸0
LED = 1;//關指示燈
}
//******************傳送、讀回數據******************//
uchar isd_senddata (uchar dat)
{
uchar i, BUF_ISD = dat;
SS = 0;
SCK = 1;
delay(4);
for(i=0; i<8; i++)
{
SCK = 0;
if((BUF_ISD&0x01)==1)
{
MOSI = 1;
}
else
{
MOSI = 0;
}
BUF_ISD = BUF_ISD >> 1;
if(MISO)
{
BUF_ISD = BUF_ISD|0x80;
}
SCK = 1;
delay(6);
}
MOSI = 0;
return(BUF_ISD);
}
//******************上電******************//
void isd_pu (void)
{
isd_senddata (0x01);
isd_senddata (0x00);
SS = 1;
delayms(50);
}
//******************停止當前操作******************//
void isd_stop (void)
{
isd_senddata (0x02);
isd_senddata (0x00);
SS = 1;
delayms(50);
}
//******************復位******************//
void isd_reset (void)
{
isd_senddata (0x03);
isd_senddata (0x00);
SS = 1;
}
//******************清除中斷******************//
void isd_clr_int (void)
{
isd_senddata (0x04);
isd_senddata (0x00);
SS = 1;
}
//******************讀狀態暫存器內容******************//
void isd_rd_status (void)
{
isd_senddata (0x05);
isd_senddata (0x00);
isd_senddata (0x00);
SS = 1;
delay(2);
SR0_L = isd_senddata (0x05);
SR0_H = isd_senddata (0x00);
SR1 = isd_senddata (0x00);
SS = 1;
}
//******************讀放音指針******************//
void isd_rd_playptr (void)
{
isd_senddata (0x06);
isd_senddata (0x00);
isd_senddata (0x00);
isd_senddata (0x00);
SS = 1;
delay(2);
SR0_L = isd_senddata (0x06);
SR0_H = isd_senddata (0x00);
PLAYADDL = isd_senddata (0x00);
PLAYADDH = isd_senddata (0x00);
SS = 1;
}
//******************下電******************//
void isd_pd (void)
{
isd_senddata (0x07);
isd_senddata (0x00);
SS = 1;
delayms(50);
}
//******************讀錄音指針******************//
void isd_rd_recptr (void)
{
isd_senddata (0x08);
isd_senddata (0x00);
isd_senddata (0x00);
isd_senddata (0x00);
SS = 1;
delay(2);
SR0_L = isd_senddata (0x08);
SR0_H = isd_senddata (0x00);
RECADDL = isd_senddata (0x00);
RECADDH = isd_senddata (0x00);
SS = 1;
}
//******************讀晶片ID******************//
uchar isd_devid (uchar deviceNO)
{
isd_senddata (0x09);
isd_senddata (0x00);
isd_senddata (0x00);
SS = 1;
delay(2);
isd_senddata (0x09);
isd_senddata (0x00);
deviceNO = isd_senddata (0x00);
SS = 1;
return(deviceNO);
}
//******************放音******************//
void isd_play (void)
{
isd_senddata (0x40);
isd_senddata (0x00);
SS = 1;
}
//******************錄音******************//
void isd_rec (void)
{
isd_senddata (0x41);
isd_senddata (0x00);
SS = 1;
}
//******************擦除******************//
void isd_erase (void)
{
isd_senddata (0x42);
isd_senddata (0x00);
SS = 1;
}
//******************全部擦出******************//
void isd_g_erase (void)
{
isd_senddata (0x43);
isd_senddata (0x00);
SS = 1;
}
//******************讀APC暫存器內容******************//
void isd_rd_apc (void)
{
isd_senddata (0x44);
isd_senddata (0x00);
isd_senddata (0x00);
isd_senddata (0x00);
SS = 1;
delay(2);
SR0_L = isd_senddata (0x44);
SR0_H = isd_senddata (0x00);
APC_L = isd_senddata (0x00);
APC_H = isd_senddata (0x00);
SS = 1;
}
//******************寫APC暫存器******************//
void isd_wr_apc2 (uchar apcdatl,apcdath)
{
isd_senddata (0x65);
isd_senddata (apcdatl);
isd_senddata (apcdath);
SS = 1;
}
//******************將APC暫存器內容寫入NVCFG******************//
void isd_wr_nvcfg (uchar apcdatl,apcdath)
{
isd_senddata (0x46);
isd_senddata (apcdatl);
isd_senddata (apcdath);
SS = 1;
}
//******************將NVCFG內容寫入APC******************//
void isd_ld_nvcfg (void)
{
isd_senddata (0x47);
isd_senddata (0x00);
SS = 1;
}
//******************快進******************//
void isd_fwd (void)
{
isd_senddata (0x48);
isd_senddata (0x00);
SS = 1;
}
//******************空檢查******************//
void isd_chk_mem (void)
{
isd_senddata (0x49);
isd_senddata (0x00);
SS = 1;
}
//******************外部時鐘的啟用、關閉******************//
void isd_extclk (void)
{
isd_senddata (0x4a);
isd_senddata (0x00);
SS = 1;
}
//******************指定地址放音******************//
void isd_set_play (uchar saddl,saddh,eaddl,eaddh)
{
isd_senddata (0x80);
isd_senddata (0x00);
isd_senddata (saddl);
isd_senddata (saddh);
isd_senddata (eaddl);
isd_senddata (eaddh);
isd_senddata (0x00);
SS = 1;
}
//******************指定地址錄音******************//
void isd_set_rec (uchar saddl,saddh,eaddl,eaddh)
{
isd_senddata (0x81);
isd_senddata (0x00);
isd_senddata (saddl);
isd_senddata (saddh);
isd_senddata (eaddl);
isd_senddata (eaddh);
isd_senddata (0x00);
SS = 1;
}
//******************指定地址擦除******************//
void isd_set_erase (uchar saddl,saddh,eaddl,eaddh)
{
isd_senddata (0x82);
isd_senddata (0x00);
isd_senddata (saddl);
isd_senddata (saddh);
isd_senddata (eaddl);
isd_senddata (eaddh);
isd_senddata (0x00);
SS = 1;
}
//******************晶片系統初始化******************//
void isd_init (void)
{
uchar i = 2;
SS = 1;
SCK = 1;
MOSI = 0;
do
{
isd_pu ();
isd_rd_status ();
}while(CMD_ERR||(!PU));
isd_wr_apc2 (0x40,0x04);
do
{
isd_rd_status ();
}while(RDY==0);
do
{
LED = 0;
delayms(300);
LED = 1;
delayms(300);
i--;
}while(i>0);
}
//******************isd1700的相關操作******************//
void isdwork (void)
{
uchar i;
switch (fang)
{
case 0x00:
{
do
{
isd_rd_status ();
}while(RDY==0);
delayms(10);
isd_play ();
delayms(2);
LED = 0;
do
{
isd_rd_status ();
if(STOP==0)
{
delayms (10);
if(STOP==0)
{
LED = 1;
isd_clr_int ();
isd_stop ();
isd_reset ();
isd_pd ();
isd_init ();
return;
}
}
}while(PLAY==1);
LED = 1;
isd_clr_int ();
do
{
isd_rd_status ();
}while(RDY==0);
delayms (10);
isd_fwd ();
do
{
isd_rd_status ();
}while(RDY==0);
}
break;
case 0x02:
{
isd_clr_int ();
do
{
isd_rd_status ();
}while(RDY==0);
delayms(10);
isd_rec ();
delayms(2);
LED = 0;
do
{
isd_rd_status ();
if(FULL==1)
{
for(i=3; i>0; i--)
{
LED = 0;
delayms (300);
LED = 1;
delayms (200);
}
}
}while(AN==0);
isd_clr_int ();
isd_stop ();
LED = 1;
}
break;
case 0x10:
{
do
{
isd_rd_status ();
}while(RDY==0);
delayms (10);
isd_g_erase ();
delayms (2);
do
{
isd_rd_status ();
}while(RDY==0);
for(i=3; i>0; i--)
{
LED = 0;
delayms (300);
LED = 1;
delayms (200);
}
}
break;
case 0x80:
{
isd_clr_int ();
isd_stop ();
isd_reset ();
isd_pd ();
}
break;
}
}
//******************主程式******************//
void main (void)
{
uchar i;
cpu_init ();
delayms (1);
isd_init ();
while(1)
{
if(AN==0)
{
delayms (10);
if(AN==0)
{
if(PR==1)
{
PR_fang = 1;
}
else
{
PR_fang = 0;
}
isdwork ();
}
}
if(STOP==0)
{
delayms (10);
if(STOP==0)
{
for(i=100; i>0; i--)
{
if(STOP==1)
{
STOP_fang = 1;
isdwork ();
isd_init ();
break;
}
delayms(30);
}
if (STOP_fang==1)
{
fang = 0;
continue;
}
Erase_fang = 1;
isdwork ();
}
}
}
}