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.

[参考译文] TMS320F28388S:TMS320F28388S SCIB 模块 — 使用 TI DriverLib 的 SCI_setConfig () 的奇偶校验问题

Guru**** 2434370 points
Other Parts Discussed in Thread: TMS320F28388S

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1524237/tms320f28388s-tms320f28388s-scib-module---parity-issue-with-sci_setconfig-using-ti-driverlib

器件型号:TMS320F28388S

工具/软件:

尊敬的 TI 支持团队:

我目前正在使用 TMS320F28388S 控制器、并面临 SCIB 模块中与奇偶校验相关的问题。

借助 TI DriverLib API、我使用以下命令配置了无奇偶校验的 SCIB 端口:

SCI_setConfig(SCIB_BASE, DEVICE_LSPCLK_FREQ, 9600, (SCI_CONFIG_WLEN_8 | SCI_CONFIG_STOP_ONE | SCI_CONFIG_PAR_NONE));

这会导致0x0007根据器件数据表将 SCICCR 寄存器正确设置为、其中指示 8 位字长、一个停止位和无奇偶校验。

然而、在使用 Modbus Poll 应用程序(配置为无奇偶校验)进行测试期间、MCU 会接收到损坏的数据。 有趣的是、当我将 Modbus Poll 应用程序切换到时 偶校验 、MCU 开始接收正确的数据—尽管 MCU 仍被配置为 无奇偶校验

为了验证此行为、我使用另一个 Modbus 工具 (ModScan) 进行了交叉检查、并使用逻辑分析仪捕获了通信。 结果在各种工具之间是一致的。

我附上:

  • rx_buffer显示在 MCU 端接收到的数据的快照。

  • SCICCR 寄存器值的快照。

  • 显示 UART 线路上实际数据的逻辑分析仪波形。



此问题阻止了我的 Modbus 通信设置、希望您能提供紧急支持和指导来解决此差异。

如果您需要其他信息、请告诉我。

此致、
Ramakrishna Panda.

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

    您好:

    我认为即使禁用奇偶校验、SCI 模块仍将发送并期望接收奇偶校验位。 无论设置如何、它将始终传输 11 位数据。 启用奇偶校验后、只会让传输的奇偶校验位有意义、并且也会对接收到的数据进行奇偶校验。 您的 Modbus 工具是否删除了其传输中的奇偶校验位?

    此致、

    Delaney

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

    尊敬的 Delaney:

    感谢您的答复。

    如所示 TMS320F28388S 数据表 、SCI 模块支持 无奇偶校验 配置。 此外、在逻辑分析仪的捕获结果中、我可以清楚地看到通过SCI_CONFIG_PAR_NONE设置、SCI 模块传输一个 10 位帧 (1 个开始位、8 个数据位、1 个停止位)、确认该位 无奇偶校验位 正在发送、但在接收端、它无法通过任何工具使用无奇偶校验帧进行读取。

    我附上了用于参考的波形捕获图。

    所有其他方案和测试组合(Modbus Poll、ModScan,不同的奇偶校验设置)已在我之前的邮件中详细说明。

    如果您需要更多信息、敬请告知。

    此致、
    Ramakrishna

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

    尊敬的 Ramakrishna:

    我看,我的道歉,我当时错了。

    MCU 接收到损坏的数据

    您能详细说明一下吗? SCI 寄存器中是否设置了 RXERROR 标志(中断检测,成帧错误,奇偶校验错误?)。 或者正在读取的数据是不正确的,如果是,如何 — 它似乎被移动了一位? 我看到您的屏幕截图显示 RXERROR 为 0、但这是在收到数据时吗?

    另外、您配置了什么波特率和 LSPCLK 频率?

    此致、

    Delaney

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

    尊敬的 Delaney:

    感谢您的跟进。

    正如我之前的邮件中所阐述的那样 RXERROR 标志(中断检测,成帧或奇偶校验错误) 未设置 —他们在接待期间保持清晰。 问题在于 数据本身不正确 、没有任何相关的错误标志。

    腐败似乎没有一致的模式。 但是、我一直观察到的一件事是 第一个字节 (0x0A) 正确接收数据、而 后续字节已损坏 、如rx_buffer之前共享的快照所示。

    要确认配置:

    • 波特率: 9600

    • LSPCLK 频率: 50MHz

    如果您需要我这边的任何其他捕获或测试、请告诉我

    此致、
    Ramakrishna  

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

    尊敬的 Ramakrishna:

    感谢您提供的信息。 您的波特率和 LSPCLK 组合应具有相对较低的已知误差 (.01%)、以便消除其中的任何问题。 您是否能够与我分享您的代码以及要发送的一系列值、以便我尝试重现此问题?

    此致、

    Delaney

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

    e2e.ti.com/.../sci_5F00_ex3_5F00_echoback.zip

    尊敬的 Delaney:

    感谢您的支持。

    我已经上传了 code.zip 根据要求。 您可以通过[0A 03 00 00 00 03 04 B0]从配置了的任何 Modbus 工具发送 Modbus 命令来测试此问题 无奇偶校验 。 我使用 Modbus 轮询和 Modscan 进行了测试。
    在 MCU 方面、接收到的数据将在中提供ucRXBuf[]

    为了提高调试可见性、我添加了一个缓冲区g_debug_flow.isr_bytes[]、您还可以在其中观察接收到的字节。

    您可以设置 eMBRTUReceive()函数内的断点 mbrtu.c、具体在上 首次if检查 、以跟踪接收期间的数据流。

    如果您需要其他任何内容来重现此问题、请告诉我。

    此致、
    Ramakrishna

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

    尊敬的 Ramakrishna:

    感谢您分享可重现的代码。 我还没有机会进行测试、但会在可以的时候回复。

    此致、

    Delaney

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

    尊敬的 Delaney:

    它的任何更新??

    此致、
    Ramakrishna

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

    Ramakrishna,

    该专家目前不在办公室、当他们返回时会回复您。 感谢您的耐心。

    此致、

    Aishwarya

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

    尊敬的 Aishwarya:

    感谢您的更新。

    是否有任何关于专家休假返回的信息? 或者、如果可能的话、可由另一位专家在这方面提供协助? 我们的发展目前因这个问题而陷入困境、我们将非常感谢及时的支持。

    期待您的答复。

    此致、
    Ramakrishna

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

    Ramakrishna,

    她将在本周晚些时候重新上台。 我们将尝试邀请另一位可以提供帮助的专家。

    此致、

    Aishwarya

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

    Ramakrishna,

    查看您提供的代码库,我注意到 xMBRTUReceiverveFSM () 函数中的以下注释:

    如果执行代码中指示的比较、您会看到什么行为?

    此致、
    Jason Osborn

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

    尊敬的 Jason:

    感谢您的回答。
    为了调试的目的,我添加了这些点.
    但在_rx_isr 中,字符没有正确接收,所有场景都在跟踪邮件中得到了完美的解释。

    在 MCU 方面、接收到的数据将在中提供 ucRXBuf[]

    为了提高调试可见性、我添加了一个缓冲区 g_debug_flow.isr_bytes[]、您还可以在其中观察接收到的字节。

    您可以设置   eMBRTUReceive() 函数内的断点   mbrtu.c、具体在上  首次 if 检查 、以跟踪接收期间的数据流。



    此致、
    Ramakrishna

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

    抱歉、我误解了您之前的观点。

    遗憾的是、我目前无法下载 ModBus 应用程序、但我能够进行简单的串行测试、并且无法复制此行为:在没有奇偶校验位的回显设置中、C2000 器件没有任何问题。 如果您有 C2000 EVM、您能否使用回显应用和简单的串行终端(例如内置 CCS 终端或 PuTTY)来验证回显行为?

    此致、
    Jason Osborn

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

    尊敬的 Jason:

    感谢您的答复。

    如果您注意到、我正在处理的项目名为sci_ex3_echoback、这与您所指的回显示例相同。 我已经完成了您提到的使用 CCS 终端和 PuTTY 的步骤。

    但是、我想强调的是、回显测试并不代表实际的 Modbus 通信。 在我的应用中、启用了 RX ISR 以进行单字符接收、并且涉及 Modbus 协议时序(1.5 字符帧间隙和 3.5 字符帧间隙)、因此使用 RXRDY 中断时会特别出现问题。

    如果我们能够关注这种具有 Modbus 时序和中断驱动的接收处理的实际场景、那将会很有帮助。

    希望这澄清了上下文。

    此致、
    Ramakrishna

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

    尊敬的 Ramakrishna:

    为了进行更新、我仍在努力在我的设置中复制此问题、并尝试熟悉您的代码和 Modbus 软件。 同时、从软件的角度来看、以下是一些建议:

    1. 我在代码中看到问题的一个潜在原因 prvvUARTRxISR()是: SCI_clearInterruptStatus(SCI_BASE_ADDR, SCI_INT_RXRDY_BRKDT);每次执行时都会调用、这将在每次 ISR 结束时对 SCI 模块进行软件复位。 这是我们软件驱动程序中的一个缺陷、我们在过去看到过这是导致问题的原因。 SCI_clearInterruptStatus()您能否从 ISR 中删除这一行或在代码中调用此函数之前添加一项检查、以便我知道这样是否解决了问题?
    2. 组帧错误标志可能指示 SCI 模块起始/停止位的同步丢失、但即使没有发出标志、也可能是这个问题、如您所见。 SCI 模块将在以下条件下发出此标志:“未找到预期的停止位时。 只检查第一个停止位。“ 如果每次字符传输之间有 1.5 位空闲时间、SCI 可能会将其误认为是停止位、因为它们都是逻辑高电平。 或者、如果传输中的最后一位为高电平、也可能会将其误认为是停止位。  
    3. 一条建议:通常、最佳实践是在最后一个初始化步骤中全局启用中断、看起来您的代码在配置 SCI 中断之前全局启用中断、这可能会导致一些意外行为。

    此致、

    Delaney

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

    尊敬的 Delaney:

    感谢您提供详细的更新和建议。

    关于您的第一点、您能否详细说明一下SCI_clearInterruptStatus()从 ISR 中删除这一行或手动进行清除“的建议? 具体来说、我应该在哪里执行手动清除? 它是在主循环中还是在触发 RX ISR 之后的某个位置?

    在第二点、只是为了确认—您是否观察到在设置中设置的组帧错误标志? 因为在我的例子中、测试期间没有出现错误标志。 不过、我会再次交叉验证、让您不断更新。

    至于第三点、我已经做了与全局中断使能时序相关的建议更改。

    在第 1 点确认了处理中断状态清除的理想方法后、我将进行更改并相应地分享所有结果。

    此致、
    Ramakrishna

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

    尊敬的 Ramakrishna:

    1.更确切地说、我的意思是添加一条 if 语句、在通过软件复位将其清除之前、检查是否实际设置了任何错误标志。 仍然可以在您拥有的 ISR 中完成此操作、只需确保添加 if 语句。 否则、驱动程序将对接收到的每个字符进行软件复位。 当 SCI 保持在复位状态时、无法接收数据、这意味着您可能会看到接收到的位丢失(因此数据不正确)。  

    if(SCI_getRxStatus(SCI_BASE_ADDR) & SCI_RXSTATUS_ERROR){
    
        SCI_clearInterruptStatus(SCI_BASE_ADDR, SCI_INT_RXRDY_BRKDT);
    
    }

    我已经修改了我先前的答复、以澄清这一点。  

    2.我看不到这一点;我只是集思广益,为什么 FE 标记没有设置 你的案例,因为通常如果收到不正确的数据,我们经常 看到 FE 在序列的某个时间点提出。 根据断点在 ISR 中的设置位置、还可能是软件复位在触发 FE 标志后立即清除该标志、这是您在观察窗口中看到的值。

    3.听起来不错。

    请告诉我、如果添加 IF 语句检查功能可以解决您的问题、因为我怀疑会这样做。  

    此致、

    Delaney

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

    尊敬的 Ramakrishna:

    请告诉我上述代码更改(请注意,我稍微更改了它)是否可以解决您的问题、如果可以、请支持该响应。

    此致、

    Delaney

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

    尊敬的 Delaney:

    您建议的更改解决了问题—谢谢您的支持。 我也会支持您的回答。

    然而、我有两个后续疑问:

    1. 如果SCI_clearInterruptStatus() ISR 内部是根本原因、为什么在我将 Modbus 轮询应用程序切换到偶校验(此时 MCU 仍配置无奇偶校验)时不会出现问题? 在这种情况下、MCU 开始接收正确的数据。 我很好奇、这种不匹配如何仍能实现正确接收。

    2. 如果在未BRKDT设置该位的情况下发生 RX 错误、则以下代码似乎无法按预期运行、因为未触发 RX ISR:

      if(SCI_getRxStatus(SCI_BASE_ADDR) & SCI_RXSTATUS_ERROR){
          SCI_clearInterruptStatus(SCI_BASE_ADDR, SCI_INT_RXRDY_BRKDT);
      }

      在这种情况下、可靠处理此类 RX 错误的最有效方法是什么?

    最后,只是为了确认—一旦我支持您的回答,这会自动关闭主题,还是我应该将其标记为单独解决?

    此致、
    Ramakrishna

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

    尊敬的 Ramakrishna:

    很高兴听到更改解决了问题。 以下是我对您其他问题的回答:

    1. 在这种情况下、Modbus 应用程序会发送一个额外的位、其中包含 MCU 不期望的每个帧(奇偶校验位)。 听起来额外的位时间足以让接收器正确地进行 SCI SWRESET 和恢复、以免丢失 Modbus 发送的任何有意义的位。 要确定此处发生的事情、需要知道 SCI 复位过程花费的时间过长、我认为这可能因模块的状态而异、因此很难判断。  
    2. RXERROR 中断可在与常规 SCIRX 中断相同的线路上启用。 您可以&要根据 if 语句中的 STATUS 寄存器进行检查的任何其他错误标志。 然后、如果启用、RXERROR 标志将触发同一 ISR 并进入 IF 条件。 对于 RXERRORS、我的建议如下:
      1. 它们仅用于开发/测试 — 通过选择较低的错误波特率/LSPCLK 组合、降低接收线路上的噪声或从发送器件发送字符间隙更大的数据、修改设置以避免这些错误。
      2. 另一种选择是实时处理它们。 为此、您必须向传输设备发回一条消息、告知其重新启动序列、因为已知传输数据已丢失。 这样、SCI SWRESET 无论如何都需要一些时间才能完成、这无关紧要。  

    在本例中、我会在 if 语句中添加一个 ESTOP0 或断点、只需确保在开发和测试代码时不会碰到它。 如果输入了 if 语句、则可以根据设置了哪些标志来诊断问题、并在实现中进行必要的修复。  

    支持投票将自动关闭该主题、但如果您在此之后发布其他问题、则该主题将重新打开。

    此致、

    Delaney