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

📄 isd1700.c

📁 AVR使用硬件SPI控制ISD1760源代码
💻 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 + -