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.

[FAQ] [参考译文] [常见问题解答]我的 C2000 SCI 未正确发送和/或接收数据、如何解决此问题?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1031947/faq-my-c2000-sci-is-not-transmitting-and-or-receiving-data-correctly-how-do-i-fix-this

主题中讨论的其他器件:C2000WARESysConfig

当您遇到 SCI 模块在发送和接收时出现问题时、出现通信问题的主要原因有四个:

  1. 硬件问题
  2. 系统问题
  3. 配置问题
  4. 代码问题

您如何确定这四个问题中的哪一个是问题的根源、以及可以通过哪些纠正来解决此问题?

C2000培训视频:https://training.ti.com/search-catalog/field_language/ZH-CN?keywords=C2000&start%5Bdate%5D=&end%5Bdate%5D=

C2000培训小程序码

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

    1      简单调试提示

    在大多数情况下、跟踪问题根源(以及问题发生的原因)的最简单方法是使用示波器(逻辑分析仪)捕获器件的 SCI-TX 和 SCI-RX 引脚。

    这之所以如此有效、是因为它会立即排除/排除几个关键原因:

    1. 奇怪的波形行为立即表明了硬件问题。
    2. 配置和系统级问题很容易发现、因为一条线路可能正常工作、另一条线路可能无法正常工作。
    3. 缺少输出立即显而易见。
    4. 如果存在数据、但未在寄存器中接收到数据、则很容易跟踪代码问题。
    5. 存在数据但值错误的问题可以通过消除作为问题的代码(不良波形、不良数据)或配置(良好波形、不良数据)轻松地使用波形进行调试。

    因此、我强烈建议首先使用某种波形查看器件进行故障排除。 如果这不会立即使问题变得明显、则下一部分将介绍更深入的调试步骤。

    2      找到问题的根源

    观察到的实际问题是什么? 在以下列表中找到您的问题、然后使用提供的信息进一步调试。 注意:某些问题可能属于多个类别/问题描述、因此应使用所有章节中的相关信息进行调试。

    2.1    硬件问题症状和原因

    • 调试器无法正常工作(或根本无法正常工作)。
      • 原因:JTAG 连接问题。 有关解决 JTAG 和调试器相关问题的说明、请参阅 https://www.ti.com/lit/SPRACF0 以了解有关调试步骤的完整演示。
    • SCI-RX 引脚上的 SCI 波形不正确(不会恢复到高电平)。
      • 原因:SCI-TX 路径中的电路不正确(如果另一个非 C2000器件的软件/硬件在与电路隔离时被验证可以正常工作)。
        • SCI/UART 协议器件的 RX 引脚需要电路中的上拉电阻器、以便信号在不被驱动的情况下返回到逻辑高电平。 必须小心选择上拉电阻器、使其值不会过大(弱)、这样它就不会实际从另一个器件上拉三态输出或浮动输出。 弱上拉也可能易受噪声影响。 还必须选择上拉电阻器,使其不会太小(强),这样它不会阻止输出信号从另一个器件切换。 这个上拉电阻器的决定在很大程度上取决于应用,所以说“使用 X 电阻”并不总是正确的。 不过、10kOhm 通常足以开始在应用中测试哪些电阻起作用。 用户必须针对特定应用和预期的系统要求对其进行测试。
        • 还值得注意的是、下拉电阻器会对正常功能造成损害。 这就是为什么用于升压/降压逻辑电平的电阻分压器不能在 SCI-TX/RX 路径中使用的原因、因为即使是中等弱下拉电阻器的 GND 基准也会在不被驱动时始终将电压拉回到 GND。 这会导致标记 BRKDT 和系统中的其他错误。
    • 系统中其他器件的 SCI-TX 引脚或 RX 引脚上的 SCI 波形不正确(不会恢复为高电平)。
      • 原因:SCI-TX 路径中的电路不正确(如果已验证不是软件问题)。
        • 与 SCI-RX 引脚类似,SCI-TX 引脚期望另一个器件的 RX 引脚在另一端有一个上拉电阻器,用于抗噪和强制恢复至高逻辑电平。 如果缺少该上拉电阻器、则另一个器件可能无法恢复到适当的逻辑电平、并且将接收到不正确的信号。 请注意、当模块被启用时、C2000 SCI-TX 引脚将恢复至高逻辑电平、但是 C2000器件和其它器件之间的任何收发器在没有上拉电阻器的情况下都可能无法强制恢复至高电平。
        • 还值得注意的是、下拉电阻器会对正常功能造成损害。 这就是为什么用于升压/降压逻辑电平的电阻分压器不能在 SCI-TX/RX 路径中使用的原因、因为即使是中等弱下拉电阻器的 GND 基准也会在不被驱动时始终将电压拉回到 GND。 这会导致标记 BRKDT 和系统中的其他错误。
    • 在引脚上可以看到正确的数据、但其他器件根本没有接收到这些数据
      • 原因1:C2000器件缺少收发器:
        • 首先必须注意的是、与 PC (个人计算机)通信的任何 C2000器件都必须具有一个收发器、以便在 USB (PC)和 UART (C2000 SCI 模块)协议之间进行转换。 USB 和 UART 之间可能存在中间协议、例如 RS232。 无论如何,PC USB 信号必须转换为 UART 协议才能被 C2000器件的 SCI 模块(或任何其它 UART 器件)解释。 一些 C2000 LaunchPad 和 controlCARD 开发板具有连接到特定 GPIO/SCI 引脚的板载收发器。 通常、这些是 USB JTAG 调试仿真器内置的、但并非在所有 C2000器件上都可用。 请参阅特定开发板的用户指南(位于产品页面上),了解有关收发器是否内置到开发板中的详细信息。 在用户指南中搜索的关键字是“UART”、“COM 端口”或“SCI”。
      • 原因2:收发器电路不正确(假设存在收发器)。
        • 确保在 RX 引脚上提供上拉电阻器至关重要。 这适用于任何 C2000器件的 RX 引脚、也适用于系统中从收发器接收数据的任何其他 UART 协议器件。 这是因为某些收发器不会强制数据包之间的电压恢复为高电平。 这可能导致浮动电压、该电压行为可能不正确、在数据包之间保持低电平、或随环境中的噪声随机切换。 可以通过查看 C2000器件的 RX 引脚或系统中其他器件的 RX 引脚的波形来观察这一点。 在大多数情况下、必须在系统中所有 UART 协议器件的 RX 引脚上包含一个上拉电阻器。
    • 此器件或其他器件 SCI 模块中的一致 BRKDT (中断检测)错误。
      • 原因:SCI-RX/TX 路径中的电路不正确。
        • 对于此问题、上述任何(或所有)硬件问题都可能是导致此问题的根本原因。 有关调试推理的详细信息、请查看上述硬件问题。 此问题的根本原因总结是、SCI-RX 引脚上需要一个上拉电阻器来提供适当的恢复至高电平信号行为和抗噪性能。

    2.2    系统问题症状和原因

    • C2000器件或其他连接的器件随机标记 BRKDT (中断检测)错误。
      • 原因:如果在此 C2000器件中观察到 BRKDT (上述“硬件问题”部分中的任何问题均已解决),则这可能是系统中其它器件的软件中的问题。 在 C2000 SCI-RX 线路上放置一个示波器、观察是否存在大于9.625位宽的低电平信号。 如果发现这种情况、请更正另一个器件中正在传输到此 C2000器件的软件。 C2000器件的 SCI-RX 线路上的低电平信号宽度不应大于9.625位。
    • 在这个 C2000器件上接收到乱码/随机数据值(不是系统中的其它 SCI 器件)。
      • 原因1:另一台设备上的数据包或终端配置不正确。 另一个器件必须与该 C2000器件中的以下所有项匹配:
        • (1)波特率
        • (2)数据位数
        • (3)存在奇偶校验位
        • (4)停止位数
        • (5)“硬件”或“流量”控制=无(在某些系统中为 XON/XOFF)
      • 原因2:向该 C2000器件发送 ASCII 数据、但需要十六进制(反之亦然)。
        • 如果另一个器件向 C2000器件发送字符数据、则 C2000提供的示例和函数会将该数据存储为单独的字符。 例如,代码不会自动将接收到的字符数组“100”转换为整数100。 而是将其存储为三个字符:[“1”、“0”、“0”]。 必须使用 C 函数(如“strtol()”)从字符数组转换为整数。
    • 两个器件中的乱码/随机数据
      • 原因:配置设置不匹配。 另一个器件必须与该 C2000器件中的以下所有项匹配:
        • (1)波特率
        • (2)数据位数
        • (3)存在奇偶校验位
        • (4)停止位数
        • (5)“硬件”或“流量”控制=无(在某些系统中为 XON/XOFF)

    2.3    配置问题症状和原因

    • 在系统中的其他 SCI 器件(不是该 C2000器件)上接收到乱码/随机数据值。
      • 原因1:配置设置不匹配。 另一个器件必须与该 C2000器件中的以下所有项匹配:
        • (1)波特率
        • (2)数据位数
        • (3)存在奇偶校验位
        • (4)停止位数
        • (5)“硬件”或“流程”控制=无(在某些系统中为 XON/XOFF)
      • 原因2:缺少“_LAUNCHXL_F28XXXX”预定义符号。
        • 某些 C2000电路板需要预定义符号来正确设置器件上的时钟和其他配置设置。 请查看项目的“device.h”文件,并查看是否有任何使用上述预定义符号的#ifdef 行。
        • 如果存在类似“_LAUNCHXL_F28XXXX”的符号,而这正是您用于测试的电路板,则需要添加此预定义符号。
        • 在 CCS 中,右键单击正在使用的工程,然后选择 Properties→Build→C2000 Compiler→Predefined Symbol→然后选择加号按钮“add”符号。 为 device.h 文件中的特定器件添加给定的预定义符号(如“_LAUNCHXL_F280025C”)。
    • 在预期时间(或完全)中断未触发。
      • 原因1:多路复用不正确(如果根本不点火)。 必须正确配置 GPIO 多路复用器选项。
        • 尝试使用 SysConfig 工具(内置于新版本的 CCS 和 C2000Ware 中)配置 SCI 模块及其 PinMux 选项。 这提供了一个图形界面、可轻松配置引脚
        • 或者、确保在 driverlib 中正确设置以下内容:
          • 使用以下 driverlib 调用设置 RX 和 TX 引脚配置:
            • GPIO_setPinConfig (GPIO_17_SCIA_RX);
            • GPIO_setPinConfig (GPIO_16_SCIA_TX);
          • 或者、请确保使用您的代码正确设置以下内容:
            • 确保在 GPIO 配置中为使用的引脚启用了上拉电阻(在 GP@PUD 寄存器中)
            • 确保在 GPIO 配置中将使用的引脚的鉴定设置为仅异步输入(在 GP@QSEL#寄存器中)
            • 确保选择正确的 GPIO 多路复用器选项(在 GP@MUX#寄存器中)、以便 SCI-TX 和 RX 通过 GPIO
      • 原因2:ePIE 或 FIFO 配置不正确(如果不间歇性触发或完全触发)。
        • 尝试使用 SysConfig 工具(内置于新版本的 CCS 和 C2000Ware 中)快速设置中断和/或 FIFO 配置。
        • 或者、确保在初始化期间执行以下过程来配置 SCI 模块(按顺序执行这些操作):
          • 首先、确保禁用所有 SCI 中断
          • 接下来、清除所有 SCI 中断(RXFF、TXFF、FE、OE、PE、 RXERR、BRKDT、TXRDY)、方法是先清除并设置 SCI 的 CTL1.SWRESET 位、然后设置 SCI 的 FFTX.TXFFINTCLR 和 FFRX.RXFFINTCLR 位。
          • 接下来,通过设置 SCI 的 FFRX.RXFFOVRCLR 位来清除溢出状态位
          • 接下来、通过清除然后设置 FFTX.TXFIFORESET 来复位 RX 和 TX FIFO
          • 接下来、通过清除然后设置 FFTX.SCIRST 位来复位器件的 TX 和 RX 通道。
          • 接下来、为您的系统实际配置所有 SCI 设置、如波特率(SCIHBAUD+SCILBAUD 寄存器)、奇偶校验+数据长度+停止位(SCICCR 寄存器)。
          • 接下来、通过设置 CTL1.TXENA、CTLA.RXENA 和 CTL1.SWRESET 来启用模块。 这也会对 SCI 模块执行软件复位、以便为其运行做好准备。
          • 接下来、如果使用 FIFO、通过设置 FFTX.TXFFIL 和 FFRX.RXFFIL 字段中的级别来设置相应的 FIFO 中断级别。 必须选择 FIFO 深度、以便在 FIFO 溢出之前有足够的时间让中断处理数据请求。 对于较长的 SCI ISR、请确保足够早地中断、或将处理移出 ISR、并且仅在 SCI ISR 中进行数据移动(建议)。
          • 最后、如果使用 FIFO、通过设置 FFTX.SCIRST (如果未设置、尽管可以安全地再次设置)、FFTX.SCIFFENA、FFTX.TXFIFORESET 和 FFRX.RSFIFORESET 位来启用 FIFO。
          • 最后、通过设置 CTL1.TXENA、CTLA.RXENA 和 CTL1.SWRESET 位来再次启用模块。 这也会对 SCI 模块执行软件复位、以便为其运行做好准备。
      • 原因3:中断冲突或无法解决。
        • 当优先级较高的中断发生频率很高(或允许嵌套在 SCI ISR 内)时、它们可能会阻止 SCI 模块接收所有数据。 它们基本上可以通过具有更高优先级来“停止”SCI 中断,并且始终在 SCI 模块有机会启动之前进行。
          • 例如、如果 ADC 中断不断触发并中断 SCI ISR、SCI ISR 可能永远不会(或缓慢)到达其移动数据的部分。 如果缓冲区或 FIFO 在 SCI 移动数据之前填满、则可能导致数据丢失以及缓冲区或 FIFO 溢出。 这需要 ISR 之间进行仔细的交互、以便 ADC ISR (例如)和 SCI ISR 都不会占用处理时间。
        • 其他非嵌套中断也可能需要很长的时间才能完成、从而使 SCI 缓冲区/FIFO 填满并丢失额外的数据。 这种情况很少见、因为 SCI 传输时间通常比处理时间慢得多。 但其他 ISR 中有一些计算可能需要很长时间、因此在这些 ISR 中也必须小心。
    • 输出在 SCIA/B/C 上正常工作、但在 SCIC/B/A 上不能正常工作
      • 原因1:多路复用器配置不正确。
        • 尝试使用 SysConfig 工具(内置于新版本的 CCS 和 C2000Ware 中)配置 SCI 模块及其 PinMux 选项。 这提供了一个图形界面、可轻松配置引脚
        • 或者、确保在 driverlib 中正确设置以下内容:
          • 使用以下 driverlib 调用设置 RX 和 TX 引脚配置:
            • GPIO_setPinConfig (GPIO_17_SCIA_RX);
            • GPIO_setPinConfig (GPIO_16_SCIA_TX);
          • 或者、请确保使用您的代码正确设置以下内容:
            • 确保在 GPIO 配置中为使用的引脚启用了上拉电阻(在 GP@PUD 寄存器中)
            • 确保在 GPIO 配置中将使用的引脚的鉴定设置为仅异步输入(在 GP@QSEL#寄存器中)
            • 确保选择正确的 GPIO 多路复用器选项(在 GP@MUX#寄存器中)、以便 SCI-TX 和 RX 通过 GPIO
      • 原因2:ePIE 配置不正确(如果使用中断)。
        • 尝试使用 SysConfig 工具(内置于新版本的 CCS 和 C2000Ware 中)快速设置中断和/或 FIFO 配置。
        • 或者、确保在初始化期间执行以下过程来配置 SCI 模块(按顺序执行这些操作):
          • 首先、确保禁用所有 SCI 中断
          • 接下来、清除所有 SCI 中断(RXFF、TXFF、FE、OE、PE、 RXERR、BRKDT、TXRDY)、方法是先清除并设置 SCI 的 CTL1.SWRESET 位、然后设置 SCI 的 FFTX.TXFFINTCLR 和 FFRX.RXFFINTCLR 位。
          • 接下来,通过设置 SCI 的 FFRX.RXFFOVRCLR 位来清除溢出状态位
          • 接下来、通过清除然后设置 FFTX.TXFIFORESET 来复位 RX 和 TX FIFO
          • 接下来、通过清除然后设置 FFTX.SCIRST 位来复位器件的 TX 和 RX 通道。
          • 接下来、为您的系统实际配置所有 SCI 设置、如波特率(SCIHBAUD+SCILBAUD 寄存器)、奇偶校验+数据长度+停止位(SCICCR 寄存器)。
          • 接下来、通过设置 CTL1.TXENA、CTLA.RXENA 和 CTL1.SWRESET 来启用模块。 这也会对 SCI 模块执行软件复位、以便为其运行做好准备。
          • 接下来、如果使用 FIFO、通过设置 FFTX.TXFFIL 和 FFRX.RXFFIL 字段中的级别来设置相应的 FIFO 中断级别。 必须选择 FIFO 深度、以便在 FIFO 溢出之前有足够的时间让中断处理数据请求。 对于较长的 SCI ISR、请确保足够早地中断、或将处理移出 ISR、并且仅在 SCI ISR 中进行数据移动(建议)。
          • 最后、如果使用 FIFO、通过设置 FFTX.SCIRST (如果未设置、尽管可以安全地再次设置)、FFTX.SCIFFENA、FFTX.TXFIFORESET 和 FFRX.RSFIFORESET 位来启用 FIFO。
          • 最后、通过设置 CTL1.TXENA、CTLA.RXENA 和 CTL1.SWRESET 位来再次启用模块。 这也会对 SCI 模块执行软件复位、以便为其运行做好准备。
    • 回送示例工作正常、但在引脚上看不到输出。
      • 原因1:多路复用器配置不正确。
        • 尝试使用 SysConfig 工具(内置于新版本的 CCS 和 C2000Ware 中)配置 SCI 模块及其 PinMux 选项。 这提供了一个图形界面、可轻松配置引脚
        • 或者、确保在 driverlib 中正确设置以下内容:
          • 使用以下 driverlib 调用设置 RX 和 TX 引脚配置:
            • GPIO_setPinConfig (GPIO_17_SCIA_RX);
            • GPIO_setPinConfig (GPIO_16_SCIA_TX);
          • 或者、请确保使用您的代码正确设置以下内容:
            • 确保在 GPIO 配置中为使用的引脚启用了上拉电阻(在 GP@PUD 寄存器中)
            • 确保在 GPIO 配置中将使用的引脚的鉴定设置为仅异步输入(在 GP@QSEL#寄存器中)
            • 确保选择正确的 GPIO 多路复用器选项(在 GP@MUX#寄存器中)、以便 SCI-TX 和 RX 通过 GPIO
      • 原因2:ePIE 配置不正确(如果使用中断)。
        • 尝试使用 SysConfig 工具(内置于新版本的 CCS 和 C2000Ware 中)快速设置中断和/或 FIFO 配置。
        • 或者、确保在初始化期间执行以下过程来配置 SCI 模块(按顺序执行这些操作):
          • 首先、确保禁用所有 SCI 中断
          • 接下来、清除所有 SCI 中断(RXFF、TXFF、FE、OE、PE、 RXERR、BRKDT、TXRDY)、方法是先清除并设置 SCI 的 CTL1.SWRESET 位、然后设置 SCI 的 FFTX.TXFFINTCLR 和 FFRX.RXFFINTCLR 位。
          • 接下来,通过设置 SCI 的 FFRX.RXFFOVRCLR 位来清除溢出状态位
          • 接下来、通过清除然后设置 FFTX.TXFIFORESET 来复位 RX 和 TX FIFO
          • 接下来、通过清除然后设置 FFTX.SCIRST 位来复位器件的 TX 和 RX 通道。
          • 接下来、为您的系统实际配置所有 SCI 设置、如波特率(SCIHBAUD+SCILBAUD 寄存器)、奇偶校验+数据长度+停止位(SCICCR 寄存器)。
          • 接下来、通过设置 CTL1.TXENA、CTLA.RXENA 和 CTL1.SWRESET 来启用模块。 这也会对 SCI 模块执行软件复位、以便为其运行做好准备。
          • 接下来、如果使用 FIFO、通过设置 FFTX.TXFFIL 和 FFRX.RXFFIL 字段中的级别来设置相应的 FIFO 中断级别。 必须选择 FIFO 深度、以便在 FIFO 溢出之前有足够的时间让中断处理数据请求。 对于较长的 SCI ISR、请确保足够早地中断、或将处理移出 ISR、并且仅在 SCI ISR 中进行数据移动(建议)。
          • 最后、如果使用 FIFO、通过设置 FFTX.SCIRST (如果未设置、尽管可以安全地再次设置)、FFTX.SCIFFENA、FFTX.TXFIFORESET 和 FFRX.RSFIFORESET 位来启用 FIFO。
          • 最后、通过设置 CTL1.TXENA、CTLA.RXENA 和 CTL1.SWRESET 位来再次启用模块。 这也会对 SCI 模块执行软件复位、以便为其运行做好准备。

    2.4    代码问题症状和原因

    • 某些数据丢失(其余数据看起来正确)
      • 原因1:数据或中断溢出
        • 如果缓冲区(或 FIFO、如果使用)满后 SCI 中断不被处理、那么进入的任何额外数据都将丢失。 这会导致数据丢失。 解决方案是确保在下一组数据进入之前为缓冲区或 FIFO 提供足够的时间。 这同样的解决方案也适用于 SCI 轮询、其中不使用中断、因为在输入额外数据之前仍必须清空一个完整的缓冲区或 FIFO、以防止数据丢失。
      • 原因2:中断无法解决
        • 当优先级较高的中断发生频率很高(或允许嵌套在 SCI ISR 内)时、它们可能会阻止 SCI 模块接收所有数据。 它们基本上可以通过具有更高优先级来“停止”SCI 中断,并且始终在 SCI 模块有机会启动之前进行。
          • 例如、如果 ADC 中断不断触发并中断 SCI ISR、SCI ISR 可能永远不会(或缓慢)到达其移动数据的部分。 如果缓冲区或 FIFO 在 SCI 移动数据之前填满、则可能导致数据丢失以及缓冲区或 FIFO 溢出。 这需要 ISR 之间进行仔细的交互、以便 ADC ISR (例如)和 SCI ISR 都不会占用处理时间。
        • 其他非嵌套中断也可能需要很长的时间才能完成、从而使 SCI 缓冲区/FIFO 填满并丢失额外的数据。 这种情况很少见、因为 SCI 传输时间通常比处理时间慢得多。 但其他 ISR 中有一些计算可能需要很长时间、因此在这些 ISR 中也必须小心。