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.

[参考译文] CC1312R7:需要 UART2驱动程序详细信息。。

Guru**** 1807890 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1429575/cc1312r7-uart2-driver-details-needed

器件型号:CC1312R7

工具与软件:

我有一个基于 rfUARTbridge 示例的小型应用。 我一直在努力处理当更大的数据块需要时出现的错误

以多个 I/O 格式进行接收和转发

我基本上是在尝试传输 SLIP 数据包,并且由于 SLIP 通过"转出"对某些数据进行编码,因此生成的帧的大小是不同的

根据编码前的数据。

我已经运行滑移与小框架数天没有错误。 将大小增加到内部 UART 缓冲器以上时、UART2将不会全部接收

快照。 这取决于其他程序的活动情况。

我了解到 UART2驱动程序并不总是返回在"超时"之后收到的数据、即部分接收。

我以为我的程序中有一些模糊的错误、但试图跟踪它以不同的方式改变了行为。

最初、我可以 ping 通、速度略高于 UART 缓冲区大小。 通过重新排列代码、我现在拥有大约2.5个缓冲区的数据。

我观察到、问题"似乎是由另一个 UART 上的活动引起的。 共同的分母

是较高的阻止 IO 量、跳周代码与 TI 的原始示例一样以"回调"运行。

问题:

Q1如何计算"部分接收"超时? 我可以设置它吗? 这是一个好主意,但它的价值必须适应典型的用途。

Q2如果我怀疑"循环驱动器缓冲区"中有数据、为什么下一个接收不拾取数据?

Q3如何计算循环缓冲器的大小?

Q4任何其他建议、我需要接收"每个字节"、并需要对帧进行封包化、只要我不会错过

    传入数据时、数据包无需复杂的编程即可重新汇编。

Gullik

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gullik:

    您可以在 dev.ti.com 上找到我们 SDK 附带的驱动程序 API 的 Doxygen 文档、并且可以在线阅读所有不同的运行模式: https://dev.ti.com/tirex/explore/content/simplelink_cc13xx_cc26xx_sdk_7_41_00_17/docs/drivers/doxygen/html/_u_a_r_t2_8h.html

    在.syscfg 中配置 UART2时、还可以调整环形缓冲区大小。

    关于您的问题、很难在不看到所有代码更改的情况下进行调试、因为它们对于示例没有错误。  但在回调模式下、UART 不阻塞、因此可以在传输完成之前触发回调。  UART2_EVENT_TX_COMPLETED 事件指示传输完成。

    请对照驱动程序文档检查您的代码。

    此致、
    等等

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我一直在学习司机的讲解材料。 但是、我不清楚"超时"参数是什么

    用于部分输入的是、计算方式、是否随波特率等的变化而变化

    我不认为传输有问题、我认为有时我的代码会严格基于此

    在 rfUARTbridge 示例中、不知何故不会足够频繁地唤醒。

    我有一个短队列、具有4个全大小缓冲区(253字节)。 当 UART 接收时填充此字段

    被回调、但在回调函数之外、这与示例代码完全一样。

    我从不会在队列中遇到溢出(截至目前为止)

    当主循环中未发生任何情况(接收到 RF 或接收到 UART)时、会调用出队函数

    然后将数据传输到 UART。 这是一个穷人的把戏来分离不同的功能

    此示例。 这使多达538字节的数据包长、用于导通的是2个半缓冲区。

    如果 UART 中的数据包较大、整个数据包将被丢弃。 这通常是一个253字节的数据包

    并在转储中表现为"丢失的字节"。

    但我仍然不明白发生了什么(或没有发生)。

    Gullik

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gullik:

    默认示例不使用超时、而是使用 UART 读取和写入函数而不使用超时。 如果使用超时函数、用户可以指定它。 如驱动程序定义中所述:  
     *超时要等待的系统时钟节拍数
     *所有数据均已接收。 如果不是所有请求的数据
     *是在超时期间收到的,错误的
     *将返回 UART2_STATUS_ETIMEOUT。 减少
     *参数仅适用于#UART2_Mode_Blocking。

    很难遵循您的描述。 请回答以下问题:
    1.您对 rfUARTBridge 示例进行了哪些修改?
    2.请提供您想要实现的目标的结构化解释。 我知道您希望接收一个大型数据包并通过 UART 发送。 我的理解是否正确? 您能补充吗?
    3.在调试中运行时、代码在哪个部分发生故障? 您认为 UART 消息的某些部分被忽略。 您是否注意到、本示例中使用的 UART 处于回调模式、因此它不能保证整个消息都已发送。 如果要确保、您需要为其提供一些时间、使用阻塞模式或等待我之前提到的事件。

    请让我们了解一下结构、以便我可以帮助您获得所需的功能。

    谢谢!
    等等
     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Theo:

    也许我在描述问题不好。

    我已经在 rfUARTBridge 示例中添加了代码。 按照我的理解、使用 UART2驱动程序的做法是设置回调、并从未修改的示例中剪切 PARTIAL_READ (如所示)。

    /*通过回调读取模式初始化 UART */
    UART2_Params_init (&uartParams);
    uartParams.baudrate = 115200;
    uartParams.readMode = UART2_Mode_callback;
    uartParams.readCallback = ReceiveonUARTcallback;
    uartParams.readReturnMode = UART2_ReadReturnMode_partial;

    阅读文档,我得到的印象是,读要么终止

    读取调用中指定的字节数

    一个超时、在没有字符的短暂"空闲"期间之后返回缓冲区中的内容。

    因此、即使读取大小更长、您也可以输入单个字符并将其转发。

    我修改了添加以太网的代码、该以太网在第二个 UART 上是命令解释器、而且可以正常工作。 但是、原始转发代码如示例所示。

    我尝试使用 UART 桥接器进行滑动 IP 转发。 我设置了两台装有滑链的 Linux 机器

    建立虚短路。 如果数据包大小为 Belo 538字节(通过 ping 和 SLIP 转换在 Linux 中产生)、我可以通过 SLIP 链路 ping 24小时而不丢失数据包。

    当我从 UART 最多接收253个字节时、这不会像原来的示例那样直接发送到无线电、而是放置在一个4项长的队列中、带有读取指针和写入指针。

    这可以在溢出之前存储最多1012个字符。

    如果我增加 Linux ping 大小、从而使产生的跳周数据包超过538字节、那么我将不再接收所有字节。 正是 UART 接收有问题、因为我记录接收到的所有段大小、得到253,253、66等、不幸的是、这并不总是精确累加、因为转差会产生字符填充、因此根据发送到转差驱动器的数据、可以添加多个字符。 然而,这不会溢出我的队列,最坏的情况下,一个 SLIP 包最多可以是(原始大小*2)+ 2, 2标志和所有数据重复。 我需要达到576字节的 IP、因为这是最小数据包大小、IP 节点应接受以符合 IP 分段和重新装配要求。

    当我尝试较大的尺寸时、通常会丢弃整个253字节的缓冲区、因此滑动数据包不会正确重新汇编。

    我想实际上肯定缺少了一个完整的读取、因为回调是异步的并且与中断绑定、如果我在回调中发出读取、我应该确保捕获所有字符。

    现在,我的代码和示例在 main ()程序中都有读取功能,我们不知道回调发生时该程序在做什么。

    谢谢 theo、我想我必须移动该 UART2_read。

    它确实是有用的讨论问题,它迫使你重新思考整个事情。

    此致

    Gullik

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再次感谢 theo、

    现在一切都按预期运行、虽然这是一个非常基本的程序、

    我现在可以使用600字节的数据包执行 ping 操作。 只进行了修改以增加 UART 缓冲区矩阵

    采用2个最坏情况下的滑移数据包、并增加版本号。

    所以这个故事是合乎道德的:如果你使用回调,并阻止你的程序中的其他地方的 IO

    在回调中设置接收、否则您最终会面临数据丢失的风险。

    Gullik

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Gullik:

    很高兴我们的讨论有助于为您的计划找到有效的解决方案。

    此致、
    等等