NXP MCU 技术论坛
直播中

张龙祥

8年用户 1257经验值
擅长:连接器
私信 关注
[问答]

CLRC663 REQA没有响应是为什么?

我们在我们的项目中使用 CLRC663,加载协议功能工作正常,但问题是 REQA 没有响应。我们遵循了 AN12657 文档中给出的所有说明,也尝试了没有库示例,但它们都不起作用。我们观察到 REQA 已成功传输,但之后我们既没有接收到 Rx 中断、数据、错误。请在下面找到 REQA 代码。有人可以帮助我们解决这个问题,或者让我们知道我们是否遗漏了代码中的任何内容。

uint8_t Load_Protocol_14443()
{
uint8_t errorRegister1;
write_reg(CLRC663_REG_COMMAND, CLRC663_CMD_IDLE);
write_reg(CLRC663_REG_FIFOCONTROL, 0xB0);
write_reg(CLRC663_REG_FIFODATA, 0x00);
write_reg(CLRC663_REG_FIFODATA, 0x00);
write_reg(CLRC663_REG_COMMAND, CLRC663_CMD_LOADPROTOCOL);
errorRegister1 = read_reg(CLRC663_REG_ERROR);
/* 检查是否发生错误*/
if (errorRegister1 != 0)
{
write_reg(CLRC663_REG_DRVMOD, 0x86);
返回假;
}
返回真;
}
uint8_t send_REQA()
{
write_reg(CLRC663_REG_COMMAND, CLRC663_CMD_IDLE);
write_reg(CLRC663_REG_FIFOCONTROL, 0xB0);
write_reg(CLRC663_REG_TXDATANUM, 7 | CLRC663_TXDATANUM_DATAEN);
write_reg(CLRC663_REG_TXCRCPRESET, CLRC663_RECOM_14443A_CRC | CLRC663_CRC_OFF);
write_reg(CLRC663_REG_RXCRCCON,CLRC663_RECOM_14443A_CRC | CLRC663_CRC_OFF);
write_reg(CLRC663_REG_RXBITCTRL, 0);
write_reg(CLRC663_REG_IRQ0, 0x7F);
write_reg(CLRC663_REG_IRQ1, 0x7F);
write_reg(CLRC663_REG_IRQ0EN, CLRC663_IRQ0EN_RX_IRQEN | CLRC663_IRQ0EN_ERR_IRQEN);// 全局 int
write_reg(CLRC663_REG_IRQ1EN, CLRC663_IRQ1EN_tiMER0_IRQEN); // 只触发 irq1 的定时器
uint8_t timer_for_timeout = 0;
CLRC663_timer_set_control(timer_for_timeout, CLRC663_TCONTROL_CLK_211KHZ | CLRC663_TCONTROL_START_TX_END);
// 帧等待时间:FWT = (256 x 16/fc) x 2 FWI
// FWI 默认为四...所以这意味着最多等待 5 毫秒
CLRC663_timer_set_reload(timer_for_timeout, 1000); // 5 usec 的 1000 个滴答是 5 毫秒。
CLRC663_timer_set_value(timer_for_timeout, 1000);
write_reg(CLRC663_REG_COMMAND, CLRC663_CMD_IDLE);
write_reg(CLRC663_REG_FIFOCONTROL, 1<<4);
write_reg(CLRC663_REG_FIFODATA, 0x26);
write_reg(CLRC663_REG_COMMAND, CLRC663_CMD_TRANSCEIVE);
// write_reg(CLRC663_REG_IRQ1, 0x7F);
uint8_t irq1_value = 0;
while (!(irq1_value & (1 << timer_for_timeout)))
{
irq1_value =read_reg(CLRC663_REG_IRQ1);
if (irq1_value & 0x40)
{ // ERR_IRQ 或 RX_IRQ
中断;// 停止轮询 irq1 并退出超时循环。
}
}
write_reg(CLRC663_REG_COMMAND, CLRC663_CMD_IDLE);
// 如果没有 Rx IRQ,或者有某种错误,返回 0
uint8_t irq0 = read_reg(CLRC663_REG_IRQ0);
// if ((!(irq0 & 0x04)) || (irq0 & 0x02))
// {
// 返回 0;
// }
uint8_t rx_len = read_reg(CLRC663_REG_FIFOLENGTH);
uint8_t res,寄存器 1,寄存器 2;
__no_operation();
if (rx_len == 2) { // ATQA 应该用 2 个字节来回答。
Register1 = read_reg(CLRC663_REG_FIFODATA);
Register2 = read_reg(CLRC663_REG_FIFODATA);
res = 寄存器 1;
res = 寄存器 2;
返回资源;
}
返回 0;

}
void CLRC663_timer_set_control(uint8_t timer, uint8_t value)
{
write_reg(CLRC663_REG_T0CONTROL + (5 * timer), value);
}
void CLRC663_timer_set_reload(uint8_t timer, uint16_t value)
{
write_reg(CLRC663_REG_T0RELOADHI + (5 * timer), value >> 8);
write_reg(CLRC663_REG_T0RELOADLO + (5 * timer), value & 0xFF);
}
void CLRC663_timer_set_value(uint8_t timer, uint16_t value)
{
write_reg(CLRC663_REG_T0COUNTERVALHI + (5 * timer), value >> 8);
write_reg(CLRC663_REG_T0COUNTERVALLO + (5 * timer), value & 0xFF);
}

                        

更多回帖

发帖
×
20
完善资料,
赚取积分