- // 防冲撞
- int8_t Card_Anticoll(uint8_t *card_sn)
- {
- // 该位表示MIFARE®Crypto1单元已打开,因此与该卡的所有数据通信都已加密
- RC522_ClearReg(Status2Reg, 0x08);
- // 不启动数据发送,接收的LSB位存放在位0,接收到的第二位放在位1,定义发送的最后一个字节的位数为8
- RC522_WriteData(BitFramingReg, 0x00);
- // 所有接收的位在冲突后将被清除。106kbit/s 有效。其他速率应该置1
- RC522_ClearReg(CollReg, 0x80);
- uint32_t OutLen;
- uint8_t RC522_DataBuffer[MAXRLEN] = {0};
-
- RC522_DataBuffer[0] = PICC_ANTICOLL1; // 0x93表明串联级别1
- RC522_DataBuffer[1] = 0x20; // 表明PCD发送字节数为整两个字节
-
- int8_t status = RC522_CardCom(PCD_TRANSCEIVE, RC522_DataBuffer, 2, RC522_DataBuffer, &OutLen);
-
- if(status == MI_OK)
- {
- uint8_t sn_check = 0;
- for(uint8_t i=0; i<4; i++)
- {
- card_sn[i] = RC522_DataBuffer[i];
- sn_check ^= RC522_DataBuffer[i];
- }
- if(sn_check != RC522_DataBuffer[4]) // 返回四个字节,最后一个字节为校验位
- {
- status = MI_ERR;
- }
- }
- RC522_SetReg(CollReg, 0x80); // 关闭冲撞检测
- return status;
- }
|