如题, 现在需要做收发切换功能, 需要 tx 完成回调测试过tls_uart_tx_sent_callback_register () ; 和tls_uart_tx_callback_register () ; 都是发送完前 4 个字节就触发了, 不能使用
另外尝试使用 定时器 tls_timer_start () 发现设置时间与触发时间不一致, 如设置 300ns, 在 180ns 左右就会触发回调
查看更多
发送完成回调是调用 tls_uart_tx_sent_callback_register 来注册, 只有在发送完 tls_uart_write 设置的长度才会调用发送完成回调, 不会四字节就触发, 除非是只发送了四个字节. timer 的定时单位只能是 ms 和 us, 没有 ns.
发布 问题
分享 好友
手机 浏览
回到 顶部
逻辑分析仪截图:
初始化代码:
数据发送接口: tls_uart_write ()
@ggggjh
`
static s16 tx_callback (struct tls_uart_port *port)
{
}
static void test54 (void)
{
}`
@abcd
用你这段代码直接弄进去, 115200 下 2 字节在回调后输出
2000000 下有 14 字节在回调后输出
@ggggjh 驱动里, 是在把要发送的数据都放到硬件 fifo 里之后就认为发完了, 调用了发送完成回调. 硬件 fifo 里可能还有几个字节的缓冲没发. 如果想要硬件 fifo 里也空了再调用, 可以简单改下驱动代码, 可以等 fifo 空了在调用回调. 但这里只是 fifo 空了, 因为硬件中断没有完成标志, 只有 fifo 空的标志. 另外就是, 这样只是简单改了下, 只能是调用一次发送, 进一次完成中断回调, 再调用下一次发送. 如果不等发送完成中断回调被调用就连续多次调用发送接口, 可能就达不到预期效果.
在 tls_uart_tx_chars 里改动如下: