您的当前位置:首页正文

基于stm32的语音模块isd1760程序

来源:华佗健康网
Isd.h文件

/**************本函数为语音播放模块。

用到函数名是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--?????????

//?APC1???,??VOL

//?APC2???,??

//?APCNVCFG;??

//?NVCFGAPC

#define FWD 0x48 //

#define CHK_MEM 0x49 //

#define EXTCLK 0x4A //

#define SET_PLAY 0x80 //?,???EOM

#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); //?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)));////////最后这一段,很重要,检查是否在忙。。如果不加此段,则只能播放一段。

}

因篇幅问题不能全部显示,请点此查看更多更全内容