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.

[参考译文] TL16C752D:大块数据传输的 UART ISR 问题

Guru**** 2392095 points


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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/797000/tl16c752d-uart-isr-problem-with-large-block-data-transmission

器件型号:TL16C752D

不确定这是否会影响到 Bobby。 如果是、您好、Bobby 好久不见了。

无论如何、我现在尝试将 INTA 用于我的 TX/RX ISR。 对于两个处理器之间传输的40字节命令/响应数据、一切都运行良好。

我遇到的问题是大块数据(292字节响应数据包)。 这需要四个60字节块和一个52字节块。

当我设置485LG 位并开始传输292字节数据包时、我无法使数据流正常工作。

我的问题是:

是否应继续设置 THR Space Available Interrupt?

准备发送292个字节时、我将使用以下设置:

  • TLR 值设置为0x0F (60字节 Tx FIFO)
  • 485LG 位设置为1
  • 485EN 位设置为1
  • RCVEN 位设置为1
  • RHR 中断被启用
  • THR 中断被启用
  • IRQA 已启用

在 ISR 内部、我执行以下操作:

  • 读取 IIR
  • switch 语句用于活动中断
  • RHR 中断读取请求数据包并生成响应数据包(在本例中为292字节)
  • 一旦生成响应数据包、THR 中断就会被启用
  • 在 THR 情况下、发送一个字节并重新启用 THR 中断、直到完成292个字节
  • 完成后、禁用 THR 中断
  • 接收下一个请求并再次生成响应。

我是否需要将传输实际分解为四个60字节块和最后的52字节块?

准备好52字节块时、我是否需要将485LG 位设置为0?

感谢您的帮助、

Reif Heck

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

    有人?????

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

    您好、如果


    "当我设置485LG 位并开始传输292字节数据包时、我无法使数据流正常工作。"
    您是否能够详细说明发生了什么情况? 故障从哪里开始? 您是否能够看到串行线路上显示的数据? 在前60个字节之后、您是否会卡住?

    "是否应继续设置 THR Space Available Interrupt?"
    由于您是如何初始化器件的、TLR 寄存器将设置 THR 空应在哪个点切换的触发点。 TLR 寄存器本质上类似于 FCR 的触发电平、但它使用4位而不是2位。 粒度为4意味着您可以将 TLR 实际更改为52、方法是将 TLR 设置为十六进制的13 (13*4=52)、这将是0x0D。 (您可以对最后一个数据包执行此操作)。

    "在 THR 案例内部、发送一个字节并重新启用 THR 中断、直到完成292个字节
    完成后、禁用 THR 中断
    接收下一个请求并再次生成响应。"
    由于您设置了 TLR、THR INT 将在您超过触发电平(在您的情况下为60字节)后才会触发。 因此、对于最后的52个字节、如果要在 FIFO 中填充52个字节的数据时触发 INT、则应将 TLR 设置为0x0D。

    "当准备好处理52字节块时、我是否需要将485LG 位设置为0?"
    您不必这样做、但我不确定。

    谢谢、
    -Bobby

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

    很高兴再次听到您的声音! 我以为是你;~)

    我最终不得不使用连接到我的微控制器上可用中断引脚的 INTA。

    它实际上能够很好地处理短数据包(39字节)。 我只看到292字节数据包存在问题。

    我可以发送相当多的292字节数据包(主要是36个数据包、有时是72个)、而无需执行任何操作。 我有一个函数、用于计算要发送的60字节块的数量并计算剩余的字节(在本例中为52字节)。

    问题发生在最后一个正在传输的数据包上。 传输被切断并发送数据包的最后42个字节。

    我在 ISR 中使用的步骤如下:
    案例 RX 超时:
    接收和验证请求数据包
    创建响应数据包并获取响应长度
    禁用 RHR 中断
    启用 THR 中断
    可用的案例 TX 空间:
    发送字节
    检查索引是否=响应长度
    否则、重新启用 THR 中断
    如果是、则禁用 THR 中断并重新启用 RHR 中断

    我不确定设置485LG = 0或1是否有任何效果。

    我感到困惑的是如何判断我是否必须发送最后52个字节。

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

    "问题发生在传输的最后一个数据包上。 传输被切断并发送数据包的最后42个字节。"
    您是否说您实际上丢失了前10个字节的数据? (它们没有通过串行线路(TXA))?

    "发送字节
    检查索引是否=响应长度
    否则、重新启用 THR 中断
    如果是、请禁用 THR 中断并重新启用 RHR 中断"
    这听起来好像您没有实际使用 TLR、因为您正在禁用 THR int 并重新启用它

    我想知道您的问题是否是您试图以太快的速度计时数据。 将数据写入 THR 的时间差是多少? (您的时钟速度和波特率也是多少)

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

    重新启动此主题、我必须为此道歉。

    我的问题与 ISR 完全无关。

    问题是、在主工作循环中、我每350 uSecs 读取一次 ADC 样本、并将其写入环形缓冲器。

    每当我在 ISR 中收到对大数据包数据的请求时、我都会验证请求包、然后生成大数据包响应。 这包括从环形缓冲器中抓取 ADC 数据。 如果我调谐振铃缓冲器的读数、则所有内容都按通告工作、并且不会影响大数据包传输。

    所以我看到了错误的地方。 我的逻辑分析仪向我展示了问题所在。

    总之、很抱歉耽误您的时间。

    谢谢您的观看。

    我们可以关闭它。

    谢谢 Bobby、
    参考