uid有时读取失败
This commit is contained in:
@ -31,46 +31,6 @@ struct picc_v_struct PICC_V;
|
||||
struct picc_f_struct PICC_F;
|
||||
|
||||
|
||||
/**
|
||||
* @brief 等待FM176XX芯片内部中断标志。
|
||||
* @param wait_irq_flag [in] 要等待的中断标志位 (例如 BIT_IDLE_IRQ, BIT_TIMER_IRQ)。
|
||||
* @return 操作状态,SUCCESS表示成功等到目标标志,FAIL表示超时或出错。
|
||||
* @details
|
||||
* 该函数会轮询REG_INTREQ寄存器,直到指定的标志位被置位,
|
||||
* 或者芯片自身的定时器超时。同时包含一个软件超时以防止死循环。
|
||||
*/
|
||||
static unsigned char Wait_IRQ(unsigned char wait_irq_flag)
|
||||
{
|
||||
unsigned char irq0_val, irq1_val;
|
||||
unsigned int timeout = 200; // 软件超时计数,大约 200ms
|
||||
|
||||
// 清除所有中断标志位 (通过写1来清除)
|
||||
SetReg(REG_IRQ0, 0xFF);
|
||||
SetReg(REG_IRQ1, 0xFF);
|
||||
|
||||
do {
|
||||
GetReg(REG_IRQ0, &irq0_val);
|
||||
GetReg(REG_IRQ1, &irq1_val);
|
||||
|
||||
// 检查是否等到我们需要的标志 (Idle IRQ 在 IRQ0)
|
||||
if (irq0_val & wait_irq_flag) {
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
// 检查是否是芯片硬件定时器超时 (Timer IRQs 在 IRQ1)
|
||||
if (irq1_val & BIT_TIMER0IRQ) {
|
||||
xlog("Wait_IRQ: Hardware Timer Timeout!\n");
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
rfid_delay_ms(1); // 短暂延时,避免CPU空转
|
||||
timeout--;
|
||||
} while (timeout > 0);
|
||||
|
||||
xlog("Wait_IRQ: Software Timeout!\n");
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
/********************************************************************************************************
|
||||
* 公共接口函数
|
||||
********************************************************************************************************/
|
||||
@ -171,7 +131,7 @@ unsigned char SetCW(unsigned char mode)
|
||||
ModifyReg(REG_COMMAND, BIT_MODEMOFF, FUN_ENABLE);
|
||||
ModifyReg(REG_TXMODE, BIT_TPUSHON | BIT_TPULLON, FUN_DISABLE);
|
||||
}
|
||||
rfid_delay_ms(5);
|
||||
rfid_delay_ms(10);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@ -640,9 +600,7 @@ unsigned char ReaderV_Inventory(struct picc_v_struct *picc_v)
|
||||
{
|
||||
unsigned char reg_data, i, result; // 新增 result 变量
|
||||
SetCommand(CMD_IDLE);
|
||||
|
||||
// 设置15ms的硬件超时
|
||||
SetTimer(15);
|
||||
|
||||
|
||||
SetReg(REG_TXDATANUM, 0x08);
|
||||
ModifyReg(REG_FIFOCONTROL, BIT_FIFOFLUSH, FUN_ENABLE);
|
||||
@ -654,16 +612,7 @@ unsigned char ReaderV_Inventory(struct picc_v_struct *picc_v)
|
||||
ModifyReg(REG_RXCRCCON, BIT_CRCEN, FUN_ENABLE);
|
||||
|
||||
SetCommand(CMD_TRANSCEIVE);
|
||||
|
||||
// 使用新的等待函数,等待命令完成或硬件超时
|
||||
result = Wait_IRQ(BIT_IDLE_IRQ);
|
||||
SetTimer(0); // 关闭定时器
|
||||
|
||||
if (result != SUCCESS) {
|
||||
xlog("Wait_IRQ failed after TRANSCEIVE.\n");
|
||||
SetCommand(CMD_IDLE); // 尝试让芯片恢复IDLE状态
|
||||
return FAIL;
|
||||
}
|
||||
rfid_delay_ms(50);
|
||||
|
||||
GetReg(REG_ERROR, ®_data);
|
||||
if ((reg_data & 0x0F) != 0){
|
||||
@ -682,7 +631,9 @@ unsigned char ReaderV_Inventory(struct picc_v_struct *picc_v)
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
GetReg(REG_FIFODATA, &picc_v->UID[i]);
|
||||
// xlog("%d ",picc_v->UID[i]);
|
||||
}
|
||||
// xlog("\r\n");
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
@ -693,7 +644,7 @@ unsigned char ReaderV_Inventory(struct picc_v_struct *picc_v)
|
||||
*/
|
||||
unsigned char ReaderV_Select(struct picc_v_struct *picc_v)
|
||||
{
|
||||
unsigned char reg_data;
|
||||
unsigned char reg_data, result;
|
||||
SetCommand(CMD_IDLE);
|
||||
SetReg(REG_TXDATANUM, 0x08);
|
||||
ModifyReg(REG_FIFOCONTROL, BIT_FIFOFLUSH, FUN_ENABLE);
|
||||
|
||||
Reference in New Issue
Block a user