unsigned char ReaderA_AntiColl(void) { unsigned char reg_data; SetReg(JREG_TXMODE,0);//Disable TxCRC SetReg(JREG_RXMODE,0);//Disable RxCRC SetReg(JREG_COMMAND,CMD_IDLE);//command = Idel SetReg(JREG_FIFOLEVEL,JBIT_FLUSHFIFO);//Clear FIFO SetReg(JREG_FIFODATA,RF_CMD_ANTICOL); SetReg(JREG_FIFODATA,0x20); SetReg(JREG_COMMAND,CMD_TRANSCEIVE);//command = Transceive SetReg(JREG_BITFRAMING,0x80);//Start Send mDelay(2);//Wait 2ms GetReg(JREG_FIFOLEVEL,®_data); if(reg_data == 5) { GetReg(JREG_FIFODATA,PICC_A.UID); GetReg(JREG_FIFODATA,PICC_A.UID+1); GetReg(JREG_FIFODATA,PICC_A.UID+2); GetReg(JREG_FIFODATA,PICC_A.UID+3); GetReg(JREG_FIFODATA,&PICC_A.BCC); if( (PICC_A.UID[0] ^ PICC_A.UID[1] ^ PICC_A.UID[2] ^ PICC_A.UID[3]) == PICC_A.BCC) return FM17622_SUCCESS; } return FM17622_COMM_ERR; }解释一下这个函数
时间: 2024-04-13 14:27:34 浏览: 127
duojikongzhi.rar_Unsigned_c++include <reg51>
这个函数名为ReaderA_AntiColl,用于执行射频卡的防冲突操作。
函数首先定义了一个无符号字符型变量reg_data。
接下来,通过调用SetReg函数分别设置JREG_TXMODE和JREG_RXMODE寄存器为0,禁用发送和接收的CRC校验。
然后,通过SetReg函数将JREG_COMMAND寄存器设置为CMD_IDLE,表示将卡片命令设置为空闲状态。
再次调用SetReg函数将JREG_FIFOLEVEL寄存器设置为JBIT_FLUSHFIFO,以清空FIFO缓冲区。
接着,通过SetReg函数连续两次设置JREG_FIFODATA寄存器,分别写入RF_CMD_ANTICOL和0x20,这是射频卡的防冲突指令和参数。
再次调用SetReg函数将JREG_COMMAND寄存器设置为CMD_TRANSCEIVE,表示启动发送和接收操作。
通过SetReg函数将JREG_BITFRAMING寄存器设置为0x80,表示开始发送数据。
之后,通过mDelay函数延时2毫秒,等待数据发送完成。
接下来,调用GetReg函数读取JREG_FIFOLEVEL寄存器的值,并将其存储在reg_data变量中。
如果reg_data等于5,则执行以下操作:
- 调用GetReg函数分别读取JREG_FIFODATA寄存器的值,并将其分别存储在PICC_A.UID数组的不同位置,以获取卡片的UID。
- 调用GetReg函数读取JREG_FIFODATA寄存器的值,并将其存储在PICC_A.BCC变量中,以获取卡片的BCC校验码。
- 如果PICC_A.UID[0]、PICC_A.UID[1]、PICC_A.UID[2]和PICC_A.UID[3]的异或结果等于PICC_A.BCC,则返回FM17622_SUCCESS表示防冲突操作成功。
如果没有满足上述条件,则返回FM17622_COMM_ERR表示通信错误。
整个函数的作用是执行射频卡的防冲突操作,并判断防冲突操作是否成功。
阅读全文