成功测试ISD1760语音芯片使用总结_第1页
成功测试ISD1760语音芯片使用总结_第2页
成功测试ISD1760语音芯片使用总结_第3页
成功测试ISD1760语音芯片使用总结_第4页
成功测试ISD1760语音芯片使用总结_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ISD1760语音芯片SPI使用总结注意:此资料参照前人总结,经自己细心成功调试程序后,修改的文档,做了细致的补

充,敬请读者详细阅读,想直接阅读程序的,可以直接跳转到附录:程序一、该语音芯片的使用要仔细分析英文PDF的资料,电路可按中青世纪论坛上面所给的电路搭建,也可按英文PDF后面所画的电路图焊接。本芯片使用不单纯是一个放音电路,还含有其他的控制,因此程序要仔细参考。二、试验中采用的是ISD1760语音芯片,采样率为8K时,一共能播放60S的语音,最大地址为0X1EF,录音实际地址为0xl0~0xlEF,(千万不要以为开始地址为:S0—S10,结束地址为:E0—E10,这样算下来地址就是:0X7ff=2047,从0—2047为2048个字节,采样频率为8K即:每个字节就是125ms,125X2048个字节=256s,可是,实际的录音时长为60S,所以是错误的)则最大地址为:0x1EF-0x10=0x1DF=479479+1=480个字节;480*125MS=60S,也就是说8K采样率时每1个地址最小语音长度为125MS,因此如果知道单个语音的长度,暂时无编程器的时候,也可自己推断每个语音所占的地址长度。三、SPI操作时要严格遵守PDF上所给的各项操作,这里不列出。暂时仅给出试验中遇到的所有问题并如何解决的。1, 一开始本实验是自己用通用板自己照电路搭建的平台,此电路正确与否可把PLAY管腿和地短路,如果芯片有语音并且电路功放及外围电路正确的话,此时芯片就会把所有语音全都循环读一遍。接下来把4个SPI口与单片机接通,尝试软件控制。主循环中可设置一个连续播放的程序,上电就循环放音。放音程序没错的话第一步便成功了!这期间我遇到的问题主要有放不出音,读音混乱,有杂音。如果放不出音,先检查电路,程序放出声音应该没出现什么问题。2, 本芯片设置的APC值为0xA0和0x04(第三位设置声音大小),具体对应功能参见中文PDF。3, 在SPI协议总叙述中有一句错误:如图所示5.2SPI协议总述ISD1700>列的SPE串行接口操作遵照以下协1・一牛生FI址理开始于毋S管脚的T降沿“2.在一个完整的詈FI捋令传输周期r/SSt脚必須保持低电平=冲J冲J”丄LJ日叶测UJ*MOSI£SP1指令操作码包括命令字节,数据字节和地址字节,这决定于5』当命令字及地址数据输入到MOSI1?脚时,同时状态寄存器和当前行地址信息从MlSO^f脚移出。召・一个SFI处理在怡S变高后启动»7.在完成一个豊FI命令的操作后,会启动一个中断信息.并且持续4, 状态寄存器返回值表在PDF中标志的不太明显,标出是错误的。如下:Bi;0CMDErrLSBHI:dA3L3BBit16doFCMDErrBitIBit17~OV~

MemofyFulTBvtestatusReaisierD.(Low_Bj?t'e!)BitIr加njplBi(2Bit3EOMA上砧首V虑ELHUL亀叩IH割5山电?月讥刨Bit13IBit和:UA5BrtiiA6Bit12Bi;0CMDErrLSBHI:dA3L3BBit16doFCMDErrBitIBit17~OV~

MemofyFulTBvtestatusReaisierD.(Low_Bj?t'e!)BitIr加njplBi(2Bit3EOMA上砧首V虑ELHUL亀叩IH割5山电?月讥刨Bit13IBit和:UA5BrtiiA6Bit12A714Bit7TaTMSB巳III:

AIDBit1&02/

pd尿「UpBttt9苗厂EOf/BlID4iInlerruptBit2^1BII25■千曰【2$BK27Sil23 :DS/A3D9/A4DtO■A5D11.rA6DI2/迎ggDI3/ASAHIt23AOD14/A9□15/A105ILA2LSBBit32-ML.EzrrISBBIT33MEEQhHI—B111口世电!ORD[L^轴□屮时Bit34Pci*日UpBit35EOM已l4CiL^B刖41A4団[42A&Bitjg

cmdErrBH49Bit50[■.■lerncfyFull卩门\*亡「up血£1EOf/MSBRI1旳ell47AID脚2A29⑷interruptaninEErnjplAO旦14斗”A7LlUC-^5.4.1SKO格式SRO#?r15A10SfflttbiilO第字节位名称描述7A2当前行地址bittH6A1当前行地址bitl13朋删踰5A0当前行地址bitO4ENT当一个操作完成时,该位置h可被CLR_INT命令梢除113EOM当检测EOM时此位置「可被CLR_rNT命令淸除11]«AiIftB2PU当芯片在$円摸式中上电后,此位背11FULL此位置1表示存储龙已満。芯片不能再录任何信息,除非IE的信息被制除。此位只有遵循独立按键模式的存储体隽才有效9M!AJ0CMD_ERR此也賢$表示上一个SPI^令无效制WOStatusRegisterl(SRI)SRI&名称描述7SEI当音效1被录入后此位置1,擦除后置06SE2当音敕1被录入后此位置b擦除后置05SEI当音效1祓录入后此位置1,擦除后置04SE4当音效1被录入后此位置h擦除后置03REC此位置1表示正在录音2PLAY此位置1表示正在放音1ERASE此位置1表示正在擦除0RDYRD¥=1时表示空闲,可以接收号F[命令;RB'M)时対忙卜不接受新的命令,但除了CLRJNT.RB_STATUSrPD这些指令’当然在REC和PLAY时*也可以接受STOP命令占当附件:头文件:1?#ifndef__ISD17XX_H__#define__ISD17XX_H__// //命令定义#definePU0x01 //17xx上电#defineSTOP0x02 //停止当前操作#defineRESET0x03 //芯片复位#defineCLR_INT0x04 //清除EOM标志和中断信号#defineRD_STATUS0x05 //返回状态寄存器内容#defineRD_PLAY_PTR0x06 //在1,2字节返回状态寄存器信息,2,3字节返回放音指针#definePD0x07 //芯片下电#defineRD_REC_PTR0x08 //在1,2字节返回状态寄存器信息,2,3字节返回录音指针#defineDEVID0x09 //读取芯片ID号码#definePLAY0x40 //从当前地址放音#defineRECOx4l//从当前地址录音#defineERASEOx42//擦除当前语音段#defineG_ERASEOx43//擦除芯片所有语音#defineRD_APCOx44//返回状态寄存器信息在1,2字节,APC寄存器信息在3字节#defineWR_APClOx45//将<D11:DO>写入APC寄存器#defineWR_APC2Ox65//将〈D11:D0〉写入APC寄存器,并由〈D2:D0〉位控制音量#defineWR_NVCFGOx46//将APC内容写入NVCFG#defineLD_NVCFGOx47//将NVCFG内容写入APC#defineFWDOx48//将放音指针指向下一段语音地址处#defineCHK_MEMOx49//检查环状存储体系#defineEXTCLKOx4a//外部时钟使能#defineSET_PLAYOx8O//从起始地址〈S1O:SO〉放音到结束地址〈E1O:EO〉结束#defineSET_RECOx8l//从起始地址〈S1O:SO〉录音到结束地址〈E1O:EO〉结束#defineSET_ERASEOx82//从起始地址〈S1O:SO〉擦除到结束地址〈E1O:EO〉结束//经测试,该语音最大地址为:Oxlef////定义除命令外剩余字节个数#defineSurplus_One_BYTE1//定义字节个数为4#defineSurplus_Two_BYTE2//定义字节个数为2#defineSurplus_Three_BYTE3//定义字节个数为3// //数据类型定义#defineucharunsignedchar#defineuintunsignedint// //SPI与MCU引脚连接#defineISD176O_SSPORTB_PBO#defineISD176O_SCLKPORTB_PB1#defineISD176O_MOSIPORTB_PB3#defineISD176O_MISOPORTB_PB5ISDl76O_SS=OISDl76O_SS=lISDl76O_SS=OISDl76O_SS=lISDl76O_MISO=OISDl76O_MISO=lISDl76O_MOSI=OISDl76O_MOSI=lISDl76O_SCLK=OISDl76O_SCLK=l#defineDISENISDl76O_SS#defineISDl76O_MISO_L#defineISDl76O_MISO_H#defineISDl76O_MOSI_L#defineISDl76O_MOSI_H#defineISDl76O_SCLK_L#defineISDl76O_SCLK_H// //函数声明volatileucharISDl76O_Spio(uchardat)voidISDl76O_delay(uintm);voidISDl76O_ready(void);voidISD1760_Write_APC2(void);voidISD1760_Set_fuction(volatileucharCommand,volatileuchar*SR012,volatileuint*caToneAdd,volatileucharVOICE_NUM);voidISD1760_TEST(void);voidISD1760_Command(volatileucharCommand,volatileuchar*SR01,volatileucharN);#endifC文件://^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^jsDIY_研究ISD17XX_语音芯片:到手即可用*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//#include"config.h"//注意此头文件中要包含自己所用单片机,下面是本人自己的例子:/*****************************#include"config.h"*************************************在此头文件中将包含所有的头文件名字,以后你只需要调用这个头文件名就可以写任何有关的C程序的字头文件和子函数C模块#ifndef__CONFIG_H__//startof__CONFIG_H__#define__CONFIG_H__#include<stdio.h>#include<hidef.h>#include"derivative.h"#include"init.h"#include"Ctrl.h"#include"ADC.h"#include"nokia_5110.h"#include"isd17xx.h"//注意本人在此包含了ISD17XX.H头文件#include"interrupt.h"#defineTURE1#defineFAULT0#endif//endof__CONFIG_H__*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*////名称:voidISD1760_delay(uintm)功能:延时输入:uintm //延时参数输出:无返回:无*备注:无*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidISD1760_delay(uintm){uintn,p;for(n=m;n>0; n--)

for(p=0;p<100;p++);//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js名称:voidISD1760_ready(void)功能:芯片SPI准备阶段输入:无* 输出:无* 返回:无* 备注:无*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidISD1760_ready(void){DISENISD1760_SS;ISD1760_SCLK_H;ISD1760_MOSI_L;ENISD1760_SS;}//名称:volatileucharISD1760_Spio(volatileuchardat)功能:写与读一个字节数据输入:volatileuchardat//写入数据输出:volatileuchardat//读出数据返回:无*备注:无*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//volatileucharISD1760_Spio(volatileuchardat){volatileuchari;//将dat//将dat字节的8个位数据一一送到MOSI线上//先将SCLK拉低//MOSI和MISO信号同时改变数据,但有前后关系如:左程序{ISD1760_SCLK_L;if(dat&0x01){ISD1760_MOSI_H;}else{ISD1760_MOSI_L;}dat>>=1;if(ISD1760_MISO==1)

{dat|=0x80;}ISD1760_SCLK_H; //SCLK来一个上升沿锁存MOSI信号}ISD1760_M0SI_L; //非忙线时MOSI要拉低return(dat);}//名称:voidISD1760_Write_APC2(void)功能:设置芯片模拟输入方式:模拟寄存器APC2输入:无输出:无返回:无*备注:无*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidISD1760_Write_APC2(void){volatileucharSR0L,SR0H,SR1;volatileucharDATA[4];ISD1760_Command(PU,DATA,Surplus_One_BYTE);ISD1760_ready();SR0LISD1760_ready();SR0L=ISD1760_Spio(WR_APC2);SR0H=ISD1760_Spio(0x47);SR1=ISD1760_Spio(0x04);DISENISD1760_SS;//SPI总线准备好//发送命令字节//发送数据字节1//发送数据字节2//一个命令完毕**输入:ucharCommand,*uchar*SR012*ucharVOICE_NUM*输出:无*返回:无*备注:无名称:ISD1760_Set_fuction(volatileucharCommand,volatileuchar*SR012,volatileucharVOICE_NUM)功能:设置语音具体地址功能,并作用//具体功能命令//寄存器SR0,SR1,SR2数据返回//语音段号*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidISD1760_Set_fuction(volatileucharCommand,volatileuchar*SR012,volatileuint*caToneAdd,volatileucharVOICE_NUM){volatileuintAdd_ST,Add_ED;

volatileucharAdd_ST_H,Add_ST_L,Add_ED_H,Add_ED_L;Add_ST=caToneAdd[VOICE_NUM*2]; //提取开始和结束地址Add_ED=caToneAdd[VOICE_NUM*2+1];//分配开始和结束地址//SPI总线准备好//分配开始和结束地址//SPI总线准备好Add_ST_H=(uchar)((Add_ST>>8)&0x00ff);Add_ED_L=(uchar)(Add_ED&0x00ff);Add_ED_H=(uchar)((Add_ED>>8)&0x00ff);ISD1760_ready();SR012[0]=SR012[0]=ISD1760_Spio(Command);SR012[1]=ISD1760_Spio(0x00);SR012[2]=ISD1760_Spio(Add_ST_L);SR012[3]=ISD1760_Spio(Add_ST_H);SR012[0]=ISD1760_Spio(Add_ED_L);SR012[0]=ISD1760_Spio(Add_ED_H);//发送数据字节1//发送数据字节2,放音起始地址低8位〈S7:S0〉//发送数据字节3,放音起始地址高3位〈S10:S8〉,ISD1760不用//发送数据字节4,放音结束地址低8位〈E7:E0〉//发送数据字节5,放音结束地址低8位〈E10:E8〉,ISD1760不用//发送数据字节6SR012[0]=//发送数据字节6DISENISD1760_SS;}//名称:ISD1760_Command(volatileucharCommand,volatileuchar*SR01,volatileucharSurplusjbyte)功能:设置语音具体地址功能,并作用输入:uchar Command, //具体功能命令uchar *SR01 //寄存器SR0,SR1数据返回uchar Surplus_byte //除命令外剩余字节个数输出:无返回:无备注:特别注意这个函数delay(lOOOO);延时时间一定要相当长,给予芯片指针一定的反应时间,否则命令无效*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidISD1760_Command(volatileucharCommand,volatileuchar*SR01,volatileucharSurplus_byte){volatileuchari=0;if(Surplus_byte〉0&&Surplus_byte〈4){ISD1760_ready(); //SPI总线准备好SR01[0]=ISD1760_Spio(Command);//发送命令字节while(++i〈=Surplus_byte)SR01[i]=ISD1760_Spio(0x00); //发送命令字节DISENISD1760_SS;ISD1760_delay(10000); //一定注意:延时要足够长

elsereturn;/ *X**X**X**X**X**X**X**X**X**X**X**X**X**X**X**X**X**X**X**X**X**X**X**X* /—i—*\/*x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x**x*/ 口Fl—f■_.乂#definePUOxOl//17xx上电#defineSTOPOxO2//停止当前操作#defineRESETOxO3//芯片复位#defineCLR_INTOxO4//清除EOM标志和中断信号#defineRD_STATUSOxO5//返回状态寄存器内容#defineRD_PLAY_PTROxO6//在1,2字节返回状态寄存器信息,2,3字节返回放音指针#definePDOxO7//芯片下电#defineRD_REC_PTROxO8//在1,2字节返回状态寄存器信息,2,3字节返回录音指针#defineDEVIDOxO9//读取芯片ID号码#definePLAYOx4O//从当前地址放音#defineRECOx4l//从当前地址录音#defineERASEOx42//擦除当前语音段#defineG_ERASEOx43//擦除芯片所有语音#defineRD_APCOx44//返回状态寄存器信息在1,2字节,APC寄存器信息在3字节#defineWR_APClOx45//将〈D11:D0〉写入APC寄存器#defineWR_APC2Ox65//将〈D11:D0〉写入APC寄存器,并由〈D2:D0〉位控制音量#defineWR_NVCFGOx46//将APC内容写入NVCFG#defineLD_NVCFGOx47//将NVCFG内容写入APC#defineFWDOx48//将放音指针指向下一段语音地址处#defineCHK_MEMOx49//检查环状存储体系#defineEXTCLKOx4a//外部时钟使能#defineSET_PLAYOx8O//从起始地址〈S1O:SO〉放音到结束地址〈E1O:EO〉结束#defineSET_RECOx8l//从起始地址〈S1O:SO〉录音到结束地址〈E1O:EO〉结束#defineSET_ERASEOx82//从起始地址〈S1O:SO〉擦除到结束地址〈E1O:EO〉结束*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*////名称:voidISD1760_TEST(void)功能:调用此函数,单步调试,可以测试语音的所有段地址*输入:无*输出:无*返回:无*备注:无*1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1**1*//voidISD1760_TEST(void){//音乐地址存放数组,2个一组,注意其最大存放地址为:OxOlef//volatileuintTone_Add[]={0x10,0x3b,0x3c,0x89,0x8a,0xda,0xdb,0x12d,0x12e,0x1ef};//^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js^js

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论