D0>控制音量,而不是通过VOL引脚,改变音量时需要特别注意芯片是否在执行其他动作,否则会发生意外错误。
19、自由播放指令SET_PLAY(0x80):
此命令从开始地址开始播放一直到结束地址,RDY位只有在芯片锁存地址后,为1,一旦此位为1,就可再次发送此命令,以此实现最小延时连续播放。
执行此命令时芯片只对SET_PLAY,STOP,RESET,CLR_INT,RD_STATUS,PD命令做出相应。
20、自由录音指令SET_REC(0x81):
此命令从开始地址开始录音一直到结束地址,RDY位只有在芯片锁存地址后,为1,一旦此位为1,就可再次发送此命令,以此实现最小延时连续录音。
执行此命令时芯片只对SET_REC,STOP,RESET,CLR_INT,RD_STATUS,PD命令做出相应。
21、自由擦除SET_ERASE(0x82):
;此命令从开始地址开始擦除一直到结束地址,RDY位在擦除过程中一直为低电平,直到擦除完成。
擦除过程中芯片只对RESET,CLR_INT,RD_STATUS,PD命令作出相应
SPI操作要点
开始时录音指针和放音指针都指向开头存储空间0x010。
录音完成后,录音指针指向下一个可录音单元,放音指针则随着录音片段的增加指向最新录制完成的语音片段。
播放时可接受的命令:
STOP,RESET,CLR_INT,RD_STATUS和PD,在播放期间RDY以及PLAY标志位均为0。
录音时可接受的命令:
STOP,RESET,CLR_INT,RD_STATUS和PD,在录音期间RDY以及REC标志位均为0。
擦除时可接受的命令:
RESET,CLR_INT,RD_STATUS,PD,在擦除期间RDY以及ERASE标志位均为0。
擦除时必须保证指针指向第一段或最后一段语音片段。
全部擦除时可接受的命令:
RESET,CLR_INT,RD_STATUS和PD,在全部擦除期间RDY以及ERASE标志位均为0。
快进操作只能在芯片空闲状态时发送。
读取放音指针和录音指针最好在CHK_MEM操作后进行。
CHK_MEM使录音指针指向最近可录音单元,是放音指针指向最后一个语音段。
复位,掉电,清除中断,读取状态在播放、擦除或录音时能接收执行,另外播放和录音时能够接收停止指令。
停止命令只有对放音、录音、自由放音和自由录音有效。
中断是一个操作完成的标志,在下一个命令发送之前必须将中断清零。
产生中断的命令:
放音录音下一曲擦除全部擦除更新指针CHK_MEM停止复位
电路连接
Reset引脚在不用时接高电平
Anala受APC的D3位影响
MIC-/+受APC的D4位影响
SP-/+受APC的D8位影响
AUD/AUX受APC的D7位影响
AGC引脚可使失真减小到最少,将4.7μF的电容接到此引脚使其工作
ROSC引脚接一个电阻到地决定采样率
FT引脚独立按键模式低电平激活,激活后模拟信号会直接从Anlal引脚传送到SP-/+或AUX/AUD;SPI模式受APC的D6控制
INT/RDY引脚,在独立模式下位RDY功能,在SPI模式下时INT功能,当一个SPI命令完成后为低电平,清除中断后为高电平。
/*-------------------------------------------------------.C.H文件----------------------------------------------*/
//H文件
#ifndef__1760_H
#define__1760_H
/*----------------------ISD1700SPI通信引脚位定义------------------*/
sbitSS=P1^3;//芯片片选引脚,低电平有效
sbitSCK=P1^4;//时钟线
sbitMOSI=P1^5;//主入从出数据引脚
sbitMISO=P1^6;//主出从入数据引脚
uint8SPI_Senddata(uint8dat);
voidISD_PU(void);
voidISD_STOP(void);
voidISD_RESET(void);
voidISD_CLR_INT(void);
voidRead_Status(void);
voidISD_PD(void);
uint8ISD_DEVID(void);
voidISD_PLAY(void);
voidISD_REC(void);
voidISD_ERASE(void);
voidISD_G_ERASE(void);
voidISD_FWD(void);
voidISD_RD_PLAY_PTR(void);
voidISD_RD_REC_PTR(void);
voidISD_CHK_MEM(void);
voidISD_WR_APC1(uint8apcdatl,uint8apcdath);
voidISD_WR_APC2(uint8apcdatl,uint8apcdath);
voidISD_SET_PLAY(uint8s_addl,uint8s_addh,uint8e_addl,uint8e_addh);
voidISD_SET_REC(uint8s_addl,uint8s_addh,uint8e_addl,uint8e_addh);
voidISD_SET_ERASE(uint8s_addl,uint8s_addh,uint8e_addl,uint8e_addh);
voidISD_Init(void);
#endif
//C文件
#include"main.h"
#include"1760.h"
#include"delay.h"
#include"1602.h"
codeuint8message[]="SystemInit";
//SPI数据传送函数,必须保证外部SS=1
//但是不能在此函数中令SS=1
//因为命令为多字节命令,发送命令时必须保证SS=0
uint8SPI_Senddata(uint8dat)
{
uint8i,j,SPI_Buf=dat;
for(i=0;i<8;i++)
{
SCK=0;
for(j=0;j<4;j++);
if(SPI_Buf&0x01)//先移出低位
MOSI=1;
else
MOSI=0;
SPI_Buf>>=1;
if(MISO)
SPI_Buf|=0x80;
SCK=1;
for(j=0;j<4;j++);
}
returnSPI_Buf;
}
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*********************************************************************************************************************/
//上电
voidISD_PU(void)
{
SS=0;
SR0_L=SPI_Senddata(0X01);
SR0_H=SPI_Senddata(0X00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=0;
}
//停止当前操作
voidISD_STOP(void)
{
SS=0;
SR0_L=SPI_Senddata(0X02);
SR0_H=SPI_Senddata(0X00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//复位
voidISD_RESET(void)
{
SS=0;
SR0_L=SPI_Senddata(0X03);
SR0_H=SPI_Senddata(0X00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//清除中断
voidISD_CLR_INT(void)
{
SS=0;
SR0_L=SPI_Senddata(0X04);
SR0_H=SPI_Senddata(0X00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//读取状态寄存器
voidRead_Status(void)
{
SS=0;
SR0_L=SPI_Senddata(0X05);
SR0_H=SPI_Senddata(0X00);
SR1=SPI_Senddata(0X00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//掉电
voidISD_PD(void)
{
SS=0;
SR0_L=SPI_Senddata(0X07);
SR0_H=SPI_Senddata(0X00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//读取ID
uint8ISD_DEVID(void)
{
uint8ID;
SS=0;
SR0_L=SPI_Senddata(0X09);
SR0_H=SPI_Senddata(0X00);
ID=SPI_Senddata(0X00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
returnID;
}
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*********************************************************************************************************************/
//放音
voidISD_PLAY(void)
{
SS=0;
SR0_L=SPI_Senddata(0X40);
SR0_H=SPI_Senddata(0X00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//录音
voidISD_REC(void)
{
SS=0;
SR0_L=SPI_Senddata(0x41);
SR0_H=SPI_Senddata(0x00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//局部擦除
voidISD_ERASE(void)
{
SS=0;
SR0_L=SPI_Senddata(0x42);
SR0_H=SPI_Senddata(0x00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//全部擦除
voidISD_G_ERASE(void)
{
SS=0;
SR0_L=SPI_Senddata(0x43);
SR0_H=SPI_Senddata(0x00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//下一曲
voidISD_FWD(void)
{
SS=0;
SR0_L=SPI_Senddata(0x48);
SR0_H=SPI_Senddata(0x00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//读取放音指针
voidISD_RD_PLAY_PTR(void)
{
SS=0;
SR0_L=SPI_Senddata(0x06);
SR0_H=SPI_Senddata(0x00);
PlayAddL=SPI_Senddata(0x00);
PlayAddH=SPI_Senddata(0x00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//读取录音指针
voidISD_RD_REC_PTR(void)
{
SS=0;
SR0_L=SPI_Senddata(0x08);
SR0_H=SPI_Senddata(0x00);
RecAddL=SPI_Senddata(0x00);
RecAddH=SPI_Senddata(0x00);
MOSI=0;//保证MOSI引脚在输入SPI命令之前为低电平
SS=1;
}
//存储空间检查函数
voidISD_CHK_MEM(void)
{
SS=0;
SPI_Senddata(0x49);
SPI_Senddata(0x00);
MOSI=0;
SS=1;
}
//ISD1760配置函数1
voidISD_WR_APC1(uint8apcdatl,uint8apcdath)
{
SS=0;
SPI_Senddata(0x45);
SPI_Senddata(apcdatl);
SPI_Senddata(apcdath);
SS=1;
}
//ISD1760配置函数2
voidISD_WR_APC2(uint8apcdatl,uint8apcdath)
{
SS=0;
SPI_Senddata(0x65);
SPI_Senddata(apcdatl);
SPI_Senddata(apcdath);
SS=1;
}
/*********************************************************************************************************************/
/*********************************************************************************************************************/
/*****************************************************************