基于stm32的语音模块isd1760程序
/**************本函数为语音播放模块。
用到函数名是PLAY_NUM(u8 i);其中i即为想要播放的那一段。
注意:初始化时,要初始化两个函数:
ISD1760_config();
ISD_Init();
另外,在函数PLAY_NUM(u8 i);里面,要根据具体录制修改i的值。
用到的端口:PE0(接语音芯片4脚)
PE1(接语音芯片5脚)
PE2(接语音芯片6脚)
PE3(接语音芯片7脚)
***************************************************************/
#ifndef __ISD1760_H__
#define __ISD1760_H__
#include \"stm32f10x_gpio.h\"
extern uint8_t SR0_L;
extern uint8_t SR0_H; extern uint8_t SR1;
extern uint8_t ID;
extern uint8_t APCL;
extern uint8_t APCH;
#define RCC_GPIO_ISD1760 #define MISO GPIO_Pin_0 #define MOSI GPIO_Pin_1 #define SCLK GPIO_Pin_2 #define nSS GPIO_Pin_3
RCC_APB2Periph_GPIOE
//CPU (IN)
//ISD1760 (OUT)
//语音管脚定义
//SS,SCLK,MOSI
#define SCLK_1 GPIO_SetBits(GPIO_ISD1760, SCLK)
#define SCLK_0 GPIO_ResetBits(GPIO_ISD1760, SCLK)
#define nSS_1 GPIO_SetBits(GPIO_ISD1760, nSS)
#define nSS_0 GPIO_ResetBits(GPIO_ISD1760, nSS)
#define MOSI_1 GPIO_SetBits(GPIO_ISD1760, MOSI)
#define MOSI_0 GPIO_ResetBits(GPIO_ISD1760, MOSI)
//
#define PU 0x01 //Power up
#define STOP 0x02 //
#define RESET 0x03 //??
#define CLI_INT 0x04 //EOM?
#define RD_STATUS 0x05 //
#define RD_PLAY_PTR 0x06 //
#define PD 0x07 //Power down ??
#define RD_REC_PTR 0x08 //
#define DEVID 0x09 #define PLAY 0x40 #define REC 0x41 #define ERASE 0x42 #define G_ERASE 0x43 #define RD_APC 0x44 #define WR_APC1 0x45 #define WR_APC2 0x65 #define WR_NVCFG 0x46 #define LD_NVCFG 0x47 //ID
//
//
//
//
//APC???;APC--?????????
//? //? //?APCNVCFG;?? //?NVCFGAPC #define FWD 0x48 // #define CHK_MEM 0x49 // #define EXTCLK 0x4A // #define SET_PLAY 0x80 //? #define SET_REC 0x81 //? #define SET_ERASE 0x82 //?? #define NOP _nop_() void delayus(void); //15us void Delay(uint16_t z ); //??:??MS,ZMS? uint8_t SPISendData(uint8_t BUF_ISD); //??: SPI()??? void RdStatus(void); //??: void ClrInt(void); //??: void ISD_WR_NVCFG(void); //??: void ISD_WR_APC2(void); //??: ??APC2 void RdAPC(void); //??: ??APC void ISD_Init(void); //??: void ISD_CHK_MEM(void); //??: void ISD_Reset(void); //??: ?? void ISD_Stop(void); //??: ?? void ISD_PU(void); //??: ?? void ISD_PD(void); //??: ?? uint8_t RD_DevID(void); //??: ??ID //void GetToneAdd(uint8_t cNum,uint16_t ipEndAdd);//??: void ISD_PLAY(void); //??: void ISD_FWD(void); void SetREC(uint8_t cNum); //??: * ipStartAdd,uint16_t * void Erase_All(void); //??: void ISD1760_config(void); void PLAY_NUM(u8 i); #endif Isd.c文件 #include \"isd.h\" #include \"delay.h\" #define GPIO_ISD1760 uint8_t SR0_L; uint8_t SR0_H; uint8_t SR1; uint8_t ID; uint8_t APCL; GPIOE uint8_t APCH; void delayus(void) { u8 i=2; while(i--); } void Delay(uint16_t z) { uint16_t x,y; for(x=z;x>0;x--) //7us for(y=185;y>0;y--); } uint8_t SPISendData(uint8_t BUF_ISD) { uint8_t i; uint8_t dat = BUF_ISD; SCLK_1; nSS_0; for(i=0;i<8;i++) //8 { SCLK_0;; //0--1,?(CPU)--?(ISD) delayus(); //SPI if(dat&0x01) // { MOSI_1; //1700 ?? } else { MOSI_0; } dat>>=1; if(GPIO_ReadInputDataBit(GPIO_ISD1760, MISO)) { dat|=0x80; } SCLK_1;; // delayus();; } MOSI_0; // nSS=1; return(dat); } void RdStatus(void) { nSS_0; SPISendData(RD_STATUS); SPISendData(0x00); SPISendData(0x00); nSS_1; Delay(10); //??10ms nSS_0; SR0_L =SPISendData(RD_STATUS); SR0_H =SPISendData(0x00); SR1 =SPISendData(0x00); nSS_1; Delay(10); } void ClrInt(void) { nSS_0; SPISendData(CLI_INT); SPISendData(0x00); nSS_1; Delay(10); } //EOM? void ISD_WR_NVCFG(void) { nSS_0; SPISendData(WR_NVCFG); //?APCNVCFG;?? SPISendData(0x00); nSS_1; Delay(10); } void ISD_WR_APC2(void) { nSS_0; SPISendData(WR_APC2); //? SPISendData(0x70); //0xa8,0xaf,0xa0? SPISendData(0x0c); //0c //D11=1,?SETPLAY,EOMSET_PLAY,EOM nSS_1; Delay(10); ISD_WR_NVCFG(); } void RdAPC(void) { nSS_0; SPISendData(RD_APC); SPISendData(0x00); SPISendData(0x00); SPISendData(0x00); // //APC??? nSS_1; Delay(10); //??10ms SR0_L = SPISendData(RD_APC); SR0_H = SPISendData(0x00); APCL = SPISendData(0x00); APCH = SPISendData(0x00); nSS_1; Delay(10); } void ISD_Init(void) { ISD_Reset(); //??: ?? do { ISD_PU(); //??: ?? RdStatus(); //??: } while((SR0_L&0x01)||(!(SR1&0x01))); Err} ClrInt(); //??: ISD_WR_APC2(); //??: ??APC2 RdAPC(); //??: ??APC } void ISD_CHK_MEM(void) { nSS_0; SPISendData(CHK_MEM); // //if(SR0_L^0==1){system SPISendData(0x00); nSS_1; Delay(10); } void ISD_Reset(void) { nSS_0; SPISendData(RESET); SPISendData(0x00); nSS_1; Delay(50); } void ISD_Stop(void) //?? { nSS_0; SPISendData(STOP); // SPISendData(0x00); nSS_1; Delay(50); } void ISD_PU(void) { nSS_0; SPISendData(PU); //Power up SPISendData(0x00); nSS_1; Delay(50); } void ISD_PD(void) { nSS_0; SPISendData(PD); //Power down ?? SPISendData(0x00); nSS_1; Delay(10); } uint8_t RD_DevID(void) { nSS_0; SPISendData(DEVID); //ID SPISendData(0x00); SPISendData(0x00); nSS_1; Delay(10); //??10ms SR0_L = SPISendData(DEVID); SR0_H = SPISendData(0x00); ID = SPISendData(0x00); nSS_1; Delay(10); return(ID); } void ISD_PLAY(void) { do { RdStatus(); //??: } while((SR0_L&0x01)||(!(SR1&0x01))); //if(SR0_L^0==1){system Err} ClrInt(); //??: nSS_0; SPISendData(PLAY); //从当前位置播放 SPISendData(0x00); nSS_1; Delay(10); //??10ms do { RdStatus(); //??: } while((SR0_L&0x01)||((SR1&0x04))); Err} } void ISD_FWD(void) { do { RdStatus(); //??: } while((SR0_L&0x01)||(!(SR1&0x01))); Err} // 0x04? if(SR0_L^0==1){system //if(SR0_L^0==1){system ClrInt(); //??: nSS_0; SPISendData(FWD); //跳到下一地址处 SPISendData(0x00); nSS_1; Delay(10); //??10ms do { RdStatus(); //??: } while((SR0_L&0x01)||((SR1&0x04))); } void Erase_All(void) { nSS_0; SPISendData(G_ERASE); // SPISendData(0x00); nSS_1; Delay(10); //??10ms } void ISD1760_config(void) //??IO { GPIO_InitTypeDef GPIO_InitStructure; //,????(???) RCC_APB2PeriphClockCmd(RCC_GPIO_ISD1760,ENABLE); //??GPIO?? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; //?? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_GPIO_ISD1760,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOE, &GPIO_InitStructure); /*GPIO?*/ } void PLAY_NUM(u8 i) { i = i+2; // ISD_PLAY(); // delay_ms(100); //?? //?? while(i) { ISD_FWD(); //地址下移一段 delay_ms(100); i--; } ISD_PLAY(); //播放当前地址那段 delay_ms(100); ISD_Reset(); //复位,如果不复位,会记住上一次的语音地址。 Delay(10); / do { ISD_PU(); //?? delay_ms(50); RdStatus(); } while((SR0_L&0x01)||((SR1&0x04)));////////最后这一段,很重要,检查是否在忙。。如果不加此段,则只能播放一段。 } 因篇幅问题不能全部显示,请点此查看更多更全内容