/***************************乐声电子科技有限公司****************************
** 文件名称:语音模块底层驱动
** CPU: STM32f103RCT6
** 晶振:8MHZ
** 波特率:9600 bit/S
** 配套产品信息:YS-V0.4语音识别开发板
** http://yuesheng001.taobao.com
** 作者:zdings
** 联系:751956552@qq.com
** 修改日期:2012.4.11
** 说明:本程序 具备语音识别、串口通信、开发板基本功能演示。
***************************乐声电子科技有限公司******************************/
#include "ldchip.h"
#include "sdcard.h"
#include "ff.h"
#include "file.h"
/** @defgroup SD source
* @{
*/
FATFS FsFat; //文件系统句柄
FILETYP ConfigFile;//SD卡存储的配置文件句柄
BYTE file_stat;
static unsigned char stringBuf[10]; //for MFID from SD,仅限本文件使用
//u8*const KAIDENG="/开灯.mp3"; //GBK24的存放位置
//u8*const GUANDENG="/关灯.mp3"; //GBK24的存放位置
//u8*const DANWEI="/单位.mp3"; //GBK24的存放位置
//u8*const XINGMING="/姓名.mp3"; //GBK24的存放位置
u8*const TEST_PAT="/erge.bin"; //GBK24的存放位置
//u8*const GUANDENG="/断桥残雪.mp3";
UINT stringSize;
/**
* @}
*/
extern uint8 nAsrStatus;
uint32 nMp3StartPos=0;
uint32 nMp3Size=0;
uint32 nMp3Pos=0;
uint32 nCurMp3Pos=0;
uint8 nLD_Mode = LD_MODE_IDLE; // 用来记录当前是在进行ASR识别还是在播放MP3
uint8 bMp3Play=0; // 用来记录播放MP3的状态
uint8 ucRegVal;
uint8 ucHighInt;
uint8 ucLowInt;
uint8 ucStatus;
uint8 ucSPVol=15; // MAX=15 MIN=0 // Speaker喇叭输出的音量
uint8 buffer[10];
unsigned long fpPoint=0;
/***********************************************************
* 名 称:void LD_reset(void)
* 功 能:LD芯片硬件初始化
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
**********************************************************/
void LD_reset(void)
{
u8 aa,bb,cc;
LD_RST_H();
delay_ms(1);
LD_RST_L();
delay_ms(1);
LD_RST_H();
delay_ms(1);
LD_CS_L();
delay_ms(1);
LD_CS_H();
delay_ms(1);
}
/***********************************************************
* 名 称: void LD_Init_Common(void)
* 功 能: 初始化命令
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
**********************************************************/
void LD_Init_Common(void)
{
LD_ReadReg(0x06);
LD_WriteReg(0x17, 0x35);
delay_ms(5);
LD_ReadReg(0x06);
LD_WriteReg(0x89, 0x03);
delay_ms(5);
LD_WriteReg(0xCF, 0x43);
delay_ms(5);
LD_WriteReg(0xCB, 0x02);
/*PLL setting*/
LD_WriteReg(0x11, LD_PLL_11);
if (nLD_Mode == LD_MODE_MP3)
{
LD_WriteReg(0x1E, 0x00);
LD_WriteReg(0x19, LD_PLL_MP3_19);
LD_WriteReg(0x1B, LD_PLL_MP3_1B);
LD_WriteReg(0x1D, LD_PLL_MP3_1D);
}
else
{
LD_WriteReg(0x1E,0x00);
LD_WriteReg(0x19, LD_PLL_ASR_19);
LD_WriteReg(0x1B, LD_PLL_ASR_1B);
LD_WriteReg(0x1D, LD_PLL_ASR_1D);
}
delay_ms(5);
LD_WriteReg(0xCD, 0x04);
LD_WriteReg(0x17, 0x4c);
LD3320_delay(1);
LD_WriteReg(0xB9, 0x00);
LD_WriteReg(0xCF, 0x4F);
LD_WriteReg(0x6F, 0xFF);
}
/***********************************************************
* 名 称:void LD_Init_ASR(void)
* 功 能:初始化ASR
* 入口参数:
* 出口参数:
* 说 明:
* 调用方法:
**********************************************************/
void LD_Init_ASR(void)
{
nLD_Mode=LD_MODE_ASR_RUN;
LD_Init_Common();
LD_WriteReg(0xBD, 0x00);
LD_WriteReg(0x17, 0x48);
LD3320_delay( 100 );
LD_WriteReg(0x3C, 0x80);
LD_WriteReg(0x3E, 0x07);
LD_WriteReg(0x38, 0xff);
LD_WriteReg(0x3A, 0x07);
LD_WriteReg(0x40, 0x00);
LD_WriteReg(0x42, 0x08);
LD_WriteReg(0x44, 0x00);
LD_WriteReg(0x46, 0x08);
LD3320_delay( 100 );
LD_WriteReg(0x35, 0x4C);
LD3320_delay( 10 );
LD_WriteReg(0xB3, 0x28);
LD_WriteReg(0xB4, 0x28);
// LD_WriteReg(0xB5, 0x64);
delay_ms( 10 );
}
/***********************************************************
* 名 称:void ProcessInt0(void)
* 功 能:识别处理函数
* 入口参数:
* 出口参数:
* 说 明:可以利用查询方式,或中断方式进行调用
* 调用方法:
**********************************************************/
void ProcessInt0(void)
{
uint8 nAsrResCount=0;
u8 err;
if(nLD_Mode == LD_MODE_ASR_RUN)
{
uint8 Ab2,Bf;
ucRegVal = LD_ReadReg(0x2B);
Ab2 = LD_ReadReg(0xc5);
Bf = LD_ReadReg(0xc7);
LCD_ShowxNum(100,150,ucRegVal,2,24,0);
LCD_ShowxNum(150,150,Ab2,4,24,0);
LCD_ShowxNum(200,150,Bf,4,24,0);
// 语音识别产生的中断
// (有声音输入,不论识别成功或失败都有中断)
LD_WriteReg(0x29,0) ;
LD_WriteReg(0x02,0) ;
if((ucRegVal & 0x10) && LD_ReadReg(0xb2)==0x21 && LD_ReadReg(0xbf)==0x35)
{
nAsrResCount = LD_ReadReg(0xba);
LCD_ShowString(100,200,100,24,24,"enter");
OSFlagPost(Flags,0x0001,OS_FLAG_SET,&err);/* 识别成功 1*/
if(nAsrResCount>0 && nAsrResCount<=4)
{
LCD_ShowString(200,200,100,24,24,"success");
LCD_ShowxNum(300,150,nAsrResCount,4,24,0);
nAsrStatus=LD_ASR_FOUNDOK;
LD_WriteReg(0xb2, 0);
}
else
{
// LD_reset();
LCD_ShowString(200,230,100,24,24,"enter fail");
nAsrStatus=LD_ASR_FOUNDZERO;
}
}
if( LD_ReadReg(0xbf)==0x35 )
{
OSFlagPost(Flags,0x0002,OS_FLAG_SET,&err);/* 识别失败 2*/
LCD_ShowString(100,230,100,24,24,"fail");
// LD_reset();
delay_ms(20);
ucRegVal = LD_ReadReg(0x2B);
nAsrStatus=LD_ASR_FOUNDZERO; //执行没有识别
}
// LD_WriteReg(0x2b, 0);
// LD_WriteReg(0x1C,0);/*写0:ADC不可用*/
// LD_WriteReg(0x29,0) ;
// LD_WriteReg(0x02,0) ;
// LD_WriteReg(0x2B, 0);
// LD_WriteReg(0xBA, 0);
// LD_WriteReg(0xBC,0);
// LD_WriteReg(0x08,1); /*清除FIFO_DATA*/
// LD_WriteReg(0x08,0); /*清除FIFO_DATA后 再次写0*/
// LD_WriteReg(0x1C,0x0b);
// LD_AsrRun();
//LD3320_delay(1);
//RunASR();
}
if(nLD_Mode == LD_MODE_MP3 )
{
ucRegVal = LD_ReadReg(0x2B);
ucHighInt = LD_ReadReg(0x29);
ucLowInt=LD_ReadReg(0x02);
LD_WriteReg(0x29,0) ;
LD_WriteReg(0x02,0) ;
if( LD_ReadReg(0xBA)&CAUSE_MP3_SONG_END)
{
// A. 声音数据已全部播放完。
LD_WriteReg(0x2B,0);
LD_WriteReg(0xBA, 0);
LD_WriteReg(0xBC,0x0);
bMp3Play=0; // 声音数据全部播放完后,修改bMp3Play的变量
nMp3Pos = 0;
LD_WriteReg(0x08,1);
delay_ms(1);
LD_WriteReg(0x08,0);
LD_WriteReg(0x33, 0);
// f_close(&ConfigFile);
OSFlagPost(Flags,0x0002,OS_FLAG_SET,&err);/* 播放完成 2*/
return ;
}
//
if(nMp3Pos>=nMp3Size)
{
// B. 声音数据已发送完毕。
LD_WriteReg(0xBC,0x01);
LD_WriteReg(0x29,0x10) ;
// bMp3Play=0; // 此时,只是主控MCU把所有MP3数据发送到LD3320芯片内,但是还没有把送入的数据全部播放完毕
return;
}
// if(nMp3Pos == nMp3Size)
// {
// bMp3Play = 0;
// OSFlagPost(Flags,0x0002,OS_FLAG_SET,&err);/* 识别失败 2*/
// return;
// }
LD_ReloadMp3Data();
LD_WriteReg(0x29,ucHighInt);
LD_WriteReg(0x02,ucLowInt) ;
//
}
// if((LD_ReadReg(0xBA)&CAUSE_MP3_SONG_END))
// return;
// if(nMp3Pos>=nMp3Size)
// LD_WriteReg(0xBC,0x01);
// else
// {
// if(LD_ReadReg(0x2B)&0x04 )
// {
// LD_ReloadMp3Data();
// LD_WriteReg(0x2B,0x00);
// }
//
// }
}
/***********************************************************
* 名 称:uint8 LD_Check_ASRBusyFlag_b2(void)
* 功 能:检测 ASR 是否忙状态
* 入口参数:flag ---1:空闲状态
* 出口参数:
* 说 明:
* 调用方法:
******************************************