📄 dsa.c
字号:
#include "public.h"
//#include "dsa.h"
extern void SCI_SendPromter(unsigned char *promter,unsigned char *datas,unsigned char length);
//============================DSA Driver ==============================//
void DSA_init(void)
{
PD_DSACE = 1;
PCR1_DSACE = 1;
PCR2_DSACE = 0;
PIN_DSACE = 1;
PD_DSAACK = 1;
PCR1_DSAACK = 1;
PCR2_DSAACK = 0;
PIN_DSAACK = 1;
PD_DSADATA = 1;
PCR1_DSADATA = 1;
PCR2_DSADATA = 0;
PIN_DSADATA = 1;
}
unsigned char StartSynchronisation(void)
{
PD_DSAACK = 0;
Delay50ns;
ucSyncTimeOut = SYNCHRONISATION_TIME_OUT;
PIN_DSADATA = 0;
while(PINin_DSAACK)
{
if(ucSyncTimeOut == 0)
return FAILSE;
}
Wait10us(1);
PIN_DSADATA = 1;
while(!PINin_DSAACK)
{
if(ucSyncTimeOut == 0)
return FAILSE;
}
return SUCCESS;
}
unsigned char SlaveSynchronisation(void)
{
//debug("Start");
PD_DSADATA = 0;
PD_DSAACK = 1;
ucSyncTimeOut = SYNCHRONISATION_TIME_OUT;
Delay50ns;
if(PINin_DSADATA)
return FAILSE;
Wait10us(1);
PIN_DSAACK = 0;
while(!PINin_DSADATA)
{
if(ucSyncTimeOut == 0)
return FAILSE;
}
Wait10us(1);
PIN_DSAACK = 1;
Wait10us(1);
//debug("Detech");
return SUCCESS;
}
unsigned char Transfer(unsigned int data)
{
unsigned char i;
unsigned char delay;
ucTransTimeOut = DATA_TRANSFER_TIME_OUT;
// debug("START");
// data = 0xfe55;
for(i = 0; i < 16; i++)
{
if(data & 0x8000)
{
//SCI_SendString("H");
PIN_DSADATA = 1;
}
else
{
//SCI_SendString("L");
PIN_DSADATA = 0;
}
Delay50ns; // delay 50 ns
PIN_DSACE = 0;
while(PINin_DSAACK)
{
if(ucTransTimeOut == 0)
{
//SCI_SendString("F");
return FAILSE;
}
}
Wait10us(10);
PIN_DSACE = 1;
// PIN_DSADATA = 1;
while(!PINin_DSAACK)
{
if(ucTransTimeOut == 0)
return FAILSE;
}
data <<=1;//!!!!!!!!!!!!!!!!!!!!!!
Wait10us(10);
}
//SCI_SendString("OUT");
Wait10us(1);
return SUCCESS;
}
unsigned char Received(unsigned int *data)
{
unsigned char i;
unsigned int ret = 0,ret_test;
unsigned char dsa_data[2];
PD_DSACE = 0;
PD_DSADATA = 0;
PD_DSAACK = 1;
//dsa_data[0]=0;
// dsa_data[1]=0;
ucTransTimeOut = DATA_TRANSFER_TIME_OUT;
Delay50ns;
// SCI_SendString("R");
for(i = 0; i < 16;i++)
{
//ucGetDataNums = i;
while(PINin_DSACE)
{
if(ucSyncTimeOut == 0)
return FAILSE;
}
Wait10us(1);
if(PINin_DSADATA)
{
//SCI_SendString("H");
ret=((ret<<1)&0xfffe)|0x0001;
}
else
{
//SCI_SendString("L");
ret=((ret<<1)&0xfffe);
}
PIN_DSAACK = 0;
Delay50ns;
ucTransTimeOut = DATA_TRANSFER_TIME_OUT;
while(!PINin_DSACE)
{
if(ucSyncTimeOut == 0)
return FAILSE;
}
Wait10us(1);
PIN_DSAACK = 1;
}
Wait10us(1);
//test....
// dsa_data[0] = (unsigned char)(ret&0x00ff);
// dsa_data[1] = (unsigned char)((ret&0xff00)>>8);
*data = ret;
// debug_val("s",dsa_data[0] << 8 |dsa_data[1]);
return SUCCESS;
}
unsigned char CheckACK(void)
{
PD_DSAACK = 1;
PD_DSACE = 0;
PD_DSADATA = 0;
Delay50ns;
PIN_DSAACK = 0;
ucAckTimeout = ACK_TIME_OUT;
while(PINin_DSACE)
{
if(ucAckTimeout == 0)
return FAILSE;
}
if(PINin_DSADATA)
{
PIN_DSAACK = 1;
return SUCCESS;
}
else
{
PIN_DSAACK = 1;
return FAILSE;
}
}
unsigned char SendACK(void)
{
PD_DSAACK = 0;
PD_DSACE = 1;
PD_DSADATA = 1;
Delay50ns;
ucAckTimeout = ACK_TIME_OUT;
while(PINin_DSAACK)
{
if(ucAckTimeout == 0) return FAILSE;
}
Delay50ns;
if(ucGetDataNums == 15)
{
PIN_DSADATA = 1;
ucGetDataNums = 0;
}
else
{
ucGetDataNums = 0;
PIN_DSADATA = 0;
}
Delay50ns;
PIN_DSACE = 0;
while(!PINin_DSAACK)
{
if(ucAckTimeout == 0)
return FAILSE;
}
Wait10us(1);
PIN_DSADATA = 1;
PIN_DSACE = 1;
return SUCCESS;
}
//=========================== DSA Buffer Controll ============================//
void CommandBufInit(void)
{
unsigned char i;
for(i = 0; i < MAX_COMMAND_NUM ;i ++)
{
SendBuf[i] = 0;//NO_COMMAND << 8 | NO_DATA;
RecBuf[i] = 0;//NO_COMMAND << 8 |NO_DATA;
}
CurSendPos = 0;
CurRecPos = 0;
}
//will be called by every module.
void ADDSendCommandToBuff(unsigned char command,unsigned char data)
{
//debug_val("CurSendPos:",CurSendPos);
//unsigned char i;
SendBuf[CurSendPos] = command << 8 | data;
if(CurSendPos >= MAX_COMMAND_NUM)
CurSendPos = MAX_COMMAND_NUM;
else
CurSendPos ++;
// debug("CurSendPOS:",CurSendPos);
// for(i = 0;i < MAX_COMMAND_NUM;i++)
// debug_val("Send Buf", SendBuf[i]);
}
/*************************************
CurSendPos is the pos will be stored position.
**************************************/
void SubSendCommandToBuff(void)
{
unsigned char i;
if(CurSendPos == 0) return;
for(i = 0; i < CurSendPos ;i ++)
{
SendBuf[i] = SendBuf[i+1];
}
CurSendPos = CurSendPos - 1;
for(i = CurSendPos; i< MAX_COMMAND_NUM;i++)
SendBuf[i] = NO_COMMAND|NO_DATA;
// for(i = 0;i < MAX_COMMAND_NUM;i++)
// debug_val("Send Buf", SendBuf[i]);
}
void AddRecCommandToBuff(unsigned char command,unsigned char data)
{
//unsigned char i;
RecBuf[CurRecPos] = command << 8 | data;
if(CurRecPos >= MAX_COMMAND_NUM)
CurRecPos = MAX_COMMAND_NUM;
else
CurRecPos ++;
// for(i = 0;i < MAX_COMMAND_NUM;i++)
// debug_val("Send Buf", RecBuf[i]);
}
//will be called by every module.
//after analye the recevie data,then call this function.
void SubRecCommandToBuff(void)
{
unsigned char i;
if(CurRecPos == 0) return;
for(i = 0; i < CurRecPos ; i++)
{
RecBuf[i] = RecBuf[i +1];
}
CurRecPos = CurRecPos -1;
for(i = CurRecPos;i < MAX_COMMAND_NUM;i++)
RecBuf[i] = NO_COMMAND << 8 |NO_DATA;
// for(i = 0;i < MAX_COMMAND_NUM;i++)
// debug_val("Send Buf", RecBuf[i]);
}
//============================= DSA API=============================//
unsigned char DsaSendCommand(void)
{
unsigned char ret;
//debug_val("SendBuf:",CurSendPos);
// if(CurSendPos == 0) return FAILSE;
if(CurSendPos != 0)
debug_val("Send Buf",SendBuf[0]);
ret = StartSynchronisation();
if(ret == FAILSE)
return FAILSE;
ret = Transfer(SendBuf[0]);
if(ret == FAILSE)
return FAILSE;
ret = CheckACK();
if(ret == FAILSE)
return FAILSE;
SubSendCommandToBuff();
}
unsigned int DsaReceivedCommand(void)
{
unsigned char ret;
unsigned int data;
ret = SlaveSynchronisation();
if(ret == FAILSE)
return FAILSE;
ret = Received(&data);
if(ret == FAILSE)
return FAILSE;
ret = SendACK();
if(ret == FAILSE)
return FAILSE;
AddRecCommandToBuff((unsigned char)((data & 0xff00)>>8), (unsigned char)(data & 0xff));
debug_val("GetData :",data);
return data;
}
void DSACominucation_Init(void)
{
DSA_init();
CommandBufInit();
}
/*
void ProcDSA(void)
{
DSA_init();
if(CurSendPos > 0)
SendCommand();
DSA_init();
ReceivedCommand();
}
*/
/*
void ProcReceivedCommand(void)
{
switch((RecBuf[0] >> 8)&0xff)
{
case SEND_NEED_SOURCETYPE:
break;//...........
}
SubRecCommandToBuff();
}
void ProcSendCommand(void)
{
AddSendCommandToBuff(DsaCommand,DsaData);
}
*/
void ProcSendCommand()
{
unsigned char command,data;
switch(SysCommand){
case SYSTEM_COMMAND_SEND_SOURCETYPE:
command = SEND_NEED_SOURCETYPE;
break;
case SYSTEM_COMMAND_SEND_SWITCH_SOURCE:
command = SEND_SWITCH_SOURCE;
break;
case SYSTEM_COMMAND_SEND_IRVFD_KEY:
command = SEND_IRVFD_KEY;
break;
case SYSTEM_COMMAND_SEND_NEED_ID3_INFOR:
command = SEND_NEED_ID3_INFOR;
break;
case SYSTEM_COMMAND_SEND_ABNORMITY_STATUS:
command = SEND_ABNORMITY_STATUS;
break;
case SYSTEM_COMMAND_SEND_RESET_CONTROL:
command = SEND_RESET_CONTROL;
break;
case SYSTEM_COMMAND_SEND_CLEAR_RESUMEINFOR:
command = SEND_CLEAR_RESUMEINFOR;
break;
case SYSTEM_COMMAND_SEND_RECORD_RESUMEINFOR:
command = SEND_RECORD_RESUMEINFOR;
break;
case SYSTEM_COMMAND_SEND_VOLUME_UPDOWN:
command = SEND_VOLUME_UPDOWN;
break;
case SYSTEM_COMMAND_SEND_BLUETOOTH_NEWCALLIN:
command = SEND_BLUETOOTH_NEWCALLIN;
break;
case SYSTEM_COMMAND_SEND_GPS_NEWINFOR:
command = SEND_GPS_NEWINFOR;
break;
case SYSTEM_COMMAND_SEND_RADIO_TUNERSTATION_INFOR:
command = SEND_RADIO_TUNERSTATION_INFOR;
break;
case SYSTEM_COMMAND_SEND_BLUETOOTH_CMD:
command = SEND_BLUETOOTH_CMD;
break;
case SYSTEM_COMMAND_SEND_LOGO_ID:
command = SEND_LOGO_ID;
break;
case SYSTEM_COMMAND_SEND_TOUCH_PRESS_FLAG:
command = SEND_TOUCH_PRESS_FLAG;
break;
case SYSTEM_COMMAND_SEND_NUMBER_DATA:
command = SEND_NUMBER_DATA;
break;
case SYSTEM_COMMAND_SEND_BLUETOOTH_DATA:
command = SEND_BLUETOOTH_DATA;
break;
//FM/RDS.
case SYSTEM_COMMAND_SEND_FM_BAND:
command = SEND_FM_BAND;
break;
case SYSTEM_COMMAND_SEND_RDS_DATA:
command = SEND_RDS_DATA;
break;
//CLOCK.
case SYSTEM_COMMAND_SEND_CLOCK_YEAR:
command = SEND_CLOCK_YEAR;
break;
case SYSTEM_COMMAND_SEND_CLOCK_MON:
command = SEND_CLOCK_MON;
break;
case SYSTEM_COMMAND_SEND_CLOCK_DAY:
command = SEND_CLOCK_DAY;
break;
case SYSTEM_COMMAND_SEND_CLOCK_HOUR:
command = SEND_CLOCK_HOUR;
break;
case SYSTEM_COMMAND_SEND_CLOCK_MINUTE:
command = SEND_CLOCK_MINUTE;
break;
case SYSTEM_COMMAND_SEND_CLOCK_SECOND:
command = SEND_CLOCK_SECOND;
break;
//TOUCH PANEL
case SYSTEM_COMMAND_SEND_TOUCH_PANEL_X:
command = SEND_TOUCH_PANEL_X;
break;
case SYSTEM_COMMAND_SEND_TOUCH_PANEL_Y:
command = SEND_TOUCH_PANEL_Y;
break;
case SYSTEM_COMMAND_SEND_TOUCH_FLAG:
command = SEND_TOUCH_FLAG;
break;
}
ADDSendCommandToBuff(command,data);
}
void ProcReceivedCommand()
{
switch((RecBuf[0] >> 8) & 0xff)
{
case RECEIVE_DISC_NUMBER:
break;
case RECEIVE_TIME_HOUR:
break;
case RECEIVE_TIME_MINUTE:
break;
case RECEIVE_TIME_SECOND:
break;
case RECEIVE_MEDIATYPE_ERR:
break;
case RECEIVE_AUDIO_TYPE:
break;
case RECEIVE_PLAY_STATE:
break;
case RECEIVE_PLAY_MODE:
break;
case RECEIVE_SOURCE_TYPE:
break;
case RECEIVE_USBCARD_SWITCHSTATUS:
break;
case RECEIVE_SYSTEM_RESET:
break;
case RECEIVE_TRACK_TIMEOUT:
break;
case RECEIVE_FILE_TYPE:
break;
case RECEIVE_OTHER_CMD:
break;
case RECEIVE_NUMBER_DATA:
break;
case RECEIVE_ID3_SONG:
break;
case RECEIVE_ID3_ALUME:
break;
case RECEIVE_ID3_ARTIST:
break;
case RECEIVE_ID3_FOLDER:
break;
case RECEIVE_RADIO_STATUS:
break;
case RECEIVE_BLUETOOTH_CMD:
break;
}
}
void DispUI()
{
// if(System.FWorkMode.Current == WORKMODE_MENU)
// SysCommand = SYSTEM_COMMAND_
}
void DSAMain(void)
{
unsigned int GetData;
//ProcSendCommand();
// if(SendBuf[0] !=0)
//debug_val("Send buf",SendBuf[0]);
DSA_init();
DsaSendCommand();
DSA_init();
DsaReceivedCommand();
ProcReceivedCommand();
}
void DSATimer10ms(void)
{
if(ucSyncTimeOut >0) ucSyncTimeOut --;
if(ucTransTimeOut > 0) ucTransTimeOut --;
if(ucAckTimeout > 0) ucAckTimeout --;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -