您好,
我目前正在研究 S32K344 的 UART。我们使用该芯片的UART0/UART1/UART8,每个UART都连接到一个RS485芯片,并将A/B引脚引出至外部电路。我将UART1的RS485接口的A引脚连接到UART8的RS485接口的A引脚,并将UART1的RS485接口的B引脚连接到UART8的RS485接口的B引脚。 我将UART1 RS485的DE/RE设置为1,将UART8 RS485的DE/RE设置为0。我尝试将数据从 UART1 发送至 UART8,并在示波器上观察到 LPUART1_TX 和 LPUART8_RX 信号线上有波形。这意味着,数据已从UART1发送至UART8。但 UART8 中没有 rx 中断,因此 uart8 的 rx 处理程序无法运行。在调试过程中,我可以看到 UART8 CTRL 的 RE=1/RIE=1,但 STAT 的 RDRF=0。我将发送端口切换为UART8,接收端口切换为UART1,但现象依然如故。您能帮忙查一下问题出在哪里吗?我将该项目附上。谢谢。
嗨,胡利安,
谢谢您的答复。是的,其他中断,例如 CAN、PIT 都没有问题。现在我已将回调函数中的所有代码注释掉(这意味着发送和接收中断都不会在回调中执行接收函数),但代码仍然无法脱离检查接收器状态的循环,也无法使 RDRF 标志被设置(参见 interrupt.png 中的红色矩形)。我没有使用 Rx FIFO,因此,当接收到数据时,RDRF 应该变为 1。但事实并非如此。我通过UART1发送字符'R'(ASCII=0x01010010)和'Q'(ASCII=0x01010001),并测量了UART1的TXD和UART8的RXD,波形看起来是正确的。还有其他可能导致此问题的原因吗?
我同时附上了我的 SDK 版本。
嗨,@Jimmybai,
我想其他中断应该都能正常工作吧?(PIT、CAN 等)。你是否在回调函数中设置了断点,以确认中断是否触发?
从你的代码中我可以看出你同时使用了 LPUART_UART_IP_SyncreCeive & LPUART_UART_IP_Asyncreceiv e lpuart_UART_IP_ Asyncreceive。SyncreCeive 使用轮询,而 AsyncreCeive 功能则支持接收并立即退出功能。应用程序必须获得接收状态才能知道何时完成接收。接收完成后(已定义的接收字节数), 您需要再次调用 AsyncreCeive 以开始 新的接收。
不过,在回调函数内部,不要再次调用 AsyncReceive,而应使用 Lpuart_Uart_Ip_SyncReceive 函数进行阻塞式接收。你永远不会重新布防 UART 的接收。
我们社区里有一些例子,你可以参考一下:
致以最诚挚的问候,
Julián
我不知道为什么我的附件不见了。将其重新安装。
嗨,朱利安,
我找到了根本原因。下面的代码中,异步接收代码应该放在异步发送代码之前。因为UART传输速度非常快,发送完成后,数据就已经发送到接收总线了。此时,当您开始接收器接收程序时,总线上的数据信号已经消失。所以,我们需要启用接收器,当数据信号到来时,接收器才能工作。我们只需要检查接收器的接收中断信号即可。感谢您帮忙分析我的代码。
Jimmybai_0-1781766992780.png