»ùÓÚµ¥Æ¬»úµÄIC¿¨ÃŽûϵͳ - ͼÎÄ ÏÂÔر¾ÎÄ

void delay_ns(unsigned int ns) { unsigned int i; for(i=0;i

//------------------------------------------ // ¶ÁSPIÊý¾Ý

//------------------------------------------ unsigned char SPIReadByte(void) { unsigned char SPICount; clock out the data unsigned char SPIData; SPIData = 0; for (SPICount = 0; SPICount < 8; SPICount++) the data to be read { SPIData <<=1; data CLR_SPI_CK; //nop();//nop(); Raise the clock to clock the data out of the MAX7456 if(STU_SPI_MISO) { SPIData|=0x01; } SET_SPI_CK; // Drop the clock ready for the next bit } return (SPIData); }

//------------------------------------------ // дSPIÊý¾Ý

//------------------------------------------

void SPIWriteByte(unsigned char SPIData) { unsigned char SPICount; 39

// Counter used to // Prepare to clock in // Rotate the // //nop();//nop(); // and loop back // Finally return the read data // Counter used to

clock out the data for (SPICount = 0; SPICount < 8; SPICount++) { if (SPIData & 0x80) { SET_SPI_MOSI; } else { CLR_SPI_MOSI; } nop();nop(); CLR_SPI_CK;nop();nop(); SET_SPI_CK;nop();nop(); SPIData <<= 1; } }

///////////////////////////////////////////////////////////////////// //¹¦ ÄÜ£º¶ÁRC632¼Ä´æÆ÷

//²ÎÊý˵Ã÷£ºAddress[IN]:¼Ä´æÆ÷µØÖ· //·µ »Ø£º¶Á³öµÄÖµ

///////////////////////////////////////////////////////////////////// unsigned char ReadRawRC(unsigned char Address) { unsigned char ucAddr; unsigned char ucResult=0; CLR_SPI_CS;

ucAddr = ((Address<<1)&0x7E)|0x80; SPIWriteByte(ucAddr); ucResult=SPIReadByte(); SET_SPI_CS; return ucResult; }

///////////////////////////////////////////////////////////////////// //¹¦ ÄÜ£ºÐ´RC632¼Ä´æÆ÷

//²ÎÊý˵Ã÷£ºAddress[IN]:¼Ä´æÆ÷µØÖ· // value[IN]:дÈëµÄÖµ

/////////////////////////////////////////////////////////////////////

void WriteRawRC(unsigned char Address, unsigned char value) {

unsigned char ucAddr;

40

CLR_SPI_CS;

ucAddr = ((Address<<1)&0x7E); SPIWriteByte(ucAddr); SPIWriteByte(value); SET_SPI_CS; }

///////////////////////////////////////////////////////////////////// //¹¦ ÄÜ£ºÇåRC522¼Ä´æÆ÷λ //²ÎÊý˵Ã÷£ºreg[IN]:¼Ä´æÆ÷µØÖ· // mask[IN]:Çåλֵ

/////////////////////////////////////////////////////////////////////

void ClearBitMask(unsigned char reg,unsigned char mask) {

char tmp = 0x00;

tmp = ReadRawRC(reg);

WriteRawRC(reg, tmp & ~mask); // clear bit mask }

///////////////////////////////////////////////////////////////////// //¹¦ ÄÜ£ºÖÃRC522¼Ä´æÆ÷λ //²ÎÊý˵Ã÷£ºreg[IN]:¼Ä´æÆ÷µØÖ· // mask[IN]:ÖÃλֵ

/////////////////////////////////////////////////////////////////////

void SetBitMask(unsigned char reg,unsigned char mask) {

char tmp = 0x00;

tmp = ReadRawRC(reg);

WriteRawRC(reg,tmp | mask); // set bit mask }

///////////////////////////////////////////////////////////////////// //ÓÃMF522¼ÆËãCRC16º¯Êý

/////////////////////////////////////////////////////////////////////

void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData) {

unsigned char i,n;

ClearBitMask(DivIrqReg,0x04);

WriteRawRC(CommandReg,PCD_IDLE); SetBitMask(FIFOLevelReg,0x80); for (i=0; i

{ WriteRawRC(FIFODataReg, *(pIndata+i)); } WriteRawRC(CommandReg, PCD_CALCCRC);

41

i = 0xFF; do {

n = ReadRawRC(DivIrqReg); i--; }

while ((i!=0) && !(n&0x04));

pOutData[0] = ReadRawRC(CRCResultRegL); pOutData[1] = ReadRawRC(CRCResultRegM); }

///////////////////////////////////////////////////////////////////// //¹¦ ÄÜ£ºÍ¨¹ýRC522ºÍISO14443¿¨Í¨Ñ¶ //²ÎÊý˵Ã÷£ºCommand[IN]:RC522ÃüÁî×Ö

// pInData[IN]:ͨ¹ýRC522·¢Ë͵½¿¨Æ¬µÄÊý¾Ý // InLenByte[IN]:·¢ËÍÊý¾ÝµÄ×Ö½Ú³¤¶È // pOutData[OUT]:½ÓÊÕµ½µÄ¿¨Æ¬·µ»ØÊý¾Ý // *pOutLenBit[OUT]:·µ»ØÊý¾ÝµÄ볤¶È ///////////////////////////////////////////////////////////////////// char PcdComMF522(unsigned char Command, unsigned char *pInData, unsigned char InLenByte, unsigned char *pOutData, unsigned int *pOutLenBit) {

char status = MI_ERR;

unsigned char irqEn = 0x00; unsigned char waitFor = 0x00; unsigned char lastBits; unsigned char n; unsigned int i; switch (Command) {

case PCD_AUTHENT: irqEn = 0x12; waitFor = 0x10; break; case PCD_TRANSCEIVE: irqEn = 0x77; waitFor = 0x30; break; default: break; }

42