嗨,团队、
我正在使用 PN7462 进行 HSU UART 通信,并实现了如下的 HIF 初始化:
void Hif_UartInit(void)
{
phStatus_t status;
gHifConfig.eInterface = E_HIF_HSU;
gHifConfig.sConfig.sHsuConfig.bIsHsuBoot = 0;
gHifConfig.sConfig.sHsuConfig.bBaudRate = E_HSU_BAUDRATE_9_6K;
gHifConfig.sConfig.sHsuConfig.bStopBits = 1;
gHifConfig.sConfig.sHsuConfig.bDummyBytes = 0;
gHifConfig.sConfig.sHsuConfig.bEOF = 0;
gHifConfig.bTimeout = 0;
gHifConfig.eBufferType = E_BUFFER_FORMAT_FREE;
gHifConfig.bShortFrameLen = 0;
gHifConfig.bStoreErrData = 0;
gHifConfig.bHeaderSize = 0;
status = phhalHif_Init(
&gHifConfig,
(pphhalHif_Callback_t)Hif_UartErrorCallback
);
status = phhalHif_InitRxBuffer(
E_RX_BUFFER_ID0,
HIF_UART_RX_MAX_FRAME,
gHifRxBuffer,
(pphhalHif_Callback_t)Hif_UartRxCallback
);
gUartStream = xStreamBufferCreate(
HIF_UART_STREAM_SIZE,
1
);
}在我的实施过程中观察到的行为:
正确触发 RX 触发信号回调
成功接收命令
调用 TX 应用程序接口
但是,TX 完成回调不会持续触发
来自 main() 的连续传输未按预期完成
我的简化方案是
int main(void)
{
phFlashBoot_Main();
phhalTimer_Init();
phOsal_Init();
Hif_UartInit();
while(1)
{
LOG_TXT("sending....\n");
Hif_Print("hello");
phUser_Wait(10000000);
}
return 0;
}我还将其与 PN7462 phExDoorAccess 示例进行了比较。
以 DoorAccess 为例:
int main(void)
{
phFlashBoot_Main();
phhalTimer_Init();
phOsal_Init();
phExDoorAccess_SystemTaskInit();
phExDoorAccess_BootHandler();
phRtos_Start();
return 0;
}在 DoorAccess 中观察到的行为:
系统任务初始化
使用 phRtos_Start()启动实时操作系统调度程序
卡检测/验证后,主机接口上的 UART 传输正常工作
成功接收 TX 完成回调
但是,在我从 main () 持续触发传输的实现中,没有观察到 TX 完成回调。
我想了解一下:
除了 phhalHif_Init() 和 phhalHif_InitRxBuffer(),是否还需要额外的 HIF/HSU 配置?
HSU TX 回调是否需要明确注册或启用?
HSU TX 完成回调是否必须使用 phRtos_Start() / 调度器?
HIF 是否需要单独的 API 来在缓冲区初始化后启动 RX/TX 处理?
在 DoorAccess 示例(任务/事件/RTOS 上下文)中,是否存在启用 UART TX 完成处理的依赖关系?
是否存在成功调用传输 API 但未生成 TX 完整回调的已知情况?
如果缺少任何初始化序列或配置,请告诉我。
谢谢。
你好
感谢您的意见和分享参考资料。我将介绍 PN7462 UART 通信讨论以及 NFC 阅读器库中的 ex_phexhif 演示。
同时,我直接在 phExDoorAccess示例项目中直接进行了一次简单的 UART 周期性传输测试:
#include
int main(void)
{
phFlashBoot_Main();
phhalTimer_Init();
phOsal_Init();
/* Initialize HSU */
phExDoorAccess_Utils_HsuHifConfig();
while(1)
{
LOG_TXT("sending....\n");
phExDoorAccess_Utils_Fill_Tx_Buffer("hello nxp ");
phExDoorAccess_Utils_Hsu_Print(
gphExDoorAccess_Utils_SysHsuTxBuffer);
phUser_Wait(10000000);
}
return 0;
} 使用的传输应用程序接口是
void phExDoorAccess_Utils_Hsu_Print(uint8_t *inBuf)
{
#ifdef PHFL_ENABLE_HSU
phhalHif_Transmit(
(uint32_t *)inBuf,
(uint16_t)strlen((const char *)inBuf),
(pphhalHif_Callback_t)
&phExDoorAccess_Utils_HsuHifTransmitCallBack);
#endif
}观察:
能否请您解释一下,为什么在 主程序中的这种周期性 HSU 传输方法不起作用,而常规 DoorAccess 流程中的 UART 传输却正常运行的原因?我想了解 HSU TX 的完成是否取决于 RTOS/任务初始化、额外的 HIF 设置或其他所需的执行环境。
谢谢。
希望你一切顺利。
我正在核实您的询问。
在此期间,请您看一下PN7462 UART 通信这篇文章。也许你能在讨论中找到一些有用的提示,请告诉我你的发现。
另外,你有没有参考过 NFC读取器库中针对 PN7462 的 ex_phexhif 演示?
Eduardo。
您好,
我尝试了以下配置,并通过逻辑分析仪看到了输出结果:
gphExDoorAccess_Utils_HsuHifConfig.eInterface = E_HIF_HSU;
gphExDoorAccess_Utils_HsuHifConfig.sConfig.sHsuConfig.bBaudRate = E_HSU_BAUDRATE_9_6K;
gphExDoorAccess_Utils_HsuHifConfig.sConfig.sHsuConfig.bDummyBytes = 0;
gphExDoorAccess_Utils_HsuHifConfig.sConfig.sHsuConfig.bStopBits = 1;
gphExDoorAccess_Utils_HsuHifConfig.sConfig.sHsuConfig.bEOF = 0x8;
gphExDoorAccess_Utils_HsuHifConfig.bTimeout = 0x00;
gphExDoorAccess_Utils_HsuHifConfig.eBufferType = E_BUFFER_FORMAT_FREE;
gphExDoorAccess_Utils_HsuHifConfig.bShortFrameLen = 0;
gphExDoorAccess_Utils_HsuHifConfig.bStoreErrData = 0;
Eduardo。