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

📄 card.cpp

📁 基于单片机ATmega16制作IC card 。程序中包含数据的采集和通信。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
//card.cpp : source file for the card project
//

#include "card.h"
#include "cardTimer.h"
#include "progmem.h"
#include "eeprom.h"
#include "cardADC.h" 
#include "cardSPI.h"
#include "cardUART.h"
#include "cardExtINT.h"
#include "carduser.h"
#include <util/delay.h> 


/////////////
void WriteUart(unsigned int wTxNumber,unsigned char bIsWaitTx)
{
 while(bTxBuffLock == TRUE)
 {
  asm("wdr"); 
 }
 bTxBuffLock = TRUE;	
 wTxByteNumber = wTxNumber;
 TxCheckSum = 0;
 wTxByteCounts = 0;
 UDR = TxBuff[0];
 UCSRB |= (RE_UDRIE0 | RE_TXEN0);
 if(bIsWaitTx == TRUE)
 {
  while(TRUE)
  {
   asm("wdr");
   if(wTxByteCounts == wTxByteNumber)
   {
    break;
   }
  }
 }
}

//cCOMCommand::cCOMCommand()
//{
//}

//cCOMCommand::~cCOMCommand()
//{
//}

void SendIdentify(void)
{
 ReadFlash(TxBuff,(prog_uchar *)Identify,IDENTIFY_LEN);
 WriteUart(IDENTIFY_LEN,WAIT_TX);	
}


//void SendContextButtonStatus(unsigned long int ButtonStatus)
//{
 //ReadFlash(TxBuff,(prog_uchar *)ContextButtonStatus,CONTEXT_BUTTON_STATUS_LEN);
 //*(unsigned long int *)(TxBuff + 5) = ButtonStatus; 
 //WriteUart(CONTEXT_BUTTON_STATUS_LEN,UN_WAIT_TX);
//}

void SendContextButtonStatus(unsigned long int ButtonStatus)
{
 ReadFlash(TxBuff,(prog_uchar *)ContextButtonStatus,CONTEXT_BUTTON_STATUS_LEN);
 *(unsigned long int *)(TxBuff + 5) = ButtonStatus; 
 WriteUart(CONTEXT_BUTTON_STATUS_LEN,UN_WAIT_TX);
}


/*
void SendIdentifyDeviceLingoes(void)
{
 TxBuff[11] = 0x06;        //SPI read command and register address 
 TxBuff[12] = 0x04;        //SPI data length
 ReadOrWriteSPI((unsigned char *)(TxBuff + 11),6);
 ReadFlash(TxBuff,(prog_uchar *)IdentifyDeviceLingoes,(IDENTIFY_DEVICE_LINGO_LEN - 4));
 WriteUart(IDENTIFY_DEVICE_LINGO_LEN,WAIT_TX);
} 

void SendDevAuthenticationInfo(void)
{
 TxBuff[3] = 0x02;        //SPI read command and register address 
 TxBuff[4] = 0x02;        //SPI data length
 ReadOrWriteSPI(&TxBuff[3],4);
 ReadFlash(TxBuff,(prog_uchar *)RetDevAuthenticationInfo,(RET_DEV_AUTHENTICATION_INFO_LEN - 2));
 WriteUart(RET_DEV_AUTHENTICATION_INFO_LEN,UN_WAIT_TX);
}


void SendDevAuthenticationSignature(void)
{
  unsigned char temp;

  temp = TxBuff[0] - 3;                    //Signature data length
  TxBuff[22] = 0xa0;
  TxBuff[23] = 2;
  TxBuff[24] = 0;
  TxBuff[25] = temp;
  ReadOrWriteSPI(&TxBuff[22],4);

  
  TxBuff[1] = 0xa1;
  TxBuff[2] = temp;
  ReadOrWriteSPI(&TxBuff[1],temp + 2);
  
  TxBuff[0] = 0x91;
  TxBuff[1] = 0x01;
  TxBuff[2] = 0x01;
  ReadOrWriteSPI(TxBuff,3);
	
  TxBuff[0] = 0x11;
  TxBuff[1] = 0x01;
  ReadOrWriteSPI(TxBuff,3);
  if((TxBuff[2] & SIGNATURE_OK_MASK) == SIGNATURE_OK)
  {
   TxBuff[0] = 0x12;
   TxBuff[1] = 0x02;
   ReadOrWriteSPI(TxBuff,0x04);
   temp = TxBuff[3];
  
   TxBuff[3] = 0x13;
   TxBuff[4] = temp;
   ReadOrWriteSPI(&TxBuff[3],temp + 2);
   ReadFlash(TxBuff,(prog_uchar *)RetDevAuthenticationSignature,5);

   		    
   //asm("ldi R17,_TxBuff\n"
       //"ldi R18,_RetDevAuthenticationSignature\n"
	   //"ldi R19,5\n"
	   //"rcall _ReadEeprom\n"
      //);
   
   TxBuff[2] = temp + 2;  
   WriteUart(temp + 5,UN_WAIT_TX);
   //UartReceive = UART_RECEIVE;
   //while(UartReceive != UART_RECEIVE_ONE_PACKET);
   //UartReceive = UART_RECEIVE;
   //if(ReceivePacket2 == ACK_AUTHENTICATION_STATUS)
   //{
    //if(ReceivePacket3 != ACK_OK)
	//{
	 //PORTB |= LED;
    //}
   //}
  }  
}*/
void SendIdentifyDeviceLingoes(void)
{
#if defined(AUTH_PROT_VER20)
 TxBuff[11] = 0x04;        //SPI read command and register address 
 TxBuff[12] = 0x04;  //0x04      //SPI data length
#endif
#if defined(AUTH_PROT_VER10)
 TxBuff[11] = 0x06;        //SPI read command and register address 
 TxBuff[12] = 0x04;        //SPI data length
#endif 
 ReadOrWriteSPI((unsigned char *)(TxBuff + 11),6);
 ReadFlash(TxBuff,(prog_uchar *)IdentifyDeviceLingoes,(IDENTIFY_DEVICE_LINGO_LEN - 4));
 WriteUart(IDENTIFY_DEVICE_LINGO_LEN,WAIT_TX);
} 



////////////
void SendDevAuthenticationInfo(void)
{
#if defined(AUTH_PROT_VER10)
 TxBuff[3] = 0x02;        //SPI read command and register address 
 TxBuff[4] = 0x02;        //SPI data length
 ReadOrWriteSPI(&TxBuff[3],4);
 ReadFlash(TxBuff,(prog_uchar *)RetDevAuthenticationInfo,(RET_DEV_AUTHENTICATION_INFO_LEN - 2));
 WriteUart(RET_DEV_AUTHENTICATION_INFO_LEN,UN_WAIT_TX);	
#endif
#if defined(AUTH_PROT_VER20)	
 unsigned char temp;

 
 TxBuff[5] = 0x02;        //SPI read command and register address 
 TxBuff[6] = 0x02;        //SPI data length
 ReadOrWriteSPI(&TxBuff[5],4);	
 TxBuff[0] = 0x30;        //SPI read command and register address 
 TxBuff[1] = 0x02;        //SPI data length
 ReadOrWriteSPI(&TxBuff[0],4);
 temp = TxBuff[2];
 TxBuff[2] = TxBuff[3];
 TxBuff[3] = temp;
 wResiCertDataCounts = *(unsigned int *)(TxBuff+2);
 wCurrCertDataCounts = 0;
 wOverCertDataCounts = 0;
 CertPackCounts = 0;
 CertPageCounts = 0x00;
 CurrCertPageDataCounts = 0x00;
 wOverCertDataCounts = 0;

 TxBuff[0] = 0xff;
 TxBuff[1] = 0x55;
 TxBuff[2] = 0x00;
 TxBuff[5] = 0x00;
 TxBuff[6] = 0x15;
 TxBuff[10] = wResiCertDataCounts/CERT_PACK_DATA_LEN;
 while(wResiCertDataCounts > 0)
 {
  asm("wdr");	 
  if(bTxBuffLock == FALSE)
  {
   asm("wdr");  
   if(wResiCertDataCounts > CERT_PACK_DATA_LEN)
   {
	wResiPackDataCounts = CERT_PACK_DATA_LEN;  
    *(unsigned int *)(TxBuff+3) = CERT_PACK_DATA_LEN + 6;
	wResiCertDataCounts -= CERT_PACK_DATA_LEN;
   }
   else
   {
	wResiPackDataCounts = wResiCertDataCounts;  
    *(unsigned int *)(TxBuff+3) = wResiCertDataCounts + 6;
	wResiCertDataCounts = 0;
   }
   TxBuff[9] = CertPackCounts;	
   temp = TxBuff[3];
   TxBuff[3] = TxBuff[4];
   TxBuff[4] = temp;
   wPackTotalDataCounts = wResiPackDataCounts + 11;
   CurrCertPageDataCounts = 0;
   wCertDataOffset = 11;
   while(wResiPackDataCounts > 0)
   {
    while(!(PINB & CP_READY))
    {
     asm("wdr");
    }    //Wait until CP_READY goes high.
	SPIReadDataLen = (wResiPackDataCounts > CERT_PAGE_DATA_LEN) ? CERT_PAGE_DATA_LEN : wResiPackDataCounts;
    temp = SPSR;
    temp = SPDR;         //Clear SPDIF   
    SPDR = CERT_PAGE_FIRST_ADDR + CertPageCounts;
    while(!(SPSR & (1 << SPIF)));
	temp = SPDR;
	DelayUs(20);
    SPDR = SPIReadDataLen;
    while(!(SPSR & (1 << SPIF)));
	temp = SPDR;
	DelayUs(20);	
	CurrCertPageDataCounts = 0;
	while(!(PINB & CP_READY))
    {
     asm("wdr");
    }    //Wait until CP_READY goes high.
	while(CurrCertPageDataCounts != CERT_PAGE_DATA_LEN)
	{
     asm("wdr");		
     SPDR = 0xff;
     while(!(SPSR & (1 << SPIF)));
	 temp = SPDR;
	 DelayUs(20);	
	 if(wOverCertDataCounts == wCurrCertDataCounts)
	 {		
      TxBuff[wCertDataOffset] = temp;
	  wResiPackDataCounts--;
	  wCertDataOffset++;
	  wCurrCertDataCounts++;
	  if(wResiPackDataCounts == 0)
	  {
	   break;
	  }
	 }
	 wOverCertDataCounts++;
	 CurrCertPageDataCounts++;
	}
	CertPageCounts++;
   } 
   WriteUart(wPackTotalDataCounts,UN_WAIT_TX);
   CertPageCounts--;
   wOverCertDataCounts = CertPageCounts * CERT_PAGE_DATA_LEN;   
   CertPackCounts++;
  }
 }
#endif
}
/////////////////////////
void SendDevAuthenticationSignature(void)
{
  unsigned char temp;

  temp = TxBuff[0] - 3;                    //Signature data length
  TxBuff[30] = 0xa0;
  TxBuff[31] = 2;
  TxBuff[32] = 0;
  TxBuff[33] = temp;
  ReadOrWriteSPI(&TxBuff[30],4);

  
  TxBuff[1] = 0xa1;
  TxBuff[2] = temp;
  ReadOrWriteSPI(&TxBuff[1],temp + 2);
  
#if defined(AUTH_PROT_VER10)  
  TxBuff[0] = 0x91;
#endif
#if defined(AUTH_PROT_VER20)  
  TxBuff[0] = 0x90;
#endif
  TxBuff[1] = 0x01;
  TxBuff[2] = 0x01;
  ReadOrWriteSPI(TxBuff,3);
	
#if defined(AUTH_PROT_VER10)   
  TxBuff[0] = 0x11;
#endif
#if defined(AUTH_PROT_VER20)  
  TxBuff[0] = 0x10;
#endif    
  TxBuff[1] = 0x01;
  ReadOrWriteSPI(TxBuff,3);
  if((TxBuff[2] & SIGNATURE_OK_MASK) == SIGNATURE_OK)
  {
#if defined(AUTH_PROT_VER10)   
   TxBuff[0] = 0x12;
#endif
#if defined(AUTH_PROT_VER20)   
   TxBuff[0] = 0x11;
#endif   
   TxBuff[1] = 0x02;
   ReadOrWriteSPI(TxBuff,0x04);
   temp = TxBuff[3];
  
#if defined(AUTH_PROT_VER10)     
   TxBuff[3] = 0x13;
#endif
#if defined(AUTH_PROT_VER20)     
   TxBuff[3] = 0x12;
#endif   
   TxBuff[4] = temp;
   ReadOrWriteSPI(&TxBuff[3],temp + 2);
   ReadFlash(TxBuff,(prog_uchar *)RetDevAuthenticationSignature,5);

   		    
   //asm("ldi R17,_TxBuff\n"
       //"ldi R18,_RetDevAuthenticationSignature\n"
	   //"ldi R19,5\n"
	   //"rcall _ReadEeprom\n"
      //);
   
   TxBuff[2] = temp + 2;  
   WriteUart(temp + 5,UN_WAIT_TX);
   //UartReceive = UART_RECEIVE;
   //while(UartReceive != UART_RECEIVE_ONE_PACKET);
   //UartReceive = UART_RECEIVE;
   //if(ReceivePacket2 == ACK_AUTHENTICATION_STATUS)
   //{
    //if(ReceivePacket3 != ACK_OK)
	//{
	 //PORTB |= LED;
    //}
   //}
  }  
}
//////////////////////
void Lingo1Ack(unsigned char CommandID)
{
 ReadFlash(TxBuff,(prog_uchar *)Lingo1AckOk,(LINGO1_ACK_OK_LEN - 1));
 TxBuff[6] = CommandID;
 WriteUart(LINGO1_ACK_OK_LEN,UN_WAIT_TX);//LINGO1_ACK_OK_LEN);	
}
///////////
void SendSetIpodPreferences()
{
 ReadFlash(TxBuff,(prog_uchar *)SetIpodPreferences,SET_IPOD_PREFERENCE_LEN);
 WriteUart(SET_IPOD_PREFERENCE_LEN,WAIT_TX);	
}

//void Lingo1AckError(unsigned char CommandID)
//{
 //ReadFlash(TxBuff,(prog_uchar *)Lingo1AckErrors,(LINGO1_ACK_ERROR_LEN - 1));
 //TxBuff[6] = CommandID;
 //WriteUart(LINGO1_ACK_ERROR_LEN,UN_WAIT_TX);//LINGO1_ACK_OK_LEN);	
//}

//void RetDevCap(void)	
//{
 //ReadFlash(TxBuff,(prog_uchar *)RetDevCaps,RET_DEV_CAPS_LEN);
 //WriteUart(RET_DEV_CAPS_LEN,UN_WAIT_TX);		
//}

//void cCOMCommand::GetiPodStatusInfo(void)
//{
 //ReadFlash(TxBuff,(prog_uchar *)GetiPodStatusInfos,GET_IPOD_STATUS_INFO_LEN);
 //WriteUart(GET_IPOD_STATUS_INFO_LEN,UN_WAIT_TX);
//}

//void cCOMCommand::SetiPodStateInfo(unsigned char StateInfo)
//{
 //ReadFlash(TxBuff,(prog_uchar *)SetiPodStateInfos,SET_IPOD_STATE_INFO_LEN);
 //TxBuff[SET_IPOD_STATE_INFO_LEN - 1] = StateInfo;
 //WriteUart(SET_IPOD_STATE_INFO_LEN,UN_WAIT_TX);			
//}

//void RetAccessoryCapbilite(void)
//{
 //ReadFlash(TxBuff,(prog_uchar *)RetAccessoryCapbilites,RET_ACCESSORY_CAPBILITES_LEN);
 //COMCommand.WriteUart(RET_ACCESSORY_CAPBILITES_LEN,WAIT_TX);	
//}


//////////
void ReadOrWriteSPI(unsigned char *pSPIBuff,unsigned char Number)
{
 char temp,i;
 
 while(!(PINB & CP_READY))
 {
  asm("wdr");
 }    //Wait until CP_READY goes high.
 temp = SPSR;
 temp = SPDR;         //Clear SPDIF
 //PORTB &= ~SPI_NSS;      //Pull down SPI_nSS
 DelayUs(40);//38
 for(i = 0;i < Number;i++)
 {
  SPDR = *(pSPIBuff + i);
  while(!(SPSR & (1 << SPIF)));
  //while(!(USISR & RE_USIOIF))
  //{
   //USICR = temp;
   //DelayUs(6/3); 
  //}
  *(pSPIBuff + i) = SPDR;
  DelayUs(20);//20
  asm("wdr");
#if defined(AUTH_PROT_VER20)  
  if(i == 1)
  {
   while(!(PINB & CP_READY))
   {
    asm("wdr");
   }    //Wait until CP_READY goes high. 
  }
#endif  
 }
 //PORTB |= SPI_NSS;   //Pull high SPI_nSS
}


//unsigned int FMFrequenceStepValue[] = {881,941,1001,0,1061};

//unsigned char FMFrequenceModeEeprom __attribute__((section(".eeprom"))) = NO_M;

/*
unsigned char ReadEeprom(unsigned char EepromAddress)
{
 while(EECR & (1 << EEPE));
 asm("cli");
 EEARL = EepromAddress;
 EEARH = 0;
 EECR |= (1 << EERE);
 asm("sei");
 return EEDR;
}

void WriteEeprom(unsigned char EepromAddress,unsigned int wEepromData)
{
 unsigned char i;
 while(EECR & (1 << EEPE));
 asm("cli");
 for(i = 0;i < 2;i++)
 {
  asm("wdr");
  while(EECR & (1 << EEPE));
  EEAR = (EepromAddress + i);
  EEDR = *((unsigned char *)&wEepromData + i);
  EECR |= (1 << EEMPE);
  EECR |= (1 << EEPE);
 }
 asm("sei");
}*/



//cLCD::cLCD()
//{
 //unsigned char i;
 
 //for(i = 0;i < 4;i++)
 //{
  //DisplayBuff[i] = 0xff;
 //}
//}

//cLCD::~cLCD()
//{
//}

void WriteBit(unsigned char Data,unsigned char Number)
{
 unsigned char i;
  
 for(i = 0;i < Number;i++)
 {
  asm("wdr");
  asm("cbi 0x15,1");
  if(Data & 0x80)
  {
   asm("sbi 0x15,0");
  }
  else
  {
   asm("cbi 0x15,0");  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -