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

📄 dsa.c

📁 我个人编写的车载dvd上的程序
💻 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 + -