STM32ISD1760语音播放.docx

上传人:b****4 文档编号:24369859 上传时间:2023-05-26 格式:DOCX 页数:23 大小:161.74KB
下载 相关 举报
STM32ISD1760语音播放.docx_第1页
第1页 / 共23页
STM32ISD1760语音播放.docx_第2页
第2页 / 共23页
STM32ISD1760语音播放.docx_第3页
第3页 / 共23页
STM32ISD1760语音播放.docx_第4页
第4页 / 共23页
STM32ISD1760语音播放.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

STM32ISD1760语音播放.docx

《STM32ISD1760语音播放.docx》由会员分享,可在线阅读,更多相关《STM32ISD1760语音播放.docx(23页珍藏版)》请在冰豆网上搜索。

STM32ISD1760语音播放.docx

STM32ISD1760语音播放

STM32_ISD1760语音播放

ISD1760.c

 

#include"ISD1760.h"

#defineGPIO_ISD1760GPIOA/*使用的GPIO时钟*/

//SPI命令输入到1700以前,nSS=1;SCLK=1;MOSI=0;

uint8_tSR0_L;//状态寄存器0的低字节

uint8_tSR0_H;//状态寄存器0的高字节

uint8_tSR1;//状态寄存器1的低字节

uint8_tID;

uint8_tAPCL;

uint8_tAPCH;//器件ID、APC低字节、APC高字节

//-----------------------------------------------------------

//每10秒大约是80个十进制地址,即十六进制0x50,后一段声音越界85800

//就只会播前段声音的后面的一部分,遇到“EOM”停止.所以根据

//录的秒数乘以8,转化成十六进制数,得到大概地址,后面进行微调。

//------------------------------------------------------------

uint16_tcaToneA[8]={0x0010,0x0028,0x0029,0x0042,0x0043,0x0059,0x0060,0x0074};//0x0010是环形起点

//---------------------------------------------------------------

//函数名称:

I_delay()

//出口参数:

//函数功能:

实现US级的延时

//---------------------------------------------------------------

voiddelayus(void)

{

//while(k--);//每次15us\

while(2--);

}

//---------------------------------------------------------------

//函数名称:

Delay

//入口参数:

Z

//出口参数:

//函数功能:

实现MS级的延时,Z为延时的MS数

//---------------------------------------------------------------

voidDelay(uint16_tz)

{

uint16_tx,y;

for(x=z;x>0;x--)//7us

for(y=185;y>0;y--);//990us,相加约等于1ms。

}

//---------------------------------------------------------------//

//函数名:

SPISendData()

//功能描述:

SPI传输数据(发送数据)子程序---边发数据边读数据

//---------------------------------------------------------------

uint8_tSPISendData(uint8_tBUF_ISD)

{

uint8_ti,dat;

dat=BUF_ISD;//要写入ISD1760的数据

SCLK_1;

nSS_0;//为低选择当前设备,并开启SPI

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))//如果CPU收到来自ISD1760的数据

{

dat|=0x80;//1700输出,下降沿输出,同步输出

}//因为高位已经右移为0,所以CPU若读到1,可置高位为1,循环之后读回一个字节

SCLK_1;;//实现上升沿

delayus();;

}

MOSI_0;//数据发送接收,IO口恢复常规低状态

//nSS=1;

return(dat);

}

/**************************************************************************

*函数原型:

voidRdStatus(void);

*功能:

读取状态

**************************************************************************/

voidRdStatus(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);

}

/**************************************************************************

*函数原型:

voidClrInt(void);

*功能:

清除中断

**************************************************************************/

voidClrInt(void)

{

nSS_0;

SPISendData(CLI_INT);//清除中断与EOM位

SPISendData(0x00);

nSS_1;

Delay(10);

}

/**************************************************************************

*函数原型:

voidISD_WR_NVCFG(void);

*功能:

永久写入寄存器

**************************************************************************/

voidISD_WR_NVCFG(void)

{

nSS_0;

SPISendData(WR_NVCFG);//将APC的内容写到NVCFG;永久写入寄存器

SPISendData(0x00);

nSS_1;

Delay(10);

}

/**************************************************************************

*函数原型:

voidISD_WR_APC2(ucharvoiceValue);

*功能:

设置APC2

**************************************************************************/

voidISD_WR_APC2(void)

{

nSS_0;

SPISendData(WR_APC2);//将

D0>的数据写进APC2寄存器,并由

D0>脚调节音量

SPISendData(0x70);//0xa8声音最大,0xaf声音最小,0xa0去掉了录音时的监听

SPISendData(0x0c);//0c

//D11=1,在SETPLAY模式下,执行到EOM自动结束。

或者在连续两个SET_PLAY命令后,执行到第一个EOM自动跳到第二段开始

nSS_1;

Delay(10);

ISD_WR_NVCFG();//永久写入寄存器

}

/**************************************************************************

*函数原型:

voidRD_APC(void);

*功能:

读取APC

**************************************************************************/

voidRdAPC(void)

{

nSS_0;

SPISendData(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);

}

/**************************************************************************

*函数原型:

voidISD_Init(void);

*功能:

初始化

**************************************************************************/

voidISD_Init(void)

{

ISD_Reset();//功能:

复位

do

{

ISD_PU();//功能:

上电

RdStatus();//功能:

读取状态

}

while((SR0_L&0x01)||(!

(SR1&0x01)));//if(SR0_L^0==1){systemErr}

ClrInt();//功能:

清除中断

ISD_WR_APC2();//功能:

设置APC2

RdAPC();//功能:

读取APC

}

/**************************************************************************

*函数原型:

voidISD_CHK_MEM(void);

*功能:

空间检查

**************************************************************************/

voidISD_CHK_MEM(void)

{

nSS_0;

SPISendData(CHK_MEM);//检测环形存储器是否已满

SPISendData(0x00);

nSS_1;

Delay(10);

}

/**************************************************************************

*函数原型:

voidISD_Reset(void);

*功能:

复位

**************************************************************************/

voidISD_Reset(void)

{

nSS_0;

SPISendData(RESET);//复位

SPISendData(0x00);

nSS_1;

Delay(50);

}

/**************************************************************************

*函数原型:

voidISD_Stop(void);

*功能:

停止

**************************************************************************/

voidISD_Stop(void)

{

nSS_0;

SPISendData(STOP);//停止当前操作

SPISendData(0x00);

nSS_1;

Delay(50);

}

/**************************************************************************

*函数原型:

voidISD_PU(void);

*功能:

上电

**************************************************************************/

voidISD_PU(void)

{

nSS_0;

SPISendData(PU);//Powerup上电检测

SPISendData(0x00);

nSS_1;

Delay(50);

}

/**************************************************************************

*函数原型:

voidISD_PD(void);

*功能:

掉电

**************************************************************************/

voidISD_PD(void)

{

nSS_0;

SPISendData(PD);//Powerdown掉电

SPISendData(0x00);

nSS_1;

Delay(10);

}

/**************************************************************************

*函数原型:

voidRdStatus(void);

*功能:

读取ID

**************************************************************************/

uint8_tRD_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);

}

/**************************************************************************

*函数原型:

voidGetToneAdd(ucharcNum,Uint*ipStartAdd,Uint*ipEndAdd);

*功能:

取出当前语音的首末地址(基础函数)

**************************************************************************/

voidGetToneAdd(uint8_tcNum,uint16_t*ipStartAdd,uint16_t*ipEndAdd)

{

*ipStartAdd=caToneA[cNum*2];//当前语音的首地址=装载地址的数组中的某元素

*ipEndAdd=caToneA[cNum*2+1];

}

/**************************************************************************

*函数原型:

voidSetPLAY(ucharcNum)

*功能:

定点播放(调用函数)

**************************************************************************/

voidSetPLAY(uint8_tcNum)

{

uint16_tAdd_ST,Add_ED;//起始地址,结束地址

uint8_tAdd_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_L^0==1){systemErr}

ClrInt();//功能:

清除中断

GetToneAdd(cNum,&Add_ST,&Add_ED);//功能:

取出当前语音的首末地址

Add_ST_L=(uint8_t)(Add_ST&0x00ff);//起始地址低8位

Add_ST_H=(uint8_t)((Add_ST>>8)&0x00ff);//起始地址高8位

Add_ED_L=(uint8_t)(Add_ED&0x00ff);//结束地址低8位

Add_ED_H=(uint8_t)((Add_ED>>8)&0x00ff);//结束地址高8位

nSS_0;

SPISendData(SET_PLAY);//从

S0>开始播放,直到

E0>或EOM

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&0x04)));//0x04?

if(SR0_L^0==1){systemErr}

}

/**************************************************************************

*函数原型:

voidSetREC(ucharcNum);

*功能:

定点录音

**************************************************************************/

voidSetREC(uint8_tcNum)

{

uint16_tAdd_ST,Add_ED;

uint8_tAdd_ST_H,Add_ST_L,Add_ED_H,Add_ED_L;

do

{

RdStatus();//功能:

读取状态

}

while((SR0_L&0x01)|(!

(SR1&0x01)));//if(SR0_L^0==1){systemErr}

ClrInt();//功能:

清除中断

GetToneAdd(cNum,&Add_ST,&Add_ED);//功能:

取出当前语音的首末地址

Add_ST_L=(uint8_t)(Add_ST&0x00ff);

Add_ST_H=(uint8_t)((Add_ST>>8)&0x00ff);

Add_ED_L=(uint8_t)(Add_ED&0x00ff);

Add_ED_H=(uint8_t)((Add_ST>>8)&0x00ff);

nSS_0;

SPISendData(SET_REC);//从

S0>开始录音,直到

E0>

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_L^0==1){systemErr}

}

/**************************************************************************

*函数原型:

voidErase_All(void);

*功能:

全部删除

**************************************************************************/

voidErase_All(void)

{

nSS_0;

SPISendData(G_ERASE);//擦除全部曲目除了提示音

SPISendData(0x00);

nSS_1;

Delay(10);//延迟10ms

}

 

ISD1760.h

 

/***********************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 实习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1