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

📄 main.c.bak

📁 ISD1700语音芯片驱动程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
/************************************************************************** 
*    函数原型: void ISD_Play(); 
*    功    能: 播放  前:idle  后:idle
**************************************************************************/ 
void ISD_Play()
{ 
   do{ 
	    ISD_SendData(0x50); 
        ISD_SendData(0x00);          
        SS=1; 
        delay_ms(10);            //延迟10ms 
		//SendChar(0xdd);
        RdStatus(); 
      }while(SR0_L&0x01);        //if(SR0_L^0==1){system Err}<CMD_Err==1>
        //SendChar(0xee);	
      do
      {
         RdStatus();
      }while(SR1&0x04);   //FWD之前一定要是idle 空闲状态
  // while(!(SR1&0x01));      //当RDY=0等待,变为1后执行STOP,停止当前操作
   //SendChar(0xEF);
 	 delay_ms(1000);               //延迟10ms
 //  ISD_Stop();   //撤到下面快进里面
 //  ClrInt();
} 

/************************************************************************** 
*    函数原型: void ISD_FWD(void); 
*    功    能: 掉电  前:idle  后:idle
**************************************************************************/ 
void ISD_FWD(void)
{ 
   ISD_Stop();
   ClrInt();
 // do
 //  {  SendChar(0xff);
 //     RdStatus();
 //  }while(SR1&0x01);   //FWD之前一定要是idle 空闲状态  
 //  do
//   {
 //     SendChar(0xff);
      ISD_SendData(FWD); 
      ISD_SendData(0x00); 
      SS=1; 
//	  RdStatus();
 //  }while(SR0_L&0x01);
    //SendChar(0xf1); 
} 

//-----------------------------------------------------------------------------
// 系统时钟初始化 SYSCLK_Init() 
//-----------------------------------------------------------------------------

void SYSCLK_Init (void)
{
   int i;                                          /*延时计数器*/
   OSCXCN = 0x67;                      /*打开外部晶体振荡器形式,并设为与24M匹配的模式*/
   for (i=0; i < 256; i++) ;             /*延时等待时钟稳定*/
   while (!(OSCXCN & 0x80)) ;       /*查询外部晶体是否稳定起振*/
   OSCICN = 0x88;                       /*正式使用外部晶体作为系统时钟,并使能时钟丢失检测*/
}
//-----------------------------------------------------------------------------
// 端口初始化  PORT_Init() CLK/MOSI/MISO/SS P3.6担当片选功能,SS无用
//-----------------------------------------------------------------------------
void PORT_Init(void)
{
   PRT3CF |= 0xC0;    //P3.6推挽输出 控制片选,因为SPI一直在主方式,SS没有用
//不要下面的三行是因为模拟SPI
//  PRT2MX |= 0X01;    //SPI0OEN使能位,即SCK、MISO、MOSI、NSS分别连接到P2.0、P2.1、P2.2和P2.3 
// PRT2CF |= 0X0F;    //P2.0-P2.3推挽输出
//  P2MODE |= 0X0F;    //P2.0-P2.3数字输入 
//下面为串口配置
   //PRT0MX |= 0x41;    //UARTEN=1,T2E=1,即P0.0-TX ,P0.1-RX ,T2-P0.6相连
   PRT0MX   |= 0x3D;
   //P0MODE |= 0x03;    // 配置P0.0和P0.1为数字输入
   //PRT0CF |= 0x03;    // 使能 RX, TX 为推挽输出
   PRT0CF  |= 0x01;
   PRT1CF  |= 0x80;
   PRT3CF &= 0xf0;
   P3MODE |= 0x0f;
}
//-----------------------------------------------------------------------------
// 串口初始化    UART_Init()    T2初始化16位自动重装波特率可调
//-----------------------------------------------------------------------------
void UART_Init(void)
{
   unsigned int temp;//计算得到的捕捉寄存器RCAP2H,RCAP2L定时初值  
   SCON  = 0x50;//方式1:8位UART,波特率可调,无停止位,“0X50则是接收使能”
   T2CON = 0x30;               //TX和RX接受时钟都为T2
   temp =(unsigned int)(65536 - SYSCLK/BAUDRATE/32);
   RCAP2L =(unsigned char)(temp&0x00FF);
   RCAP2H =(unsigned char)((temp>>8)&0x00FF);               
   TR2 = 1;                                                   
}

void Timer0_Init(void)
{
	TMOD |=0x05;
	TCON |=0x11;
	TH0=0;
	TL0=0;
}

void Timer1_Init(void)
{
	TMOD |=0x50;
	TCON |=0x44;
	TH1=0;
	TL1=0;
}

void Interupt_Init(void)
{
	 EX0 = 1;
   //EX1 = 1;
   ES = 1;         //开串口中断允许
   EA = 1;         //中断总允许/禁止位
}
/*
void SendChar(unsigned char temp)
{
   SBUF = temp;
   while(!TI);
   TI=0;
}
*/
void SendString (unsigned char *str, unsigned char strlen)
{
  unsigned char m = 0;
	do
	{
	   SBUF = *(str + m); 
	   while(!TI);
	   TI = 0; 	   
	   m ++;
	}
	while (m < strlen);
}
//-----------------------------------------------------------------------------
//   串口中断服务        UATR_ISR()     interrupt 4  串口中断
//-----------------------------------------------------------------------------
void UATR0_ISR(void)  interrupt 4
{
	if(RI)
  	{					    
		RI = 0;
		Uart_Temp =SBUF;
		if (Uart_Coun<8)
		{
		   serial_rx_buff[Uart_Coun]=Uart_Temp;
		   Uart_Coun++;
		}
		if (Uart_Coun >=8)
		{
		   Uart_Flag=1;
		   Uart_Coun=0;
		}		
	}
}

void INIT0_ISR(void) interrupt 0
{
	KEY_Value=P3&0x0f;
	IE0=0;
}

//void INIT1_ISR(void) interrupt 2
//{
//;
//}

/************************************************************************** 
*    函数原型: void ISD_Stop(void); 
*    功    能: 停止 
**************************************************************************/ 

void ISD_Stop(void)
{       
    ISD_SendData(STOP); 
    ISD_SendData(0x00); 
    SS=1; 
    delay_ms(100); 
} 

/************************************************************************** 
*    函数原型: void ISD_Reset(void); 
*    功    能: 复位    前:any 后:PD状态
**************************************************************************/ 
void ISD_Reset(void)
{ 
    ISD_SendData(RESET); 
    ISD_SendData(0x00); 
    SS=1; 
    delay_ms(50); 
} 

/************************************************************************** 
*    函数原型: void ISD_PD(void); 
*    功    能: 掉电    前:any,但是如果是REC,PLAY,ERASE指令则执行后才下电 后:PD状态
**************************************************************************/ 

void ISD_PD(void)
{ 
     ISD_SendData(PD); 
     ISD_SendData(0x00); 
     SS=1; 
} 

/************************************************************************** 
*    函数原型: void ISD_SendData(uchar BUF_ISD); 
      MOSI的数据在SCLK上升沿进入录音芯片,MISO的数据在SCLK的下降沿进入主控芯片。8位一字节,先发低位 
*    功    能: 发送数据           注意:平时SS=1,SCLK=1,MOSI=0 
**************************************************************************/ 
unsigned char ISD_SendData(unsigned char BUF_ISD)
{ 
      unsigned char i,dat=BUF_ISD; 
      SCLK=1; 
      SS=0; 
      for(i=0;i<8;i++)
     { 
        SCLK=0; 
        delay_ms(1); 
        if(dat&0x01)
         {     MOSI=1;   }                                        
        else
         {     MOSI=0;   }                                       
        dat>>=1; 
        if(MISO)
          {  dat|=0x80;  }                                          
        SCLK=1; 
        delay_ms(1); 
      } 
      MOSI=0;        //平时应保持MOSI为低
//     SS=1; //不放在这里是因为一条指令是由发送指令码加发送数据地址等组成
      return(dat);    //在MOSI的同时,dat已一位一位的右移,变成了MISO的值了
} 

/************************************************************************** 
*    函数原型: void ClrInt(void); 
*    功    能: 清除中断 任何情况都可以进行 且执行后不影响状态  
**************************************************************************/ 
void ClrInt(void)
{ 
        ISD_SendData(CLR_INT); 
        ISD_SendData(0x00); 
        SS=1; 
        delay_ms(10);               //延迟10ms 
} 

/************************************************************************** 
*    函数原型: void ISD_WR_APC2(uchar voiceValue); 
*    功    能: 设置APC2  前:idle  后:idle
**************************************************************************/ 
void ISD_WR_APC2(unsigned char voiceValue)  
{ //初始化之前的指令都不影响状态,且上电后为RDY=1,所以不用检查RDY
    ISD_SendData(WR_APC2); 
    ISD_SendData(0xa8|voiceValue);//0xa8声音最大,0xaf声音最小 
    ISD_SendData(0x0c);           //D11=1,在SETPLAY模式下,执行到EOM自动结束。或者在连续两个SET_PLAY命令后,执行到第一个EOM自动跳到第二段开始 
    SS=1; 
    delay_ms(10);                 //延迟10ms 
}     


/************************************************************************** 
*    函数原型: delay_ms(unsigned int t) 
*    功    能: 延时    约1ms   具体 j可改变,参数也可变 参考
**************************************************************************/ 
void delay_ms(unsigned int t)    
{   unsigned int j;
    for(;t>0;t--)
    for(j=400;j>0;j--);
}

/************************************************************************** 
*   END 
**************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -