我们正在运行 AM3358的定制板上开发应用。 我们使用的是 SYS/BIOS 6.75.2、AM335x PDK 1.0.16和 CCS8。
我们将使用 SYS/BIOS UART 驱动程序通过 UART 发送150个字节。 UART 在回调模式下打开。 但是、当最后一个数据块写入 FIFO 时、而不是 TX 完成时、我们会得到写回调。 我需要知道 TX 何时完成。 是否有办法配置 UART、以便在发送完所有数据后通知应用程序? 如果没有、是否有方法轮询 FIFO 以确定何时为空?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我们正在运行 AM3358的定制板上开发应用。 我们使用的是 SYS/BIOS 6.75.2、AM335x PDK 1.0.16和 CCS8。
我们将使用 SYS/BIOS UART 驱动程序通过 UART 发送150个字节。 UART 在回调模式下打开。 但是、当最后一个数据块写入 FIFO 时、而不是 TX 完成时、我们会得到写回调。 我需要知道 TX 何时完成。 是否有办法配置 UART、以便在发送完所有数据后通知应用程序? 如果没有、是否有方法轮询 FIFO 以确定何时为空?
您好!
查看 AM335x TRM 中的表19-11:
https://www.ti.com/lit/ug/spruh73q/spruh73q.pdf
此外、请查看 PDK 中的 UART_TestExample。 有关如何构建的说明可在此处找到:
具体而言、请查看 PDK 中 UART_v1.h 中的 UART_HWAttrs 结构。
请看一下 UART-socGetInitCfg 和 UART_socSetInitCfg 函数
谢谢、
最大
尊敬的 Max:
您提供的信息是 UART 的基本设置和使用。 我们已经对其进行了运行和配置。 表19-11显示了支持的中断。 您可以看到、RHR 和 THR 是唯一涉及数据缓冲/发送的两个。 当启用 FIFO 时、它们都在超过阈值时触发。 这两个中断都由驱动程序处理。 驱动程序 GET 是中断、并将数据读取或写入 FIFO (取决于 TX 或 RX)。 驱动程序在应用程序中调用写入完成回调、并在最后一个数据块写入 FIFO 时执行此操作、而不是在 TX 完成时执行此操作。
为简单起见、现在让我们忽略阈值电平。 FIFO 为64字节。 数据为150字节。 当写入开始时、驱动程序将前64个字节写入 FIFO、UART 开始向外发送数据。 然后、当 UART 需要 FIFO 中的更多数据时、驱动程序将获得中断。 第二个64字节被写入 FIFO。 UART 将数据写入输出并向驱动程序发送另一个中断。 驱动程序将最后22个字节写入 FIFO、并立即在应用程序中调用写回调。 因此、该应用程序会获得写入完成回调、但仍有22个字节的 FIFO 被发送出去。
我不相信驱动程序或芯片在启用 FIFO 时 TX 完成时提供中断。 那么、我的问题是、从我们的应用程序中、如何判断所有数据何时发送?
尊敬的 Max:
已经将近2周了。 有任何有关此内容的信息吗?
同时、我可以告诉您我尝试了什么。 根据 TRM (第19.51.19节)、LSR_UART 寄存器的 TXSRE 字段定义如下:
0h =发送器保持(TX FIFO)和移位寄存器不为空。
1h =发送器保持(TX FIFO)和移位寄存器为空。
我实施了一个计时器、该计时器将在 TX 结束之前触发。 I LOOP、检查该寄存器字段、直到它为1。
当在示波器上观察到这一点时、寄存器字段在数据在线路上发送完成之前从7-14us 的任何位置变为1。 因此、FIIFO/移位寄存器和导线之间有一些东西。 我需要知道数据 TX 何时完成(在线)。
谢谢
肖恩