STM32ISD1760语音播放.docx
《STM32ISD1760语音播放.docx》由会员分享,可在线阅读,更多相关《STM32ISD1760语音播放.docx(23页珍藏版)》请在冰豆网上搜索。
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
/***********************