1、STM32ISD1760语音播放STM32_ISD1760语音播放ISD1760.c#include ISD1760.h#define GPIO_ISD1760 GPIOA /*使用的GPIO时钟*/SPI命令输入到1700以前,nSS=1; SCLK=1; MOSI=0; uint8_t SR0_L; /状态寄存器0的低字节uint8_t SR0_H; /状态寄存器0的高字节uint8_t SR1; /状态寄存器1的低字节uint8_t ID;uint8_t APCL;uint8_t APCH; /器件ID、APC低字节、APC高字节 /-/每10秒大约是80个十进制地址,即十六进制0x50
2、,后一段声音越界 85 800/就只会播前段声音的后面的一部分,遇到“EOM”停止.所以根据 /录的秒数乘以8,转化成十六进制数,得到大概地址,后面进行微调。 /- uint16_t caToneA8=0x0010,0x0028, 0x0029,0x0042, 0x0043,0x0059, 0x0060,0x0074; /0x0010是环形起点/-/函数名称:I_delay() /出口参数:无 /函数功能:实现US级的延时 /-void delayus(void) /while(k-);/每次15us while(2-);/-/函数名称:Delay /入口参数:Z /出口参数:无 /函数功能:
3、实现MS级的延时,Z为延时的MS数 /-void Delay(uint16_t z) uint16_t x,y; for(x=z;x0;x-) /7us for(y=185;y0;y-); /990us,相加约等于 1ms 。/-/ /函数名 : SPISendData( ) /功能描述:SPI传输数据(发送数据)子程序-边发数据 边读数据 /-uint8_t SPISendData(uint8_t BUF_ISD) uint8_t i,dat; dat = BUF_ISD; /要写入ISD1760的数据 SCLK_1; nSS_0; /为低选择当前设备,并开启SPI for(i=0;i=1;
4、 if(GPIO_ReadInputDataBit(GPIO_ISD1760, MISO) /如果CPU收到来自ISD1760的数据 dat|=0x80; /1700 输出,下降沿输出 ,同步输出 /因为高位已经右移为0,所以CPU若读到1,可置高位为1,循环之后读回一个字节 SCLK_1; /实现上升沿 delayus(); MOSI_0; /数据发送接收,IO口恢复常规 低 状态 / nSS=1; return(dat); /* * 函数原型: void RdStatus(void); * 功能: 读取状态 */ void RdStatus(void) nSS_0; SPISendData
5、(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); * 功能: 清除中断 */ void ClrInt(void) nSS_0; SPISendData(CLI_INT); /清除中断与EOM位
6、SPISendData(0x00); nSS_1; Delay(10); /* * 函数原型: void ISD_WR_NVCFG(void); * 功能: 永久写入寄存器 */ void ISD_WR_NVCFG(void) nSS_0; SPISendData(WR_NVCFG); /将APC的内容写到NVCFG;永久写入寄存器 SPISendData(0x00); nSS_1; Delay(10); /* * 函数原型: void ISD_WR_APC2(uchar voiceValue); * 功能: 设置APC2 */ void ISD_WR_APC2(void) nSS_0; SP
7、ISendData(WR_APC2); /将的数据写进APC2寄存器,并由脚调节音量 SPISendData(0x70); /0xa8声音最大,0xaf声音最小,0xa0去掉了录音时的监听 SPISendData(0x0c); /0c /D11=1,在SETPLAY模式下,执行到EOM自动结束。或者在连续两个SET_PLAY命令后,执行到第一个EOM自动跳到第二段开始 nSS_1; Delay(10); ISD_WR_NVCFG(); /永久写入寄存器 /* * 函数原型: void RD_APC(void); * 功能: 读取APC */ void RdAPC(void) nSS_0; SP
8、ISendData(RD_APC); /读状态寄存器、当前地址、APC寄存器 SPISendData(0x00); SPISendData(0x00); SPISendData(0x00); 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); * 功能: 初始化 */ void IS
9、D_Init(void) ISD_Reset(); /功能: 复位 do ISD_PU(); /功能: 上电 RdStatus(); /功能: 读取状态 while(SR0_L&0x01)|(!(SR1&0x01); /if(SR0_L0=1)system Err ClrInt(); /功能: 清除中断 ISD_WR_APC2(); /功能: 设置APC2 RdAPC(); /功能: 读取APC /* * 函数原型: void ISD_CHK_MEM(void); * 功能: 空间检查 */ void ISD_CHK_MEM(void) nSS_0; SPISendData(CHK_MEM);
10、 /检测环形存储器是否已满 SPISendData(0x00); nSS_1; Delay(10); /* * 函数原型: void ISD_Reset(void); * 功能: 复位 */ void ISD_Reset(void) nSS_0; SPISendData(RESET); /复位 SPISendData(0x00); nSS_1; Delay(50); /* * 函数原型: void ISD_Stop(void); * 功能: 停止 */ void ISD_Stop(void) nSS_0; SPISendData(STOP); /停止当前操作 SPISendData(0x00)
11、; nSS_1; Delay(50); /* * 函数原型: void ISD_PU(void); * 功能: 上电 */ void ISD_PU(void) nSS_0; SPISendData(PU); /Power up 上电检测 SPISendData(0x00); nSS_1; Delay(50); /* * 函数原型: void ISD_PD(void); * 功能: 掉电 */ void ISD_PD(void) nSS_0; SPISendData(PD); /Power down 掉电 SPISendData(0x00); nSS_1; Delay(10); /* * 函数原
12、型: void RdStatus(void); * 功能: 读取ID */ 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 GetToneAdd(ucha
13、r cNum, Uint * ipStartAdd, Uint * ipEndAdd); * 功能: 取出当前语音的首末地址 (基础函数) */ void GetToneAdd(uint8_t cNum, uint16_t *ipStartAdd, uint16_t *ipEndAdd) *ipStartAdd=caToneAcNum*2; /当前语音的首地址 = 装载地址的数组中的某元素 *ipEndAdd=caToneAcNum*2+1; /* * 函数原型: void SetPLAY(uchar cNum) * 功能: 定点播放 (调用函数) */ void SetPLAY(uint8_
14、t cNum) uint16_t Add_ST, Add_ED; /起始地址,结束地址 uint8_t Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L;/起始地址高8位,起始地址低8位,结束地址高8位,结束地址低8位 do RdStatus(); /功能: 读取状态 while(SR0_L&0x01)|(!(SR1&0x01); /if(SR0_L0=1)system Err ClrInt(); /功能: 清除中断 GetToneAdd(cNum, &Add_ST, &Add_ED); /功能: 取出当前语音的首末地址 Add_ST_L=(uint8_t)(Add
15、_ST&0x00ff); /起始地址低8位 Add_ST_H=(uint8_t)(Add_ST8)&0x00ff); /起始地址高8位 Add_ED_L=(uint8_t)(Add_ED&0x00ff); /结束地址低8位 Add_ED_H=(uint8_t)(Add_ED8)&0x00ff); /结束地址高8位 nSS_0; SPISendData(SET_PLAY); /从开始播放,直到或EOM SPISendData(0x00); SPISendData(Add_ST_L); /S7:S0 开始地址 SPISendData(Add_ST_H); /S10:S8 SPISendData(A
16、dd_ED_L); /E7:E0 结束地址 SPISendData(Add_ED_H); /E10:E8 SPISendData(0x00); nSS_1; Delay(10); /延迟10ms do RdStatus(); /功能: 读取状态 while(SR0_L&0x01)|(SR1&0x04); / 0x04? if(SR0_L0=1)system Err /* * 函数原型: void SetREC(uchar cNum); * 功能: 定点录音 */ void SetREC(uint8_t cNum) uint16_t Add_ST, Add_ED; uint8_t Add_ST_
17、H, Add_ST_L, Add_ED_H, Add_ED_L; do RdStatus(); /功能: 读取状态 while(SR0_L&0x01)|(!(SR1&0x01); /if(SR0_L0=1)system Err ClrInt(); /功能: 清除中断 GetToneAdd(cNum, &Add_ST, &Add_ED); /功能: 取出当前语音的首末地址 Add_ST_L=(uint8_t)(Add_ST&0x00ff); Add_ST_H=(uint8_t)(Add_ST8)&0x00ff); Add_ED_L=(uint8_t)(Add_ED&0x00ff); Add_ED
18、_H=(uint8_t)(Add_ST8)&0x00ff); nSS_0; SPISendData(SET_REC); /从开始录音,直到 SPISendData(0x00); SPISendData(Add_ST_L); /S7:S0 开始地址 SPISendData(Add_ST_H); /S10:S8 SPISendData(Add_ED_L); /E7:E0 结束地址 SPISendData(Add_ED_H); /E10:E8 SPISendData(0x00); nSS_1; Delay(10); /延迟10ms do RdStatus(); /功能: 读取状态 while(SR0_L&0x01)|(!(SR1&0x01); /if(SR0_L0=1)system Err /* * 函数原型: void Erase_All(void); * 功能: 全部删除 */ void Erase_All(void) nSS_0; SPISendData(G_ERASE); /擦除全部曲目除了提示音 SPISendData(0x00); nSS_1; Delay(10); /延迟10ms ISD1760.h/*
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1