/************************************************************************
* ISD1700 89C51 单片机C语言示例程序 *
* 晶振:22.1184MHz 机器周期:12T
* 功能: 1700 芯片 SPI工作模式下放音、录音、擦除等功能的编程示例 *
* 说明: 本程序采用I/O口模拟SPI接口方案
*************************************************************************/
#include "ISD1700.H"
//**************ISD1700 状态寄存器及各个标志位定义*****************//
unsigned char bdata SR0_L; // SR0 寄存器
unsigned char bdata SR0_H;
unsigned char bdata SR1; // SR1 寄存器
unsigned char APCL=0,APCH=0; // APC 寄存器
unsigned char PlayAddL=0,PlayAddH=0; // 放音指针低位,高位
unsigned char RecAddL=0,RecAddH=0; // 录音指针低位,高位
unsigned char x; //x为读取的第几段
sbit CMD=SR0_L^0; // SPI 指令错误标志位
sbit FULL=SR0_L^1; // 芯片存储空间满标志
sbit PU=SR0_L^2; // 上电标志位
sbit EOM=SR0_L^3; // EOM 标志位
sbit INTT=SR0_L^4; // 操作完成标志位
sbit RDY=SR1^0; // 准备接收指令标志位
sbit ERASE=SR1^1; // 擦除标志位
sbit PLAY=SR1^2; // 播放标志位
sbit REC=SR1^1; // 录音标志位
/****************************************************
* 函数原型: void delay(unsigned int t)
* 功 能: ms 级延迟
****************************************************/
void delay(unsigned int t) //ms 级延迟,12M 晶振
{
unsigned char j;
while(t--)
for(j=0;j<230;j++);//230是实验测试所得!
}
/**************************************************************************
函数原型: void ISD_Init(void);
功能: 系统初始化。
**************************************************************************/
void ISD_Init(void)
{
unsigned char i=2;
SS=1;
SCK=1;
MOSI=0;
do
{
ISD_PU(); // 上电
delay(50);
ISD_Rd_Status(); // 读取状态
}while(CMD||(!PU)); // if(CMD_Err==1)||(PU!=1))则再次发送上电指令
ISD_WR_APC2(0x40,0x04); // 将 0x0440(芯片出厂默认值,可根据需要更改数值)
//写入 APC 寄存器
do
{ISD_Rd_Status(); // 等待 RDY位置 1
}while(RDY==0);
do{
delay(300);
i--;}while(i>0);
}
/**************************************************************************
* 函数原型: unsigned char ISD_SendData(unsigned char dat);
* 功 能: 向 CPU发送&读回数据
**************************************************************************/
unsigned char ISD_SendData(unsigned char dat) // 保证外部SS=1
{
unsigned char i,j,BUF_ISD=dat;
SCK=1; // 初始条件
SS=0; // 使能 ISD1700的 SPI
for(j=4;j>0;j--) // 延迟
{;}
for(i=0;i<8;i++) // 发送&接收 8 位数据
{
SCK=0;
for(j=2;j>0;j--) // 延迟
{;}
if(BUF_ISD&0x01) // 将 BUF_ISD 中的最低位数据发送到 MOSI 端口
MOSI=1;
else
MOSI=0;
BUF_ISD>>=1; // BUF_ISD 右移一位
if(MISO) // 逐个接收 MISO端口的数据。将数据存在 BUF_ISD的最高位
BUF_ISD|=0x80;
SCK=1;
for(j=6;j>0;j--) // 延迟
{;}
}
MOSI=0;
return(BUF_ISD); //返回接收到的数据
}
/**************************************************************************
* 函数原型: unsigned char ISD_Devid (void);
* 功 能: 读取 APC 寄存器内容
**************************************************************************/
unsigned char ISD_Devid (void)
{ unsigned char DeviceNO,i;
ISD_SendData(0x09);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS=1;
for(i=2;i>0;i--) //延迟
{;}
ISD_SendData(0x09);
ISD_SendData(0x00);
DeviceNO=ISD_SendData(0x00);
SS=1;
return DeviceNO;
}
/**************************************************************************
* 函数原型: void ISD_PU(void); 发送指令后需要延迟 50ms
* 功 能: 上电
**************************************************************************/
void ISD_PU(void)
{
ISD_SendData(0x01); // 发送 PU命令
ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
* 函数原型: void ISD_STOP(void);
* 功 能: 停止当前操作
**************************************************************************/
void ISD_STOP(void)
{
ISD_SendData(0x02); // 发送 STOP 命令
ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
* 函数原型: void ISD_Reset(void); 发送指令后需要延迟 50ms
* 功 能: ISD1700复位
**************************************************************************/
void ISD_Reset(void)
{
ISD_SendData(0x03); // 发送 RESET 命令
ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
* 函数原型: void ISD_Clr_Int()(void);
* 功 能: 清除中断标志
**************************************************************************/
void ISD_Clr_Int(void)
{
ISD_SendData(0x04);
ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
* 函数原型: void ISD_Rd_Status(void);
* 功 能: 读取状态寄存器内容
**************************************************************************/
void ISD_Rd_Status(void)
{ unsigned char i ;
ISD_SendData(0x05); // 发送
ISD_SendData(0x00);
ISD_SendData(0x00);
SS=1;
for(i=2;i>0;i--) //延迟
{;}
SR0_L=ISD_SendData(0x05); // 从 MISO 读出状态
SR0_H=ISD_SendData(0x00);
SR1=ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
* 函数原型: void ISD_Rd_PlayPtr(void);
* 功 能: 读取放音指针
**************************************************************************/
void ISD_Rd_Playptr(void)
{ unsigned char i;
ISD_SendData(0x06); // 发送
ISD_SendData(0x00);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS=1;
for(i=2;i>0;i--) //延迟
{;}
SR0_L=ISD_SendData(0x06); // 从 MISO 读出状态
SR0_H=ISD_SendData(0x00);
PlayAddL=ISD_SendData(0x00); // 读取放音指针低 8位
PlayAddH=ISD_SendData(0x00); // 读取放音指针高 8位
SS=1;
}
/**************************************************************************
* 函数原型: void ISD_PD(void); 发送指令后需要延迟 50ms
* 功 能: 下电
**************************************************************************/
void ISD_PD(void)
{
ISD_SendData(0x07); // 发送 PD命令
ISD_SendData(0x00);
SS=1;
}
/**************************************************************************
* 函数原型: void ISD_Rd_RecPtr(void);
* 功 能: 读取录音指针
**************************************************************************/
void ISD_Rd_Recptr(void)
{ unsigned char i;
ISD_SendData(0x08); // 发送
ISD_SendData(0x00);
ISD_SendData(0x00);
ISD_SendData(0x00);
SS=1;
for(i=2;i>0;i--)