电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 华强电子网公众号

    电子元器件

    采购信息平台

  • 华强电子网移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

ISD1760录放音程序

来源:-- 作者:-- 浏览:1418

标签:

摘要: /************************************************************************** * SPI操作ISD1760 * SPI操作ISD1760 ******************

/************************************************************************** 
*    SPI操作ISD1760 

 

*    SPI操作ISD1760 
**************************************************************************/  #include<SPI.H> 
uchar bdata SR0_L; 
uchar bdata SR0_H; 
uchar bdata SR1; 
uchar ID,APCL=0,APCH=0;  /************************************************************************** 
*    函数原型: void ISD_Init(void); 
*    功    能: 初始化 
**************************************************************************/ 
void   ISD_Init(void){ 
ISD_Reset(); 
do{ 
ISD_PU(); 
RdStatus(); 
DogReset(); 
}while((SR0_L&0x01)||(!(SR1&0x01))); //if(SR0_L^0==1){system Err}<CMD_Err==1>  SBUF=RD_DevID();//读取芯片ID,----1760为0xa0 
ClrInt(); 
ISD_WR_APC2(0xaf); 
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); 
ISD_SendData(0x00); 
SS=1; 
    delay_ms(50); 
}  /************************************************************************** 
*    函数原型: void ISD_Stop(void); 
*    功    能: 停止 
**************************************************************************/ 
/* 
void ISD_Stop(void){ 
ISD_SendData(STOP); 
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_PD(void); 
*    功    能: 掉电 
**************************************************************************/ 
/* 
void ISD_PD(void){ 
ISD_SendData(PD); 
ISD_SendData(0x00); 
SS=1; 
}  /************************************************************************** 
*    函数原型: void ISD_SendData(uchar BUF_ISD); 
*    功    能: 发送数据 
**************************************************************************/ 
uchar ISD_SendData(uchar BUF_ISD){ 
uchar i,dat=BUF_ISD; 
SCLK=1; 
SS=0; 
for(i=0;i<8;i++){ 
SCLK=0; 
I_delay(); 
if(dat&0x01){ 
MOSI=1; 

else{ 
MOSI=0; 

dat>>=1; 
if(MISO){ 
dat|=0x80; 

SCLK=1; 
I_delay(); 

MOSI=0; 
// SS=1; 
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 
**************************************************************************/ 
uchar 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 
/* 
SBUF=SR0_L; 
delay_ms(1); 
SBUF=SR0_H; 
delay_ms(1); 
SBUF=APCL; 
delay_ms(1); 
SBUF=APCH; 
*/ 
}  /************************************************************************** 
*    函数原型: void ClrInt(void); 
*    功    能: 清除中断 
**************************************************************************/ 
void ClrInt(void){ 
ISD_SendData(CLI_INT); 
ISD_SendData(0x00); 
SS=1; 
delay_ms(10);               //延迟10ms 
}  /************************************************************************** 
*    函数原型: void ISD_WR_APC2(uchar voICeValue); 
*    功    能: 设置APC2 
**************************************************************************/ 
void ISD_WR_APC2(uchar voiceValue){ 
ISD_SendData(WR_APC2); 
ISD_SendData(0xa8|voiceValue); //0xa8声音最大,0xaf声音最小 
ISD_SendData(0x0c); //D11=1,在SETPLAY模式下,执行到EOM自动结束。或者在连续两个SET_PLAY命令后,执行到第一个EOM自动跳到第二段开始 
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 GetToneAdd(uchar cNum, Uint * ipStartAdd, Uint * ipEndAdd); 
*    功    能: 取出当前语音的首末地址 
**************************************************************************/ 
/* 
void GetToneAdd(uchar cNum, uint * ipStartAdd, uint * ipEndAdd){  *ipStartAdd=caToneAdd[cNum*2]; 
*ipEndAdd=caToneAdd[cNum*2+1]; 
}  /************************************************************************** 
*    函数原型: void SetPLAY(uchar cNum); 
*    功    能: 定点播放 
**************************************************************************/ 
void SetPLAY(uchar cNum){  uint Add_ST, Add_ED; 
uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L;  do{ 
RdStatus(); 
DogReset(); 
}while((SR0_L&0x01)||(!(SR1&0x01))); //if(SR0_L^0==1){system Err}<CMD_Err==1>  ClrInt();  GetToneAdd(cNum, &Add_ST, &Add_ED);  Add_ST_L=(uchar)(Add_ST&0x00ff); 
Add_ST_H=(uchar)((Add_ST>>8)&0x00ff); 
Add_ED_L=(uchar)(Add_ED&0x00ff); 
Add_ED_H=(uchar)((Add_ST>>8)&0x00ff); 
/* 
delay_ms(1); 
SBUF=Add_ST_L; 
delay_ms(1); 
SBUF=Add_ST_H; 
delay_ms(1); 
SBUF=Add_ED_L; 
delay_ms(1); 
SBUF=Add_ED_H; 
delay_ms(1); 
*/ 
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(); 
DogReset(); 
}while((SR0_L&0x01)||((SR1&0x04))); //if(SR0_L^0==1){system Err}<CMD_Err==1>  }  /************************************************************************** 
*    函数原型: void SetREC(uchar cNum); 
*    功    能: 定点录音 
**************************************************************************/ 
void SetREC(uchar cNum){  uint Add_ST, Add_ED; 
uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L;  do{ 
RdStatus(); 
DogReset(); 
}while((SR0_L&0x01)||(!(SR1&0x01))); //if(SR0_L^0==1){system Err}<CMD_Err==1>  ClrInt();  GetToneAdd(cNum, &Add_ST, &Add_ED);  Add_ST_L=(uchar)(Add_ST&0x00ff); 
Add_ST_H=(uchar)((Add_ST>>8)&0x00ff); 
Add_ED_L=(uchar)(Add_ED&0x00ff); 
Add_ED_H=(uchar)((Add_ST>>8)&0x00ff);  ISD_SendData(SET_REC); 
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(); 
DogReset(); 
// }while((SR0_L&0x01)||((SR1&0x08))); //if(SR0_L^0==1){system Err}<CMD_Err==1> 
}while((SR0_L&0x01)||(!(SR1&0x01))); //if(SR0_L^0==1){system Err}<CMD_Err==1> 
}  /************************************************************************** 
*    函数原型: void SetERASE(uchar cNum); 
*    功    能: 定点删除,容易破坏存储结构(CMA),所以不用 
**************************************************************************/ 
/* 
void SetERASE(uchar cNum){  uchar Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L;  Add_ST_L=(uchar)(Add_ST&0xff); 
Add_ST_H=(uchar)(Add_ST>>8); 
Add_ED_L=(uchar)(Add_ED&0xff); 
Add_ED_H=(uchar)(Add_ED>>8);  ISD_SendData(SET_ERASE); 
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(120); 
}  /************************************************************************** 
*    函数原型: void Erase_All(void); 
*    功    能: 全部删除 
**************************************************************************/ 
void Erase_All(void){ 
ISD_SendData(G_ERASE); 
ISD_SendData(0x00); 
SS=1; 
delay_ms(100);               //延迟10ms 
}  /************************************************************************** 
*    END 
*    END 
**************************************************************************/ 
以下是SPI.H 
#ifndef _SPIEX_ 
#define _SPIEX_  #include<STC89C58.h> 
#include "typedef.h"  #define  PU   0x01 
#define  STOP   0x02 
#define  RESET   0x03 
#define  CLI_INT  0x04 
#define  RD_STATUS 0x05 
#define  RD_PLAY_PTR   0x06 
#define  PD   0x07 
#define  RD_REC_PTR   0x08 
#define  RD_DEVID 0x09 
#define  G_ERASE 0x43 
#define  RD_APC   0x44 
#define  WR_APC1   0x45 
#define  WR_APC2   0x65 
#define  WR_NVCFG   0x46 
#define  CHK_MEM 0x49 
#define  SET_PLAY   0x80 
#define  SET_REC   0x81 
#define  SET_ERASE   0x82  #define  HIGH 1 
#define  LOW 0 
/* 
#define  RIGHT 1 
#define  ERROR 0  //#define SET_BIT(x,y)  (x|=(1<<y)) //x的y位置1 
//#define CLR_BIT(x,y)  (x&=~(1<<y)) //清x的y位 
//#define GET_BIT(x,y)  (x&(1<<y)) //读x的y位 
/*----------------------------------------------------------------------- 
//SR0_L 0 1 2 3 4 5 6 7 
//  CMD_Err   FULL     PU    EOM    INT     A0 A1 A2  //SR0_H 8  9 10 11 12 13 14 15 
// A3 A4 A5 A6 A7 A8 A9 A10  //SR1 0 1 2 3 4 5 6 7 
//    RDY    ERASE    PLAY    REC     SE1     SE2     SE3    SE4  //APC 0 1 2 3 4 5 6 7 
//   VOL0   VOL1    VOL2  MON_IN   MIX_IN  SE_EDIT  SPI_FT  AUD/AUX(AUD线路输出,AUX直接驱动喇叭)  //APC 8  9 10 11 
//   PWM_SPK  PU_AO  VALERT  EOM_EN(在SETPLAY模式下,置1遇到EOM则结束,否则继续播放) 
----------------------------------------------------------------------------*/ 
/* 
sbit INT_1700 = SR0_L^4; 
sbit EOM = SR0_L^3; 
sbit PU_1700 = SR0_L^2; 
sbit FULL = SR0_L^1; 
sbit CMD_ERR = SR0_L^0;  sbit REC_1700 = SR1^3; 
sbit PLAY_1700 = SR1^2; 
sbit ERASE_1700 = SR1^1; 
sbit RDY = SR1^0; 
*/ 
sbit SS = P4^3; 
sbit SCLK = P4^2; 
sbit MOSI = P4^1; 
sbit MISO = P4^0; 
extern void  I_delay(void); 
extern void delay_ms(register uint Count); 
extern void DogReset(void) reentrant;  /************************************************************************** 
*    函数原型: void GetToneAdd(uchar cNum, Uint * ipStartAdd, Uint * ipEndAdd); 
*    功    能: 取出当前语音的首末地址 
**************************************************************************/ 
void GetToneAdd(uchar cNum, uint * ipStartAdd, uint * ipEndAdd);  /************************************************************************** 
*    函数原型: void ISD_Init(void); 
*    功    能: 初始化 
**************************************************************************/ 
void  ISD_Init(void);  /************************************************************************** 
*    函数原型: void ISD_PU(void); 
*    功    能: 上电 
**************************************************************************/ 
void ISD_CHK_MEM(void);  /************************************************************************** 
*    函数原型: void ISD_Up(void); 
*    功    能: 上电 
**************************************************************************/ 
void  ISD_PU(void);  /************************************************************************** 
*    函数原型: void ISD_Stop(void); 
*    功    能: 停止 
**************************************************************************/ 
void ISD_Stop(void);  /************************************************************************** 
*    函数原型: void ISD_Reset(void); 
*    功    能: 复位 
**************************************************************************/ 
void ISD_Reset(void);  /************************************************************************** 
*    函数原型: void ISD_PD(void); 
*    功    能: 掉电 
**************************************************************************/ 
void ISD_PD(void);  /************************************************************************** 
*    函数原型: void ISD_SendData(uchar BUF_ISD); 
*    功    能: 发送数据 
**************************************************************************/ 
uchar ISD_SendData(uchar BUF_ISD);  /************************************************************************** 
*    函数原型: void RdStatus(void); 
*    功    能: 读取状态 
**************************************************************************/ 
void RdStatus(void);  /************************************************************************** 
*    函数原型: void RdStatus(void); 
*    功    能: 读取ID 
**************************************************************************/ 
uchar RD_DevID(void);  /************************************************************************** 
*    函数原型: void RD_APC(void); 
*    功    能: 读取APC 
**************************************************************************/ 
void RdAPC(void);  /************************************************************************** 
*    函数原型: void ClrInt(void); 
*    功    能: 清除中断 
**************************************************************************/ 
void ClrInt(void);  /************************************************************************** 
*    函数原型: void ISD_WR_APC2(uchar voiceValue); 
*    功    能: WR_APC2 
**************************************************************************/ 
void ISD_WR_APC2(uchar voiceValue);  /************************************************************************** 
*    函数原型: void ISD_WR_NVCFG(void); 
*    功    能: 永久写入寄存器 
**************************************************************************/ 
void ISD_WR_NVCFG(void);  /************************************************************************** 
*    函数原型: void SetPLAY(uchar cNum); 
*    功    能: 定点播放 
**************************************************************************/ 
void SetPLAY(uchar cNum);  /************************************************************************** 
*    函数原型: void SetREC(uchar cNum); 
*    功    能: 定点录音 
**************************************************************************/ 
void SetREC(uchar cNum);  /************************************************************************** 
*    函数原型: void SetERASE(uchar cNum); 
*    功    能: 定点删除  **************************************************************************/ 
/* 
void SetERASE(uchar cNum);  /************************************************************************** 
*    函数原型: void Erase_All(void); 
*    功    能: 全部删除 
**************************************************************************/ 
void Erase_All(void);  /************************************************************************** 
*    END 
*    END 
**************************************************************************/ 
#endif 

型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67