你试试这个~
/*ISD1760的录放音程序。 */
/**************************************************************************
* SPI操作ISD1760
* SPI操作ISD1760
**************************************************************************/
#include <stm32f10x_lib.h>
#include "sys.h"
#include "isd1760.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
u8 SR0_L;
u8 SR0_H;
u8 SR1;
u8 ID,APCL=0,APCH=0;
u8 SBUF=0;
extern u16 caToneAdd[90];
/**************************************************************************
* 函数原型: void ISD_SPI_Init(void)
* 功 能: IO口初始化
**************************************************************************/
void ISD_SPI_Init(void)
{
RCC->APB2ENR|=1<<4; //使能PORTC时钟
GPIOC->CRL&=0XF0FFFFFF;
GPIOC->CRL|=0X03000000;//PC6 推挽输出 --SCLK
GPIOC->ODR|=1<<6; //PC6 上拉
GPIOC->CRL&=0X0FFFFFFF;
GPIOC->CRL|=0X30000000;//PC7 推挽输出 --MOSI
GPIOC->ODR|=1<<7; //PC7 上拉
GPIOC->CRH&=0XFFFFFFF0;
GPIOC->CRH|=0X00000003;//PC8 推挽输出 --SS
GPIOC->ODR|=1<<8; //PC8 上拉
GPIOC->CRH&=0XFFFFFF0F;//PC9上拉输入 --MISO
GPIOC->CRH|=0X00000080;
GPIOC->ODR|=1<<9;
}
/**************************************************************************
* 函数原型: void ISD_Init(void);
* 功 能: 初始化
**************************************************************************/
void ISD_Init(void)
{
ISD_Reset();
do{
ISD_PU();
delay_ms(50);
RdStatus();
}while((SR0_L&0x01)||!(SR1&0x01)); //if(SR0_L^0==1){system Err}<CMD_Err==1>
SBUF=RD_DevID();//读取芯片ID,----1760为0xa0
ClrInt();
ISD_CHK_MEM();
ISD_WR_APC2(0xa0);
delay_ms(50);
RdAPC();
}
/**************************************************************************
* 函数原型: void ISD_PU(void);
* 功 能: 空间检查
**************************************************************************/
void ISD_CHK_MEM(void)
{
ISD_SendData(CHK_MEM);
ISD_SendData(0x00);
SS=1;
delay_ms(10);
}
/**************************************************************************
* 函数原型: void ISD_PU(void);
* 功 能: 上电
**************************************************************************/
void ISD_PU(void)
{
ISD_SendData(PU|0x10);
ISD_SendData(0x00);
SS=1;
delay_ms(50);
}
/**************************************************************************
* 函数原型: void ISD_Reset(void);
* 功 能: 复位
**************************************************************************/
void ISD_Reset(void)
{
ISD_SendData(RESET);
ISD_SendData(0x00);
SS=1;
delay_ms(50);
}
/*************************************************************************
* 函数原型: void ISD_SendData(u8 BUF_ISD);
* 功 能: 发送数据
**************************************************************************/
u8 ISD_SendData(u8 BUF_ISD)
{
u8 i,dat;
dat=BUF_ISD;
SS=0;
delay_us(18);
for(i=0;i<8;i++)
{
SCLK=0;
delay_us(18);
if(dat&0x01)
{
MOSI=1;
}
else
{
MOSI=0;
}
dat>>=1;
SCLK=1;
delay_us(18);
if(MISO)
{
dat|=0x80;
}
}
MOSI=0;
delay_us(18);
return(dat);
}
/**************************************************************************
* 函数原型: void RdStatus(void);
* 功 能: 读取状态
**************************************************************************/
void RdStatus(void)
{
ISD_SendData(RD_STATUS);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS=1;
delay_ms(10); //延迟10ms
SR0_L =ISD_SendData(RD_STATUS);
SR0_H =ISD_SendData(0x00);
SR1 =ISD_SendData(0x00);
SS=1;
delay_ms(10);
}
/**************************************************************************
* 函数原型: void RdStatus(void);
* 功 能: 读取ID
**************************************************************************/
u8 RD_DevID(void)
{
ISD_SendData(RD_DEVID);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS=1;
delay_ms(10); //延迟10ms
SR0_L =ISD_SendData(RD_DEVID);
SR0_H =ISD_SendData(0x00);
ID =ISD_SendData(0x00);
SS=1;
delay_ms(10);
return(ID);
}
/**************************************************************************
* 函数原型: void RD_APC(void);
* 功 能: 读取APC
**************************************************************************/
void RdAPC(void)
{
ISD_SendData(RD_APC);
ISD_SendData(0x00);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS=1;
delay_ms(10); //延迟10ms
SR0_L =ISD_SendData(RD_APC);
SR0_H =ISD_SendData(0x00);
APCL =ISD_SendData(0x00);
APCH =ISD_SendData(0x00);
SS=1;
delay_ms(10); //延迟10ms
}
/**************************************************************************
* 函数原型: void ClrInt(void);
* 功 能: 清除中断
**************************************************************************/
void ClrInt(void)
{
ISD_SendData(CLR_INT);
ISD_SendData(0x00);
SS=1;
delay_ms(10); //延迟10ms
}
/**************************************************************************
* 函数原型: void ISD_WR_APC2(u8 voiceValue);
* 功 能: 设置APC2
**************************************************************************/
void ISD_WR_APC2(u8 voiceValue)
{
ISD_SendData(WR_APC2);
ISD_SendData(voiceValue); //后3位为音量
ISD_SendData(0x04); //0x04 EOM=0,VALERT=1 ,0x 0C EOM=1
SS=1;
delay_ms(10); //延迟10ms
ISD_WR_NVCFG(); //永久写入寄存器/此程序正在放音要调整音量时不要添加!!
}
/**************************************************************************
* 函数原型: void ISD_WR_NVCFG(void);
* 功 能: 永久写入寄存器
**************************************************************************/
void ISD_WR_NVCFG(void)
{
ISD_SendData(WR_NVCFG);
ISD_SendData(0x00);
SS=1;
delay_ms(10); //延迟10ms
}
/**************************************************************************
* 函数原型: void SetPLAY(u8 cNum);
* 功 能: 定点播放
**************************************************************************/
void SetPLAY(u8 cNum)
{
u16 Add_ST,Add_ED;
u8 Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L;
do{
RdStatus();
}while((SR0_L&0x01)||!(SR1&0x01)); //if(SR0_L^0==1){system Err}<CMD_Err==1>
ClrInt();
Add_ST=caToneAdd[cNum*2];
Add_ED=caToneAdd[cNum*2+1];
Add_ST_L=(u8)(Add_ST&0x00ff);
Add_ST_H=(u8)((Add_ST>>8)&0x00ff);
Add_ED_L=(u8)(Add_ED&0x00ff);
Add_ED_H=(u8)((Add_ED>>8)&0x00ff);
ISD_SendData(SET_PLAY);
ISD_SendData(0x00);
ISD_SendData(Add_ST_L); //S7:S0 开始地址
ISD_SendData(Add_ST_H); //S10:S8
ISD_SendData(Add_ED_L); //E7:E0 结束地址
ISD_SendData(Add_ED_H); //E10:E8
ISD_SendData(0x00);
SS=1;
delay_ms(10); //延迟10ms
do{ //等待语音播放完成,注释掉后可以实现播放内容的打断
RdStatus();
}while((SR0_L&0x01)||(SR1&0x04)); //if(SR0_L^0==1){system Err}<CMD_Err==1>
}
/**************************************************************************
* 函数原型: void ISD_PD(void);
* 功 能: 掉电
**************************************************************************/
void ISD_PD(void)
{
ISD_SendData(PD);
ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
* END
* END
**************************************************************************/
|