📄 isd1730.c
字号:
/*******************************************************************************
* 版权所有 (C)2007,深圳豪恩科技有限公司
*
* 文件名称: ISD1730.C
* 文件标识:
* 内容摘要: ISD1730 程序
* 其它说明: IC:AT89S52,12MHz,ISD1730典型电路
* 当前版本: 0.000
* 作 者: 涂常亮(豪恩科技研发中心安全主机组)
* 完成日期:
*
* 修改纪录1:
* 修改日期:
* 版 本 号:
* 修 改 人:
* 修改内容:
* 修改纪录2:
*******************************************************************************/
/*******************************************************************************
!! .
ISD1730时序说明:
参考:void Send_1Byte(uchar ucData_s)和uchar Receive_1Byte(void)的说明.
应先发"RESET"命令再发"PWR_UP"命令,后发"RESET"命令可能不正常工作.
1730最高地址只有0xFF,所以对指定地址的操作函数的参数使用了"unsigned char"类型,
17系列的其它型号可能才用得到"unsigned int",借用时注意,将对应注释掉的部分还原.!!!
*******************************************************************************/
#include <reg52.h>
#include <intrins.h>
#include "head.h"
//ISD1730 命令定义
#define PWR_UP 0x01
#define STOP 0x02 //停止当前操作
#define RESET 0x03 //复位,发送后需再发"PWR_UP",连发出错
#define CLR_INT 0x04 //清除中断和EOM位
#define RD_STATUS 0x05 //后跟2字节,读取状态寄存器和当前地址
#define RD_PLAY_PTR 0x06 //后跟3字节,读取状态寄存器、当前地址和播放指针
#define PWR_DOWN 0x07
#define RD_REC_PTR 0x08 //后跟3字节,读取状态寄存器、当前地址和录音指针
#define RD_DEV_ID 0x09 //后跟2字节,读取器件ID
#define PLAY_CUR 0x40 //播放当前曲目
#define REC 0x41 //从当前地址开始录音
#define ERASE_CUR 0x42 //擦除当前曲目
#define G_ERASE 0x43 //擦除提示音外所有曲目
#define RD_APC 0x44 //后跟3字节,读取状态寄存器、当前地址和APC寄存器
#define WR_APC1 0x45 //后跟2字节,将D11:D0写入APC寄存器,由VOC脚调节音量.
#define WR_APC2 0x65 //后跟2字节,将D11:D0写入APC寄存器,并由D2:D0调节音量.
#define WR_NVCFG 0x46 //将APC的内容写到NVCFG
#define LD_NVCFG 0x47 //将NVCFG的内容加载到APC
#define PLAY_FWD 0x48 //下一曲
#define CHK_MEM 0x49 //检查环形存储结构
#define EN_EXTCLK 0x4A //是否使能外部时钟
#define SET_PLAY 0x80 //后跟5个字节,从<S10:S0>开始播放,直到<E10:E0>或EOM
#define SET_REC 0x81 //后跟5个字节,从<S10:S0>开始录音,直到<E10:E0>
#define SET_ERASE 0x82 //后跟5个字节,擦除<S10:S0>到<E10:E0>的内容
typedef unsigned char uchar;
typedef unsigned int uint;
extern bit g_FlagVoiceOn;
extern uint idata g_uiVoiceTimer;
extern uchar const idata g_ucAlarmTypes;
sfr AUXR = 0x8E;
sbit pin_MISO = P0^4;
sbit pin_MOSI = P0^2;
sbit pin_ISD_SCLK = P0^1;
sbit pin_SS = P0^0;
sbit pin_Spk = P0^6;
void Send_1Byte(uchar ucData_s);
uchar Receive_1Byte(void);
void SendISD1730CmnCmd(uchar ucCmd);
uchar ReadStatus(void); //uchar ReadStatus(uchar idata * data p_Status);
void WrApcReg(uchar idata ucAPCL,uchar idata ucAPCH);
void PlayISD(uchar ucSect, bit FlagSpk); //void PlayISD(uchar ucAddStart, uchar ucAddEnd);
void EraseAdd(void);
void RecAdd(void);
/*******************************************************************************
* 函数名称:void Send_1Byte(uchar ucData_s)
* 功能介绍:发送一个字节到ISD1730
* 输入参数:要发送的数据
* 输出参数:无
* 返 回 值:无
* 其它说明:需在调用该函数前后设置好 pin_SS,pin_ISD_SCLK.
* SCLK上升沿1730接收数据.
* 数据稳定200ns以上再发上升沿,上升沿数据再保持至少200ns.
* SCLK上升沿500ns之后,SS才能为高
* SCLK的高电平至少保持400ns,低电平至少保持400ns.
* SS有效500ns之后再进行操作,SS必须保持为高1us后才能再次为低.
* 修改日期 版本号 修改人 修改内容
*-------------------------------------------------------------------------------
*2007-5-25 V0.0 涂常亮 初次编写
*******************************************************************************/
void Send_1Byte(uchar ucData_s)
{
uchar i;
for (i=0; i<8; i++)
{
pin_ISD_SCLK = 0;
pin_MOSI = (ucData_s%2);
ucData_s >>= 1;
pin_ISD_SCLK = 1;
}
}
/*******************************************************************************
* 函数名称:uchar Receive_1Byte(void)
* 功能介绍:接收ISD1730的一个字节数据
* 输入参数:无
* 输出参数:无
* 返 回 值:接收到的数据
* 其它说明:需在调用该函数前后设置好 pin_SS,pin_ISD_SCLK.下降沿1730发送数据.
* 输出延时500ns,即SCLK下降沿500ns之后ISD1730输出数据才是有效的.
* 修改日期 版本号 修改人 修改内容
*-------------------------------------------------------------------------------
*2007-5-25 V0.0 涂常亮 初次编写
*******************************************************************************/
uchar Receive_1Byte(void)
{
uchar i;
uchar ucData_r = 0;
pin_MOSI = 0;
for (i=0; i<8; i++)
{
pin_ISD_SCLK = 0;
ucData_r >>= 1;
ucData_r |= ((uchar)pin_MISO << 7);
pin_ISD_SCLK = 1;
}
return ucData_r;
}
/*******************************************************************************
* 函数名称:void SendISD1730CmnCmd(uchar ucCmd)
* 功能介绍:发送一个格式为XX00的命令到ISD1730
* 输入参数:要发送的命令
* 输出参数:无
* 返 回 值:无
* 其它说明:
* 修改日期 版本号 修改人 修改内容
*-------------------------------------------------------------------------------
*2007-5-25 V0.0 涂常亮 初次编写
*******************************************************************************/
void SendISD1730CmnCmd(uchar ucCmd)
{
pin_MISO = 1;
pin_MOSI = 0;
pin_ISD_SCLK = 1;
pin_SS = 0;
Send_1Byte(ucCmd);
Send_1Byte(0x00);
pin_ISD_SCLK = 1;
pin_SS = 1;
pin_MOSI = 0;
pin_MISO = 1;
}
/*******************************************************************************
* 函数名称:uchar ReadStatus(uchar idata * data p_Status)
* 功能介绍:读取ISD1730的状态寄存器
* 输入参数:无
* 输出参数:状态寄存器的值
* 返 回 值:下一次可用指针地址
* 其它说明:
* 修改日期 版本号 修改人 修改内容
*-------------------------------------------------------------------------------
*2007-5-26 V0.0 涂常亮 初次编写
*******************************************************************************/
uchar ReadStatus(void)
{
uchar ucStatu;
pin_MISO = 1;
pin_MOSI = 0;
pin_ISD_SCLK = 1;
pin_SS = 0;
Send_1Byte(RD_STATUS);
Send_1Byte(0x00); //可以直接从这里开始接收,只是先接收到的是byte2.
Send_1Byte(0x00);
ucStatu = Receive_1Byte();
ucStatu &= 0xF0;
Receive_1Byte();
//ucStatu = Receive_1Byte(); //只要录放等状态.
ucStatu |= (Receive_1Byte() & 0x0F);
pin_ISD_SCLK = 1;
pin_SS = 1;
pin_MOSI = 0;
pin_MISO = 1;
return ucStatu; //return (ucStatu&0x0F);
}
/*******************************************************************************
* 函数名称:void WrApcReg(uchar idata ucAPCL,uchar idata ucAPCH)
* 功能介绍:将 ucAPCL,ucAPCH 写入APC.
* 输入参数:需写入 APC 的数据
* 输出参数:无
* 返 回 值:无
* 其它说明:无
* 修改日期 版本号 修改人 修改内容
*-------------------------------------------------------------------------------
*2007-5-29 V0.0 涂常亮 初次编写
*******************************************************************************/
void WrApcReg(uchar idata ucAPCL,uchar idata ucAPCH)
{
pin_MISO = 1;
pin_MOSI = 0;
pin_ISD_SCLK = 1;
pin_SS = 0;
Send_1Byte(WR_APC1);
Send_1Byte(ucAPCL);
Send_1Byte(ucAPCH);
pin_ISD_SCLK = 1;
pin_SS = 1;
pin_MOSI = 0;
pin_MISO = 1;
}
/*******************************************************************************
* 函数名称:void PlayAdd(uint uiAddStart, uint uiAddEnd)
* 功能介绍:播放地址为 uiAddStart~uiAddEnd之间的语音.
* 输入参数:起始地址和结束地址
* 输出参数:无
* 返 回 值:无
* 其它说明:1730地址只有 0x00~0xFF,高字节被忽略,如地址0x19F会被当作0x9F.
* 修改日期 版本号 修改人 修改内容
*-------------------------------------------------------------------------------
*2007-5-29 V0.0 涂常亮 初次编写
*******************************************************************************/
// !! 1730最高地址只有0xFF,17系列的其它型号可能才用得到 !! .
//void PlayAdd(uint uiAddStart, uint uiAddEnd)
void PlayISD(uchar ucSect, bit FlagSpk)
{
uchar ucAddStart;
uchar ucAddEnd;
if (g_FlagVoiceOn)
{
return;
}
ET0 = 0;
g_uiVoiceTimer = 242;
if ((0 == ucSect) || (9 < ucSect))
{
return;
}
ucAddStart = ucSect<<4;
ucAddEnd = ucAddStart + 0x0E;
if (9 == ucSect)
{
ucAddEnd += 0x10;
g_uiVoiceTimer = 482;
}
ET0 = 1;
pin_MISO = 1;
pin_MOSI = 0;
pin_ISD_SCLK = 1;
pin_SS = 0;
Send_1Byte(SET_PLAY);
Send_1Byte(0x00);
Send_1Byte(ucAddStart);
//1730最高地址只有0xFF,17的其它系列可能才用得到
Send_1Byte(0x00);
Send_1Byte(ucAddEnd);
Send_1Byte(0x00);
pin_ISD_SCLK = 1;
pin_SS = 1;
pin_MOSI = 0;
pin_MISO = 1;
g_FlagVoiceOn = 1;
if (FlagSpk)
{
pin_Spk = 0;
}
else
{
//P0 = 0x78; //LHD8000拨号时要喇叭响
if ((0 == (g_ucAlarmTypes & (0x01 << (ALARM_TYPE_NUM_FORC - 1)))) && (ucSect < 8))
{
P0 = 0x3B;
}
else
{
P0 = 0x7B;
}
}
}
/*******************************************************************************
* 函数名称:void EraseAdd(uint uiAddStart, uint uiAddEnd)
* 功能介绍:擦除地址为 uiAddStart~uiAddEnd之间的语音.
* 输入参数:起始地址和结束地址
* 输出参数:无
* 返 回 值:无
* 其它说明:不能擦除最后的地址,留一个地址在首地址和末地址之间,否则只能使用函数
"PlayAdd()"播放声音.其它操作无用.
1730地址只有 0x00~0xFF,高字节被忽略,如地址0x19F会被当作0x9F.
* 修改日期 版本号 修改人 修改内容
*-------------------------------------------------------------------------------
*2007-5-29 V0.0 涂常亮 初次编写
*******************************************************************************/
// !! 1730最高地址只有0xFF,17系列的其它型号可能才用得到 !! .
void EraseAdd(void) //只允许用户录最后一段
{
pin_MISO = 1;
pin_MOSI = 0;
pin_ISD_SCLK = 1;
pin_SS = 0;
Send_1Byte(SET_ERASE);
Send_1Byte(0x00);
Send_1Byte(0x90);
//1730最高地址只有0xFF,17的其它系列可能才用得到
Send_1Byte(0x00);
Send_1Byte(0xAF);
Send_1Byte(0x00);
pin_ISD_SCLK = 1;
pin_SS = 1;
pin_MOSI = 0;
pin_MISO = 1;
ET0 = 0;
g_uiVoiceTimer = 2;
ET0 = 1;
g_FlagVoiceOn = 1;
}
/*******************************************************************************
* 函数名称:void RecAdd(uint uiAddStart, uint uiAddEnd)
* 功能介绍:在地址为 uiAddStart~uiAddEnd之间录音.
* 输入参数:起始地址和结束地址
* 输出参数:无
* 返 回 值:无
* 其它说明:1730地址只有 0x00~0xFF,高字节被忽略,如地址0x19F会被当作0x9F.
* 修改日期 版本号 修改人 修改内容
*-------------------------------------------------------------------------------
*2007-5-29 V0.0 涂常亮 初次编写
*******************************************************************************/
// !! 1730最高地址只有0xFF,17系列的其它型号可能才用得到 !! .
void RecAdd(void)
{
pin_MISO = 1;
pin_MOSI = 0;
pin_ISD_SCLK = 1;
pin_SS = 0;
Send_1Byte(SET_REC);
Send_1Byte(0x00);
Send_1Byte(0x90);
//1730最高地址只有0xFF,17的其它系列可能才用得到
Send_1Byte(0x00);
Send_1Byte(0xAF);
Send_1Byte(0x00);
pin_ISD_SCLK = 1;
pin_SS = 1;
pin_MOSI = 0;
pin_MISO = 1;
ET0 = 0;
g_uiVoiceTimer = 402;
ET0 = 1;
g_FlagVoiceOn = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -