标题：ISD17240
语音芯片
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 ();
}
}
}
}