By 曙光单片机科技 RC522程序读书笔记 详细注释
MF RC522 射频识别参考程序注释 串口读取的数据
//------------------------------------------
By 曙光单片机科技 RC522程序读书笔记 详细注释
ucAddr = ((Address<<1)&0x7E)|0x80;//变化成有效的地址形式,最
低位为0,最高位为1时候是,从MFRC522读出数据,参考39页
// 读SPI数据
//------------------------------------------ unsigned char SPIReadByte(void) {
unsigned char data SPICount; // Counter used to clock out the data
unsigned char data SPIData; SPIData = 0;
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be read {
SPIData <<=1; // Rotate the 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; nop();nop(); // Drop the clock ready for the next bit
} // and loop back return (SPIData); // Finally return the read data }
//------------------------------------------ // 写SPI数据
//------------------------------------------
void SPIWriteByte(unsigned char data SPIData) {
unsigned char data SPICount; // Counter used to clock out the data
for (SPICount = 0; SPICount < 8; SPICount++) {
if (SPIData & 0x80) {
SET_SPI_MOSI; } else
By 曙光单片机科技 RC522程序读书笔记 详细注释
{
CLR_SPI_MOSI; } nop();nop();
CLR_SPI_CK;nop();nop(); SET_SPI_CK;nop();nop(); SPIData <<= 1; }
}
///////////////////////////////////////////////////////////////////// //功 能:寻卡
//参数说明: req_code[IN]:寻卡方式
// 0x52 = 寻感应区内所有符合14443A标准的卡 // 0x26 = 寻未进入休眠状态的卡 // pTagType[OUT]:卡片类型代码 // 0x4400 = Mifare_UltraLight // 0x0400 = Mifare_One(S50) // 0x0200 = Mifare_One(S70) // 0x0800 = Mifare_Pro(X) // 0x4403 = Mifare_DESFire //返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdRequest(unsigned char data req_code,unsigned char *pTagType) { char data status; unsigned int data unLen; unsigned char data ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);//清除MRCrypto1on,要用软件清零 WriteRawRC(BitFramingReg,0x07);//startsend=0,rxalign=0,在FIFO中存放的位置,TXlastbit=7 SetBitMask(TxControlReg,0x03);//TX2rfen=1,TX1RFen=1,传递调制的13.56MHZ的载波信号 ucComMF522Buf[0] = req_code; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);//******************8 if ((status == MI_OK) && (unLen == 0x10)) { *pTagType = ucComMF522Buf[0]; *(pTagType+1) = ucComMF522Buf[1];
By 曙光单片机科技 RC522程序读书笔记 详细注释
} else { status = MI_ERR; } return status; }
///////////////////////////////////////////////////////////////////// //功 能:防冲撞
//参数说明: pSnr[OUT]:卡片序列号,4字节 //返 回: 成功返回MI_OK
///////////////////////////////////////////////////////////////////// char PcdAnticoll(unsigned char *pSnr) {
char data status;
unsigned char data i,snr_check=0; unsigned int data unLen;
unsigned char data ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08); //清除MRCrypto1on,要用软件清零 WriteRawRC(BitFramingReg,0x00); //表示最后一个字节所有位都发送 ClearBitMask(CollReg,0x80); //CollRegCollReg 0冲突结束后冲突位被置零
ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x20;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
if (status == MI_OK) { for (i=0; i<4; i++) {
*(pSnr+i) = ucComMF522Buf[i];//???????????????????????? snr_check ^= ucComMF522Buf[i]; //???????????????????????? }
if (snr_check != ucComMF522Buf[i]) { status = MI_ERR; } }
SetBitMask(CollReg,0x80); //CollRegCollReg 在106kbps良好的防冲突情况下该位置1 return status; }
By 曙光单片机科技 RC522程序读书笔记 详细注释
///////////////////////////////////////////////////////////////////// //功 能:选定卡片
//参数说明: pSnr[IN]:卡片序列号,4字节 //返 回: 成功返回MI_OK
///////////////////////////////////////////////////////////////////// char PcdSelect(unsigned char *pSnr) {
char data status; unsigned char data i; unsigned int data unLen;
unsigned char data ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_ANTICOLL1; ucComMF522Buf[1] = 0x70; ucComMF522Buf[6] = 0; for (i=0; i<4; i++) { ucComMF522Buf[i+2] = *(pSnr+i); ucComMF522Buf[6] ^= *(pSnr+i); }
CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]); //########
ClearBitMask(Status2Reg,0x08);//清零MFcryon
status
PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x18)) { status = MI_OK; } else
{ status = MI_ERR; }
return status; }
///////////////////////////////////////////////////////////////////// //功 能:验证卡片密码
//参数说明: auth_mode[IN]: 密码验证模式 // 0x60 = 验证A密钥 // 0x61 = 验证B密钥 // addr[IN]:块地址 // pKey[IN]:密码
=