⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 isd1730.c

📁 内容摘要: LHD6000主板主芯片程序 ISD1730时序说明: 参考:void Send_1Byte(uchar ucData_s)和uchar Receive_1Byte(void)的说明.
💻 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 + -