// 防冲撞
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;
}
|