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.

[参考译文] 当发送数据时、SCI (RX 缓冲器)崩溃、并设置为0、其波特率与控制器中定义的波特率不同

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1199156/sci-rx-buffer-crashes-and-set-to-0-when-sending-data-with-a-different-baudrate-as-defined-in-the-controller

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

大家好、

我正在使用 TMS320F28055微控制器。
我的 UART 通信有问题。
我已将 UART 波特率配置为9600、一切运行良好、RX 缓冲器接收一切、中断也被启用。

如果我通过我的 PC (波特率9600)将数据发送到控制器、那么一切都运行得很好。

例如、一旦我将 PC 的波特率设置为1200并发送几次、控制器的 RX 缓冲区就会崩溃、并且其中有0。

如果我将波特率设置回9600、控制器将必须再次接收所有数据。 但是缓冲区仍然只有0、并且他不再接收任何内容。

是否有人知道如何解决此问题、以便即使以不正确的波特率发送数据、RX 缓冲区也不会崩溃。

感谢你的帮助。

void init_RS232()
{

    SciaRegs.SCICCR.all = 0b00000111; //0x0007;     // 1 stop bit,  No loopback
                                      // No parity, 8 char bits,
                                      // async mode, idle-line protocol
    SciaRegs.SCICTL1.all = 0x0003;   // enable TX, RX, internal SCICLK,
                                     // Disable RX ERR, SLEEP, TXWAKE
    SciaRegs.SCICTL2.all = 0x0003;
    SciaRegs.SCICTL2.bit.TXINTENA = 0;
    SciaRegs.SCICTL2.bit.RXBKINTENA = 1;

    SciaRegs.SCIHBAUD = 0x0000;  // 9600 baud @LSPCLK = 15MHz(60 MHz SYSCLK)
    SciaRegs.SCILBAUD = 0x00C2;

    SciaRegs.SCICTL1.all = 0x0023;  // Relinquish SCI from Reset

    EALLOW;
    PieVectTable.SCIRXINTA = &Interrupt_SCIa_parameterizationPORT_Isr;
    EDIS;

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block
    PieCtrlRegs.PIEIER9.bit.INTx1 = 1;     // PIE Group 9, INT1
    IER = 0x101;
    EINT;
}






void
InitSciaGpio()
{
   EALLOW;

//
// Enable internal pull-up for the selected pins
// Pull-ups can be enabled or disabled disabled by the user.
// This will enable the pullups for the specified pins.
//
    GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0; // Enable pull-up for GPIO28 (SCIRXDA)
//  GpioCtrlRegs.GPAPUD.bit.GPIO7 = 0;   // Enable pull-up for GPIO7 (SCIRXDA)

    GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0; // Enable pull-up for GPIO29 (SCITXDA)
//  GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0;  // Enable pull-up for GPIO12 (SCITXDA)

//
// Set qualification for selected pins to asynch only
// Inputs are synchronized to SYSCLKOUT by default.
// This will select asynch (no qualification) for the selected pins.
//
    GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;  // Asynch input GPIO28 (SCIRXDA)
//  GpioCtrlRegs.GPAQSEL1.bit.GPIO7 = 3;   // Asynch input GPIO7 (SCIRXDA)

//
// Configure SCI-A pins using GPIO regs
// This specifies which of the possible GPIO pins will be SCI functional pins.
//
    GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;    // Configure GPIO28 for SCIRXDA
//  GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 2;     // Configure GPIO7 for SCIRXDA
    GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;    // Configure GPIO29 for SCITXDA
//  GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2;    // Configure GPIO12 for SCITXDA

    EDIS;
}

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

    Markus、您好!

    由于发送器的波特率较低、您可能会从数据线被拉低太长时间获得中断检测。 当一个中断检测发生时、您必须通过清零 SWRESET 位来复位 SCI 模块。 SCI 控制1寄存器中描述了此功能。 您应该能够在 RX 中断期间检查中断检测位是否被置位并相应地复位 SCI 模块。 如果您对如何执行此操作有任何疑问、请告诉我。

    谢谢、

    Luke

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

    您好、luke、
    感谢您的帮助、我解决了这个问题

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

    Markus、您好!

    很高兴知道这解决了您的问题、我将关闭此主题。