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.

[参考译文] TMS320F28377S:SCIA 接收到损坏的数据

Guru**** 2484615 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/732017/tms320f28377s-scia-receives-corrupted-data

器件型号:TMS320F28377S

大家好、

我在以波特率115200运行的 FIFO 模式下使用 SCI-A、具有1级(在 FIFO 中接收到1个字节将生成中断)。 它连接到 SCI-A TX 命令的电机、并在 SCI-A RX 上发送反馈。

  • 当通过使能命令启用电机时,它将反馈 OK[CR][LF]。
  • 当命令电机以特定速度移动时,它开始旋转,然后再次反馈 OK[CR][LF]。

对于调试、我同时使用:

  1. 示波器
  2. 将反馈发送到串行终端。

示波器和串行终端似乎都显示来自电机的反馈数据是准确的。

但是、即使  字节数正确、MCU RX 也会接收到损坏的反馈。

以下是代码段:

RX 引脚上的示波器图像:

串行终端显示从电机接收到"确定"。 但是、rDataA 的前4个字节应该为0x4F ('O') 0x4B ('K) 0x0D (CR) 0x0A (LF)。 但我正在接收0x808F、0x00A7、0x808D、0x0086。

我正在使用其他具有类似设置的 SCI 来接收两个传感器数据、这些 SCI 从传感器正确接收数据。

我的代码中可能缺少某些内容、我需要一些帮助才能理解这些内容。

当示波器和串行终端显示接收到的正确数据 与 MCU SCIA-RX 共享时、我感到有点惊讶。 这意味着 SCIA-RX 和 FIFO 初始化可能会有一些问题。 但是、当我将同一代码连接到其中一个传感器时、代码工作正常。 MCU SCI-A RX 引脚上正确接收传感器的数据输出、显示我的初始化设置正确。  

因此,我假设我忽略了一些我无法弄清楚的重要问题。

下面是用于 SCI-A 初始化和 ISR 的代码(系统时钟为50MHz、LSPCLK 为12.5MHz):

void scia_init()

//
//注:时钟被打开到 Scia 外设
//在 InitSysCtrl()函数中
//

SciaRegs.SCICCR.all = 0x0007;// 1停止位,无回路
//无奇偶校验,8个字符位,
//异步模式,空闲线协议
SciaRegs.SCICTL1.all = 0x0003;//启用 TX、RX、内部 SCICLK、
//禁用 RX ERR、睡眠、TXWAKE
SciaRegs.SCICTL2.all = 0x0003;
SciaRegs.SCICTL2.bit.TXINTENA=1;
SciaRegs.SCICTL2.bit.RXBKINTENA=1;

//BRR = LSPCLK /(SCI 异步波特* 8)- 1.
SciaRegs.SCIHBAUD.ALL = 0x0000;//对于在 SYSCLK 50MHz 和 LSPCLK 12.5MHz 上的19200波特率
SciaRegs.SCILBAUD.ALL = 0x000D;//对于19200波特率、SYSCLK 为50MHz、LSPCLK 为12.5MHz FSS 为115200
// SciaRegs.SCILBAUD.ALL = 0x001B;//对于在 SYSCLK 50MHz 和 LSPCLK 12.5MHz RW 57600上的19200波特率

SciaRegs.SCICTL1.all = 0x0023;//从复位中撤回 SCI

//
// Scia_fifo_init -初始化 SCI FIFO
//
void scia_fifo_init()

SciaRegs.SCIFFTX.all = 0xC000;
SciaRegs.SCIFFRX.ALL = 0x0021;
SciaRegs.SCIFFCT.all = 0x00;

// SciaRegs.SCICTL1.all = 0x0023;//从复位中撤回 SCI
SciaRegs.SCIFFTX.bit.TXFIFORESET = 1;
SciaRegs.SCIFFRX.bit.RXFIFORESET = 1;

//
// sciaTxFifoIsr - SCIA 发送 FIFO ISR
//
中断空 sciaTxFifoIsr (空)

SciaRegs.SCIFFTX.bit.TXFFINTCLR=1;//清除 SCI 中断标志
PieCtrlRegs.PIEACX.All|=PIEACK_group9;//发出 PIE ACK

//
// sciaRxFifoIsr - SCIA 接收 FIFO ISR
//
中断空 sciaRxFifoIsr (空)

uint16_t i;

对于(I = 0;I < SciaRegs.SCIFFRX.bit.RXFFST;I++)

rDataA[rDataSizeA]= SciaRegs.SCIRXBUF.ALL;
rDataSizeA++;

SciaRegs.SCIFFRX.bit.RXFFOVRCLR=1;//清除溢出标志
SciaRegs.SCIFFRX.bit.RXFFINTCLR=1;//清除中断标志

PieCtrlRegs.PIEACX.All|=PIEACK_group9;//发出 PIE ACK

空 UART_Init()

scia_fifo_init();
scia_init();

谢谢、此致、

Ankit

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

    请在此硬件上尝试 sci_echoback 示例。
    我可以注意到、与该示例相比、已经进行了许多更改。

    您可以根据您的设置更改示例、并检查其是否损坏。

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

    您好 Katta、

    我使用了 sci_echoback 示例并修改了代码以满足我的目的。

    我在3种情况下完成了测试:

    • 案例1:使用115200波特率的 PC 串行终端、而不是电机反馈、将数据发送到微控制器的 SCIA RX。
    • CASE2: 将电机配置为115200波特率、并将数据反馈到微控制器的 SCIA RX。
    • 案例3:将电机配置为57600和更低的波特率、并将数据反馈到微控制器的 SCIA RX。

    对于 Case1、修改后的示例代码能够正确接收任何类型的字符串或字节。

    对于 CASE2、我遇到了组帧错误、其中一些时间和接收到的字节数是正确的、但内容看起来像垃圾。 但是、电机反馈的波形看起来合适、我的示波器能够正确解码波形(使用总线功能、RS232设置为115200波特率)。 此外、如果我尝试在串行终端上打印、串行终端也会正确打印它。

    对于案例3、我将正确接收电机反馈。

    1. 我可以研究哪些领域来解决此问题? 请查找随附的代码。
    2. 我注意到的另一个奇怪的行为(我的代码中不存在)是、当我将 FIFO 水平设置为4时、我 在接收到两个字节后获得中断。 如果我设置为8、则在接收4个字节后接收中断。 不知道行为的原因。

    谢谢、此致、

    Ankit

    e2e.ti.com/.../Example_5F00_2837xSSci_5F00_Echoback.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题似乎是波特率不匹配。
    对于情况1:115200波特率、系统时钟为50MHz、LSPCLK 为12.5MHz (我的实际代码、而不是示例代码)具有较高的波特率误差。
    使用 USB 转 RS232电缆的 PC 串行终端可以容忍波特率不匹配(可能是因为 USB)。
    但是、使用 RS232电缆并连接 COM1 (RS232端口)、我们意识到它无法容忍波特率不匹配。

    我将系统时钟更改为48MHz 以最大限度地减小误差、并将电机固定为 MCU SCI 接口。

    谢谢、此致、
    Ankit