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.

[参考译文] TMS320F28379D:更改运行时的 SCI 波特率

Guru**** 2589265 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/661445/tms320f28379d-change-sci-baud-rate-in-run-time

器件型号:TMS320F28379D

大家好、

我正在尝试在运行时使用 Chang sci 波特率。  我使用以下函数来初始化 sci 缓冲区并设置 scib 波特率。

我尝试使用同一函数将波特率重置为运行时的其他数字。 它似乎可以成功几次、那么 UART 永远不会从 PC 接收任何内容。  

我们将感谢您的任何建议或帮助。 谢谢

scib_ini (uint16_t sciLbaud){

SCIFFTX.ALL = 0xE040;
ScibRegs.SCIFFRX.ALL = 0x2044;
ScibRegs.SCIFFCT.all = 0x0;

////------------
ScibRegs.SCICCR.all =0x0007;
//启用 TX、RX、内部 SCICLK、禁用 RX ERR、睡眠、 TXWAKE
//
ScibRegs.SCICTL1.all =0x0003;
ScibRegs.SCICTL2.bit.TXINTENA=1;
// ScibRegs.SCICTL2.bit.RXBKINTENA=1;
// 115200波特@LSPCLK = 22.5MHz (90MHz SYSCLK)
//@LSPCLK = 50MHz (200MHz SYSCLK) HBAUD = 0x02且 LBAUD = 0x8B。
//
ScibRegs.SCIHBAUD.ALL =0x0000;
ScibRegs.SCILBAUD.ALL = sciLbaud;//// 53 for 115200
ScibRegs.SCICTL1.all =0x0023;//从复位中撤回 SCI

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

    是否设置了任何错误标志? 有一个全局 RX 错误标志"SCIRXST.RXERROR"、它是 RX 错误的一个或多种类型(标志在同一个寄存器中):BRKDT、FE、OE 和 PE。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Devin、  

    我是 F28x 的新手。

    我将尝试在 CCS 中签入该标志。  如何复位这些标志?

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

    我建议使用我们提供的 SCI 初始化函数。 为了正确配置 SCI、SCI 对于位应该被置位的顺序非常特别。

    此致、
    SASL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Sal、
    我可以第一次成功初始化 sci、但尝试将 sci 重新初始化到另一个波特率时失败。 我还应该为该任务做什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    另一个观察结果:当波特率设置为小于前一个波特率时、它始终成功、但当尝试将波特率设置为更高时失败。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您尝试设置哪些波特率?

    如果复位 SCI 并重新初始化它不起作用、那么您可以尝试通过以下方法来解决此问题:1)禁用外设时钟2)重新启用外设时钟3)为您所需的波特率初始化 SCI。

    希望这对您有所帮助。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Sal、欣赏您的重播。
    '...正在重置 SCI 并重新初始化它...' 您能解释一下。 我可以使用什么函数来复位 SCI
    我尝试设置115200和1.25M。

    目前,我使用以下代码:

    开关(temp1){
    案例1:
    // scidRegs.SCICTL1.bit.SWRESET = 0;
    // scid_fifo_init();
    SCID_INIT_ITH_BAUD_SET (53);//115200
    scidRegs.SCICTL1.bit.SWRESET = 0;
    scidRegs.SCICTL1.bit.SWRESET = 1;

    中断;
    情况12:
    // scidRegs.SCICTL1.bit.SWRESET = 0;
    // scid_fifo_init();
    SCID_INIT_ITH_BAUD_SET (4);//1.25Msps
    scidRegs.SCICTL1.bit.SWRESET = 0;
    scidRegs.SCICTL1.bit.SWRESET = 1;

    中断;


    scID_init_wo_baud _set (uint16_t sciLbaud){
    SCIFFTX.ALL = 0xE040;
    ScibRegs.SCIFFRX.ALL = 0x2044;
    ScibRegs.SCIFFCT.all = 0x0;

    ////------------
    ScibRegs.SCICCR.all =0x0007;
    //启用 TX、RX、内部 SCICLK、禁用 RX ERR、睡眠、 TXWAKE
    //
    ScibRegs.SCICTL1.all =0x0003;
    ScibRegs.SCICTL2.bit.TXINTENA=1;
    // ScibRegs.SCICTL2.bit.RXBKINTENA=1;
    // 115200波特@LSPCLK = 22.5MHz (90MHz SYSCLK)
    //@LSPCLK = 50MHz (200MHz SYSCLK) HBAUD = 0x02且 LBAUD = 0x8B。
    //
    ScibRegs.SCIHBAUD.ALL =0x0000;
    ScibRegs.SCILBAUD.ALL = sciLbaud;//// 53 for 115200
    ScibRegs.SCICTL1.all =0x0023;//从复位中撤回 SCI

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否还需要重置或初始化 FIFO?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我建议在示例代码中遵循相同的初始化序列来执行重新初始化。 您可以查看这方面的回声器示例。

    1) sci_fifo_init ()
    2) sci_echoback_init ()

    这应该会复位 FIFO 并复位 SCI、然后重新正确配置它。

    此外、SCI 可能无法支持1.25M 波特率。 这似乎很高、我没有尝试在 C2000上使用这么高的波特率。

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

    Sal、

    我实际上尝试了你给出的序列、看起来仍然是 sci 无法接收或发送(我没有详细调试)。

    您提到过重置外设时钟。 我可以使用什么函数来复位外设? 外设时钟的复位是否会影响其他功能、例如 ADC、DAC、SPI 等、因为我不想麻烦这些运行的东西。

     至于1.25M、它看起来运行正常、至少在我的开发过程中运行良好。 当然、在开发之后、我不会使用如此高的波特率。  

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

    您只需为正在使用的 SCI 模块禁用 SCI 外设时钟即可。 这不应影响 ADC 或 DAC。 它肯定不会使其他外设转弯。 但您可能会发现在禁用和启用外设时钟时、功耗有一些差异。 但是、如果它仅用于 SCI 模块、那么它应该不会很重要。

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

    我读取代码、发现有一个 CpuSysRegs.PCLKCR7.bit.SCI_D = 1;用于控制 scid 时钟。

    CpuSysRegs.PCLKCR7.bit.SCI_D = 0或1的设置是否足以复位 scid 的时钟?

    我认为:您是否能帮助检查它是否合理?


    SCidRegs.SCICTL1.bit.SWRESET = 0
    scidRegs.SCICTL1.bit.SWRESET = 1.
    CpuSysRegs.PCLKCR7.bit.SCI_D = 0

    SCID_Fifo_initial ()
    SCID_INPLOAL ()//使用新波特率

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

    这是我的建议。

    CpuSysRegs.PCLKCR7.bit.SCI_D = 0
    CpuSysRegs.PCLKCR7.bit.SCI_D = 1.

    SCidRegs.SCICTL1.bit.SWRESET = 0

    scia_fifo_init(); //初始化 SCI FIFO
    scia_echoback_init ();//初始化用于 echoback 的 SCI

    此致、
    SAL