📄 isd1790.c
字号:
#define _ISD1790_C_
#include "String.h"
#include "ISD1790.h"
static const unsigned short StartAddr[]=
{
0x022,0x028,0x02C,0x030,0x035,0x03B,0x040,0x045,
0x04A,0x04E,0x053,0x058,0x05E,0x063,0x068,0x06D,
0x072,0x078,0x07B,0x080,0x085,0x08E,0x094,0x09D,
0x0A6,0x0B2,0x0BC,0x0C9,0x0D0,0x0DC,0x0EB,0x0F6,
0x102,0x10E,0x118,0x120,0x128,0x130,0x147,0x14F,
0x162,0x170,0x179,0x182,0x18F,0x19B,0x1A3,0x1AC,
0x1C0,0x1D6,0x1E6,0x1F4
};
static const unsigned short EndAddr[]=
{
0x027,0x02C,0x030,0x035,0x03B,0x040,0x045,0x04A,
0x04E,0x053,0x058,0x05E,0x063,0x068,0x06D,0x072,
0x078,0x07B,0x080,0x085,0x08E,0x094,0x09D,0x0A6,
0x0B2,0x0BC,0x0C9,0x0D0,0x0DC,0x0EB,0x0F6,0x102,
0x10E,0x118,0x120,0x128,0x130,0x147,0x14F,0x162,
0x170,0x179,0x182,0x18F,0x19B,0x1A3,0x1AC,0x1C0,
0x1D6,0x1E6,0x1F4,0x200
};
//static bool playflag;
static bool playflag; //TRUE表示正在播放;FALSE表示播放结束
static bool playbackflag;//TRUE表示播放下一个语音
static BSPI_FRAME_DATA_STRUCT BspiFrame_Data;
static BSPI_DATA_STRUCT Bspi_Data;
static BSPI_CONFIG_STRUCT Bspi_Config;
static PLAY_BACK_STRUCT PlayBack_Data;
//发音调度
void VoiceScheduler()
{
#ifdef _ISD1790_EN_
if((playbackflag==TRUE)&&(playflag==FALSE))
{
if(PlayBack(&BspiFrame_Data,&Bspi_Data,&PlayBack_Data))
{
playbackflag=FALSE;
}
}
if(playflag==TRUE)
{
if(ISD17xxRDStatus(BSPI1))
{
playflag=FALSE;
playbackflag=TRUE;
}
}
#endif
}
void VoiceTest()
{
#ifdef _ISD1790_EN_
PLAY_FRAME_STRUCT PlayFrame_Data;
PlayFrame_Data.PlayCommand=0x49;
PlayFrame_Data.PlayFData[0].PlayBackMoney=1035.85;
PlayFrame_Data.PlayFData[1].PlayBackMoney=34.65;
PlayFrame_Data.PlayCommand=0x42;
VoicePlay(&PlayFrame_Data);
#endif
}
void VoiceInit()
{
#ifdef _ISD1790_EN_
/*设置Ssn脚为GPIO_OUT_PP*/
GPIO_Config(GPIO1, 0x8000, GPIO_OUT_PP);
/*配置BSPIx数据结构*/
Bspi_Config.BSPIx=BSPI1;
BspiInit(&Bspi_Data,&Bspi_Config);
ISD17xxPowerUp(&BspiFrame_Data,&Bspi_Data);
playflag=FALSE;
#endif
}
/*语音数据处理*/
void VoicePlay(PLAY_FRAME_STRUCT *PlayFrameData)
{
#ifdef _ISD1790_EN_
unsigned char PlayCMD;
PLAY_BACK_STRUCT *PlayBackData;
PlayBackData=&PlayBack_Data;
PlayCMD=PlayFrameData->PlayCommand;
switch(PlayCMD)
{
case 0x42://欢迎光临
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=20;
break;
case 0x43://欢迎光临,此卡可用日期xxx日
HandleDayData(PlayFrameData,PlayBackData);
break;
case 0x44://欢迎光临,此卡余额xxxx元
HandleMoneyData(PlayFrameData,PlayBackData);
break;
case 0x45://此卡余额不足(不予入场)
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=26;
break;
case 0x46://此卡过期(不予入场)
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=28;
break;
case 0x48://此卡无效(不予入场)
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=30;
break;
case 0x49://一路顺风,此次收费xxxx元,余额xxxx元
HandleMoneyData(PlayFrameData,PlayBackData);
break;
case 0x4A://请交费xxxx元,谢谢
HandleMoneyData(PlayFrameData,PlayBackData);
break;
case 0x4B://一路顺风,此卡可用日期xxx日
HandleDayData(PlayFrameData,PlayBackData);
break;
case 0x4C://此卡已入场
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=31;
break;
case 0x4D://请读卡,无卡请取卡并带卡入场
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=2;
PlayBackData->PlayData[0]=36;
PlayBackData->PlayData[1]=37;
break;
case 0x4E://请读卡,临时车辆请交费交卡
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=2;
PlayBackData->PlayData[0]=36;
PlayBackData->PlayData[1]=39;
break;
case 0x4F://系统禁止读卡
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=40;
break;
case 0x50://此卡未授权
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=44;
break;
case 0x51://此卡已挂失
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=43;
break;
case 0x52://车场满位
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=41;
break;
case 0x53://读卡有效
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=42;
break;
case 0x54://未交费,请到收费处交费
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=47;
break;
case 0x55://一路顺风
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=22;
break;
case 0x56://已超时,请回收费处补费
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=48;
break;
case 0x57://此卡已出场
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=32;
break;
case 0x58://请在指定位置读卡
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=1;
PlayBackData->PlayData[0]=49;
break;
default:
return;
}
playbackflag=TRUE;
#endif
}
/*将高位数据放到低位*/
static unsigned char ExChangeBit(unsigned char InData)
{
unsigned char OutData,i;
OutData=0;
for(i=0;i<8;i++)
{
OutData>>=1;
if(InData&0x80)
OutData|=0x80;
InData<<=1;
}
return OutData;
}
static bool void ISD17xxStop(BSPI_FRAME_DATA_STRUCT *BspiFrameData,BSPI_DATA_STRUCT *BspiData)
{
#ifdef _ISD1790_EN_
BspiFrameData->FrameLen=12;
BspiFrameData->TxDataLen=2;
BspiFrameData->RxDataLen=0;
BspiFrameData->FrameData[0]=ExChangeBit(0x02);
BspiFrameData->FrameData[1]=0;
BspiFrameData->ChipSelectEnable=ISD1790Enable;
BspiFrameData->ChipSelectDisable=ISD1790Disable;
BspiSendFrameData(BspiFrameData,BspiData);
#endif
}
static bool ISD17xxRDStatus(BSPI_TypeDef *BSPIx)
{
#ifdef _ISD1790_EN_
unsigned char PlayStatus;
volatile unsigned char TxByteCnt=0;
unsigned char TxData[]={0xA0,0,0};
unsigned char *TxP;
TxP=TxData;
ISD1790Enable();
while(TxByteCnt<3)
{
BspiDataSendReceive(BSPIx,(unsigned short)*TxP);
TxP++;TxByteCnt++;
}
ISD1790Disable();
PlayStatus=(BSPIx->RXR)>>8;
if(PlayStatus&0x80)
return TRUE;
#endif
return FALSE;
}
/*开启ISD17xx SPI模式*/
static void ISD17xxPowerUp(BSPI_FRAME_DATA_STRUCT *BspiFrameData,BSPI_DATA_STRUCT *BspiData)
{
#ifdef _ISD1790_EN_
BspiFrameData->FrameLen=12;
BspiFrameData->TxDataLen=2;
BspiFrameData->RxDataLen=0;
BspiFrameData->FrameData[0]=ExChangeBit(0x01);
BspiFrameData->FrameData[1]=0;
BspiFrameData->ChipSelectEnable=ISD1790Enable;
BspiFrameData->ChipSelectDisable=ISD1790Disable;
BspiSendFrameData(BspiFrameData,BspiData);
#endif
}
/*播放ISD17xx语音函数*/
static void ISD17xxPlay(BSPI_FRAME_DATA_STRUCT *BspiFrameData,BSPI_DATA_STRUCT *BspiData,unsigned char voicesum)
{
#ifdef _ISD1790_EN_
BspiFrameData->FrameLen=16;
BspiFrameData->TxDataLen=6;
BspiFrameData->RxDataLen=0;
BspiFrameData->FrameData[0]=ExChangeBit(0x90);
BspiFrameData->FrameData[1]=0;
BspiFrameData->FrameData[2]=ExChangeBit((unsigned char)StartAddr[voicesum]);
BspiFrameData->FrameData[3]=ExChangeBit((unsigned char)(StartAddr[voicesum]>>8));
BspiFrameData->FrameData[4]=ExChangeBit((unsigned char)EndAddr[voicesum]);
BspiFrameData->FrameData[5]=ExChangeBit((unsigned char)(EndAddr[voicesum]>>8));
//ISD17xx_play SPI数据帧格式
//CMD_byte+0+LOWBYTE of startaddress+HIGHBYTE of startaddress+LOWBYTE of endaddress+HIGHBYTE of endaddress
BspiFrameData->ChipSelectEnable=ISD1790Enable;
BspiFrameData->ChipSelectDisable=ISD1790Disable;
if(BspiSendFrameData(BspiFrameData,BspiData)==1)
{
playflag=TRUE;
}
#endif
}
/*处理有效日期数据*/
static void HandleDayData(PLAY_FRAME_STRUCT *PlayFrameData,PLAY_BACK_STRUCT *PlayBackData)
{
#ifdef _ISD1790_EN_
unsigned char PlayCMD;
unsigned char DayData[4];
PlayCMD=PlayFrameData->PlayCommand;
//DataConver(temp,DayData);//HEX 转 BCD
DateConver(PlayFrameData->PlayFData[0].PlayBackDay,DayData);//HEX 转 BCD
PlayBackData->PlayPointer=0;
PlayBackData->PlayAllNum=0;
if(PlayCMD==0x43)
{
PlayBackData->PlayData[0]=20;//欢迎光临
PlayBackData->PlayData[1]=24;//此卡可用日期
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -