📄 isd1700.c
字号:
#include <iom8.h>
#include "mydeclare.h"
#include "isd1700.h"
#define SpiSS PORTB_Bit2 //定义SS端口
//static struct ISD_STATTUS isd_status; //ISD 状诚返回结果
//==============================================================================
//语音片断地址表
__flash static unsigned char isd_seg_addr[12]=
{
//存放播放地址起始位置,结束位置定为上一位置结束位置
0x10, 0x1E, 0x26, 0x2F,
0x38, 0x49, 0x51, 0x58,
0x61, 0x72, 0x7B, 0xFF
};
//==============================================================================
void isd_init(void) //初始化ISD1700
{
isd_reset();
while(!isd_is_free());
isd_pu();
while(!isd_is_free());
isd_setapc2();
while(!isd_is_free());
isd_clearint();
}
//==============================================================================
//ISD1700发送一字节的数据
UCHAR isd_senddata(UCHAR data) //要在外部保证SS = 0
{
SPDR = data;
while((SPSR & 0x80) == 0);
data = SPDR;
return data;
}
//==============================================================================
//检测ISD1700当前是否为空闲状态
bool isd_is_free() //
{
UCHAR status;
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_RDSTATUS);
isd_senddata(0x00);
status = isd_senddata(0x00);
SpiSS = 1;
if((status & 0x01) == 0x01)
return true;
else
return false;
}
//==============================================================================
void isd_setapc2(void)
{
//初始化APC寄存器,音量最大,关模拟输出,遇到EOM标志自动结束
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_WRAPCVOL);
isd_senddata(0xA0); //音量最大
isd_senddata(0x00);
SpiSS = 1;
}
//==============================================================================
void isd_reset(void) //复位MCU
{
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_RESET);
isd_senddata(0x00);
SpiSS = 1;
}
//==============================================================================
void isd_pu(void) //芯片上电
{
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_PU);
isd_senddata(0x00);
SpiSS = 1;
}
//==============================================================================
void isd_wrnvcfg(void) //写APC寄存器到非易失存储器
{
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_WRNVCFG);
isd_senddata(0x00);
SpiSS = 1;
}
//==============================================================================
void isd_play() //播放当前段
{
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_PLAY);
isd_senddata(0x00);
SpiSS = 1;
}
//==============================================================================
void isd_clearint(void)
{
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_CLRINT);
isd_senddata(0x00);
SpiSS = 1;
}
//==============================================================================
UCHAR isd_readid(void)
{
unsigned char isd_id;
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_RDDEVID);
isd_senddata(0x00);
isd_id = isd_senddata(0x00);
SpiSS = 1;
return isd_id;
}
//==============================================================================
void isd_stop(void) //停止当前操作
{
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_STOP);
isd_senddata(0x00);
SpiSS = 1;
}
//==============================================================================
void isd_pd(void) //芯片下电
{
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_PD);
isd_senddata(0x00);
SpiSS = 1;
}
//==============================================================================
bool isd_is_done(void)
{
unsigned char SR0_L;
SpiSS = 0;
DELAY_US(5);
SR0_L = isd_senddata(ISD_RDSTATUS);
isd_senddata(0x00);
isd_senddata(0x00);
SpiSS = 1;
if((SR0_L & 0x10) != 0) //SR0_L_bit4 为INT位表示操作是否完成
return true;
else
return false;
}
//==============================================================================
struct ISD_STATUS isd_rdstatus(void)
{
struct ISD_STATUS status;
SpiSS = 0;
DELAY_US(5);
status.SR0_L = isd_senddata(ISD_RDSTATUS);
status.SR0_H = isd_senddata(0x00);
status.SR1 = isd_senddata(0x00);
SpiSS = 1;
return status;
}
//==============================================================================
void isd_forward(void)
{
SpiSS = 0;
DELAY_US(5);
isd_senddata(ISD_FWD);
isd_senddata(0x00);
SpiSS = 1;
}
//==============================================================================
void isd_setplay(UINT st_addr, UINT end_addr) //播放指定地址
{
SpiSS = 0;
DELAY_US(5);
//isd_clearint();
//while(!isd_is_free()); //等待空闲
isd_senddata(ISD_SETPLAY);
isd_senddata(0x00);
isd_senddata(st_addr & 0xFF);
isd_senddata(st_addr >> 8);
isd_senddata(end_addr & 0xFF);
isd_senddata(end_addr >> 8);
SpiSS = 1;
}
//==============================================================================
void isd_playid(UCHAR SoundID)
{
unsigned int start_addr, end_addr;
if(SoundID > MAX_SOUND_ID)
{
SoundID = MAX_SOUND_ID;
}
start_addr = isd_seg_addr[SoundID];
end_addr = isd_seg_addr[SoundID + 1] -1;
SpiSS = 0;
DELAY_US(5);
//isd_clearint();
//while(!isd_is_free()); //等待空闲
isd_senddata(ISD_SETPLAY);
isd_senddata(0x00);
isd_senddata(start_addr & 0xFF);
isd_senddata(start_addr >> 8);
isd_senddata(end_addr & 0xFF);
isd_senddata(end_addr >> 8);
SpiSS = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -