ISD1700 系列录放芯片是一种高集成度,高性能的芯片。它可以多段录音,采样率可在4K 至12K 间调
节,供电范围可以在2.4V 至5.5V 之间。
ISD1700 系列录放芯片可工作于独立按键模式和SPI 控制模式。芯片内有存储管理系统来管理多段语音,
这样在独立按键模式下也能进行多段语音录放。此芯片内有振荡器,可通过外部电阻来调节其振荡频率;还有
带自动增益控制(AGC)的话筒运放,模拟线路输入,
抗锯齿滤波器,多级存储阵列,平滑滤波器,音量控制,直接驱动喇叭的PWM 输出与接外部功放的电流/电压
输出。
ISD1700 还有有新录音提示功能,当有新的录音后,LED 回每几秒闪一次来提示用户有新的录音。此外还
有4 种音效来提示用户的操作结果,如开始录音、停止录音、擦除、下一曲和全部擦除等。
录音数据存储在芯片的FLASH 内,没有经过任何压缩,所以有较好的音质和断电存储。
芯片有两路独立的语音信号输入通道,话筒输入与模拟信号输入。
在独立按键模式下,当某功能操作完成后芯片会自动进入掉电模式来降低功耗。
在SPI 模式下,用户可对芯片进行更多功能操作。如对任意存储地址进行录放,对模拟通道配置寄存器
(Analog Path Configuration register, APC)进行读写等。
2.特点
2.1 按键:
REC:录音,电平触发;
PLAY:放音,边沿触发播放一段,电平触发循环播放;
ERASE:边沿触发擦除首段录音或末段录音,电平触发全局擦除;
FWD:
VOL:8 级音量控制;
RDY/INT:就绪或中断指示;
RESET:复位。
2.2 采样率可通过外接电阻调节
采样率 12KHz 8KHz 6.4KHz 5.3KHz 4KHz
Rosc 53KΩ 80KΩ 100KΩ 120KΩ 160KΩ
可通过SPI 命令选择外部时钟或内部时钟,选用外部时钟时需将Rosc 上的电阻去掉,从该脚输入时钟.
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define PU 0x11 //POWER UP 01
#define STOP 0x12 //停止 02
#define RESET 0x13 //复位 03
#define CLI_INT 0x14 //清除中断和EOM位 04
#define RD_STATUS 0x15 //读取状态寄存器,当前地址 05
#define RD_PLAY_PTR 0x16 //读取状态寄存器,当前地址和播放指针 06
#define PD 0x17 //POWER DOWN 07
#define RD_REC_PTR 0x18 //读取状态寄存器,当前地址和录音指针 08
#define RD_DEVID 0x19 //读取器件ID 09
#define PLAY 0x50 //播放
#define REC 0x51 //录音
#define FWD 0x58 //下一曲
#define ERASE 0X52 //擦除当前曲目
#define G_ERASE 0x53 //擦除全部曲目除了提示音 43
#define RD_APC 0x54 //读取状态寄存器,当前地址和APC寄存器 44
#define WR_APC1 0x55 //将<D11:D0>的数据写进APC寄存器,并由VOL管脚调节音量 45
#define WR_APC2 0x75 //将<D11:D0>的数据写进APC寄存器,并由<D2:D0>调节音量 65
#define WR_NVCFG 0x56 //将APC的内容写到NVCFG中 46
#define CHK_MEM 0x59 //检查环形存储结构 49
#define SET_PLAY 0x90 //从<S10:S0>开始播放,直到<E10:E0>或EOM 80
#define SET_REC 0x91 //从<S10:S0>开始录音,直到<E10:E0> 81
#define SET_ERASE 0x92 //擦除<S10:S0>到<E10:E0>的内容 82
#define SS_1 PORTB|=(1<<PB4) //停止SPI
uchar SR0_L; //SR0的低位
uchar SR0_H; //SR0的高位
uchar SR1; //SR1寄存器
uchar ID,APCL=0,APCH=0;//ID和APC寄存器
void spi_sent_init(void)
{ PORTB |= (1<<PB4)|(1<<PB5)|(1<<PB6)|(1<<PB7);
DDRB |= (1<<DDB5)|(1<<DDB7)|(1<<DDB4); //设置MOSI,SCK和SS为输出
SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);//设置为主机,LSB先发送
SPSR = 0x00; //预分频为128
}
unsigned char ISD_SendData(unsigned int Data)
{
unsigned char sign;
PORTB &=~ (1<<PB4); //强制接收方进入从模式
SPCR |= (1<<MSTR); // MSTR有时会被清零,这里强制进入主机模式
SPDR = Data; //启动数据传输
while(!(SPSR&(1<<SPIF))); //等待传输结束
sign=SPSR;
sign=SPDR;
//PORTB |= (1<<PB4);
return sign;
}
void GetToneAdd(uchar cNum, uint * ipStartAdd, uint * ipEndAdd){
*ipStartAdd=caToneAdd[cNum*2];
*ipEndAdd=caToneAdd[cNum*2+1];
}
void ISD_PU(void){
ISD_SendData(PU);
ISD_SendData(0x00);
SS_1;
delay_ms(50);
}
void ISD_CHK_MEM(void){
ISD_SendData(CHK_MEM);
ISD_SendData(0x00);
SS_1;
delay_ms(10);
}
void ISD_Play(void){
ISD_SendData(PLAY);
ISD_SendData(0x00);
SS_1;
delay_ms(10);
}
void ISD_Stop(void){
ISD_SendData(STOP);
ISD_SendData(0x00);
ISD_SendData(0x00);
ISD_SendData(0xFF);
SS_1;
delay_ms(50);
}
void ISD_FWD(void){
ISD_SendData(FWD);
ISD_SendData(0x00);
SS_1;
delay_ms(50);
}
void ISD_Reset(void){
ISD_SendData(RESET);
ISD_SendData(0x00);
SS_1;
delay_ms(50);
}
void ISD_PD(void){
ISD_SendData(PD);
ISD_SendData(0x00);
SS_1;
}
void ClrInt(void){
ISD_SendData(CLI_INT);
ISD_SendData(0x00);
SS_1;
delay_ms(10); //延迟10ms
}
void ISD_WR_NVCFG(void)
{
ISD_SendData(WR_NVCFG);
ISD_SendData(0x00);
SS_1;
delay_ms(10); //延迟10ms
}
void ISD_ERASE(void){
ISD_SendData(ERASE);
ISD_SendData(0x00);
SS_1;
delay_ms(10);
}
void Erase_All(void){
ISD_SendData(G_ERASE);
ISD_SendData(0x00);
SS_1;
delay_ms(100); //延迟10ms
}
void RdStatus(void){
ISD_SendData(RD_STATUS);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS_1;
delay_ms(10); //延迟10ms
SR0_L =ISD_SendData(RD_STATUS); //SR0低位
SR0_H =ISD_SendData(0x00); //SRO高位
SR1 =ISD_SendData(0x00); //SR1
SS_1;
delay_ms(10);
}
void ISD_REC(void){
ISD_SendData(REC);
ISD_SendData(0x00);
SS_1;
delay_ms(10);
}
uchar RD_DevID(void){
ISD_SendData(RD_DEVID);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS_1;
delay_ms(10); //延迟10ms
SR0_L=ISD_SendData(RD_DEVID);
SR0_H=ISD_SendData(0x00);
ID=ISD_SendData(0x00);
SS_1;
delay_ms(10);
return(ID);
}
void RdAPC(void){
ISD_SendData(RD_APC);
ISD_SendData(0x00);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS_1;
delay_ms(10); //延迟10ms
SR0_L=ISD_SendData(RD_APC); //SR0低位
SR0_H=ISD_SendData(0x00); //SR0高位
APCL=ISD_SendData(0x00); //APC低位
APCH=ISD_SendData(0x00); //APC高位
SS_1;
delay_ms(10); //延迟10ms
}
void ISD_Rd_PLAY_PTR(void){
ISD_SendData(RD_PLAY_PTR);
ISD_SendData(0x00);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS_1;
delay_ms(10); //延迟10ms
SR0_L=ISD_SendData(RD_PLAY_PTR); //SR0低位
SR0_H=ISD_SendData(0x00); //SR0高位
APCL=ISD_SendData(0x00); //APC低位
APCH=ISD_SendData(0x00); //APC高位
SS_1;
delay_ms(10); //延迟10ms
}
void ISD_Rd_REC_PTR(void){
ISD_SendData(RD_REC_PTR);
ISD_SendData(0x00);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS_1;
delay_ms(10); //延迟10ms
SR0_L=ISD_SendData(RD_REC_PTR); //SR0低位
SR0_H=ISD_SendData(0x00); //SR0高位
APCL=ISD_SendData(0x00); //APC低位
APCH=ISD_SendData(0x00); //APC高位
SS_1;
delay_ms(10); //延迟10ms
}
void ISD_WR_APC2(uchar voicue){
ISD_SendData(WR_APC2);
ISD_SendData(0x60|voicue); //0xa8声音最大,0xaf声音最小
ISD_SendData(0x0d); //开的是外部扬声器
//D11=1,在SETPLAY模式下,执行到EOM自动结束。