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

📄 isd1790.c

📁 ISD1790-C程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -