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:SCI 通信

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/911379/tms320f28377s-sci-communication

器件型号:TMS320F28377S
主题中讨论的其他器件:C2000WARE

您好!

我的客户正在其固件中开发 SCI 通信代码、但无法正常工作。
您能否提供解决问题的建议?   下面对这些现象进行了说明。

- F28377S 通过 SCI 与客户系统中的其他部分进行通信。

- F28377S 向另一部分发送多个数据包,接收器可以接收消息。

-接收器向 F28377S 发送数据包,RX 引脚波形看起来正确。  然后"H"电平大约为3.3V、"L"电平大约为0V。

-他们的软件可以注意检测 RX 的中断、而 F28377S 无法接收来自接收器的消息。

-启用回路模式时、中断标志置为有效、F28377S 可以接收来自接收器的消息。

我随附了与寄存器设置相关的代码。  请参阅随附的 temp.c 文件。
如果您需要更多信息来解决这个问题、PLS 会告诉我。
e2e.ti.com/.../temp.c

此致、Taki

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

    您好、Taki、

    感谢您的提问! 我对原始帖子中附加的代码确实有一个问题、但需要更多的源代码才能进一步调试。 具体而言、第12行至第15行具有函数"GPIO_SetupPinMux"和"GPIO_SetupPinOptions"。 为了确保这些函数正常工作、如果这些函数已从我们的 C2000Ware 示例函数中进行更改、您能否提供这些函数的代码?

    此处的代码片段:

    GPIO_SetupPinOptions (56、GPIO_output、GPIO_Async);
    GPIO_SetupPinOptions (57、GPIO_input、GPIO_PushPull); 

    我的问题是 GPIO_SetupPinOptions 函数似乎设置了 Async 和 PushPull、它们是芯片上的不同设置。

    建议对 RX 使 GPIO 鉴定异步、但也建议将其设置为推挽。 这两个值都应设置(如下面的 C2000Ware 示例所示):

    // GPIO28是 SCI Rx 引脚。
    // 
    (笑声) GPIO_setPadConfig (28、GPIO_PIN_TYPE_STD); //这会将 RX 设置为推挽模式 GPIO_setQualificationMode (28、GPIO_Qual_异 步); //这将 RX 限定设置为 ASINCRHONOUS
    (笑声)

    请查看 "C2000Ware_##_##_##_##\f2837xs\examples\cpu1\sci\"中的 C2000Ware 示例 sci_ex1_loopback.c、以深入了解我们建议的初始化序列。

    如果您能够提供这些详细信息以便进一步调试、请告诉我!

    此致、

    Vince

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

    您好!

    函数"GPIO_SetupPinMux"和"GPIO_SetupPinOptions"不会更改、并且附加在此线程中的 F2837xS_GPIO_c 会被替换。  

    根据您的建议尝试运行以下代码、但问题未得到解决。
           GPIO_SetupPinOptions (56        、            GPIO_output、            GPIO_PushPull|GPIO_异 步);
           GPIO_SetupPinOptions (57        、            GPIO_input    、            GPIO_PushPull|GPIO_异 步);

    以下示例代码被参考以进行编码。
     C2000Ware_2_01_00_00\device_support\f2837xs\examples\cpu01
     Example_2837xSSci_FFDLB_int.c

    e2e.ti.com/.../1057.F2837xS_5F00_Gpio.c

    e2e.ti.com/.../Example_5F00_2837xSSci_5F00_FFDLB_5F00_int.c

    此致、Taki

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

    您好、Taki、

    仔细查看代码后、我认为有一些建议可以帮助您:

    • 在 PIE 矢量表初始化之前和 DINT 之前运行"initGpio()"和 GPIO 配置(不重要,但请尝试,以防万一)
    • 在 SCI 配置前后执行 SCI 软件复位。
    • 配置 SCI 后:
      • 复位 SCIFFTX.SCIRST 通道(对 TX 线路有用)
      • 使用 SCICTL.SWRESET 清除 TXRDY 和 RXRDY_BRKDT
      • 通过 SCICTL 寄存器启用 RX、TX 和 SCI  
      • 再次启用 SCI_INT_TXRDY 和 SCI_INT_RXRDY_BRKDT
    • 现在可以更新 PIe*寄存器
    • 完成 PIE 配置并调用 EnableInterrupts ()后,确认 PIE 组以将其清除

    这应该与原始 test.c 文件中的以下内容类似:

    void init (void)
    {
    
    InitSysCtrl();
    
    //*** moved***
    initGpio();
    
    GPIO_SetupPinMux (56,GPIO_MUX_CPU1,6);// CFƒJ
    ƒh§ŒäiRxDjš ƒh§ŒäiTxDj GPIO_SetupPinMux (57,GPIO_MUX_CPU1,6);// CFƒJ GPIO_SetupPinOptions
    (56,GPIO_output,GPIO_Async);// CFƒJ [ƒh§ŒäiTxDj
    GPIO_SetupPinOptions (57,GPIO_input,GPIO_PushPull);// CFƒJ ƒh§ŒäiRxDjš[GPIO//
    *** Inend PieIntr
    
    
    (
    0x0000
    );0xInteInteTable (0x0000 = 0xINT)
    
    
    //***已添加***
    SCI_performSoftwareReset (SCIA_BASE );
    //*** End Added ***
    
    EALLOW;//需要此操作来写入 EALLOW 受保护的寄存
    器 PieVectTable.SCIC_TX_INT=&SCIC_TX_ISR;
    &PieVectTable.SCIC_RX_INT= SCICT_REQ =0x000CLUSTRIS/
    停止
    
    所有的循环;/循环= 0xICTR_SCICTRIS.CLIC.0X000/循环
    //TX、RX 使能、内部 SCK clk、ERR、SLEEP、TXWAKE 禁用
    ScicRegs.SCICT2.bit.TXINTENA=1;//TX int 禁用
    ScicRegs.SCICT2.bit.RXBUKINTENA=1;//RX int 启用
    RegicRegs.SCIHBAUD.ALL=( u.SCICRET.002.bit)
    
    TXŠ„‚螂݂ÍFIFO‚ª15ˆÈ‰º‚Å
    ;/TXCFRICT.USCI.USC=0X.USTRF=0X=0X.USTRF=0X.US.USC=0X.US.USC=0X.USC=0X.CLUS.US.US.CLUS.US.US.US.CLUS.US.US.US_CLUS.US.CLUS.US.CLUS.CLUS.US.US.CLUS_CLUS=0X=0x00.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS=0X.US.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.CLUS.
    
    
    ƒtƒgƒEƒFƒAƒŠƒZƒbƒg SCIƒ­¶RXŠ„‚螂݂ÍFIFO‚ª1ˆÈã‚Å­¶
    //TX FIFOƒŠƒZƒbƒg
    ScicRegs.SCIFFRX.bit.RXFIFORESET=1;//RX FIFOƒŠƒZƒbƒg
    
    //***已添加***
    SCI_resetChannels (SCIB_BASE);//重置 SCIFFTX.SCIRST
    SCI_performSoftwareReset (SCIB_BASE);//clear TXRDY and RXRDY_BRKDT (由 SCICTL*。SWRESET 提供)
    SCI_enableModule (SCIB_BASE);//在 CTL 寄存器中启用 RX、TX 和 SCI
    SCI_performSoftwareReset (SCIB_BASE);//reset SCI with SCICTL*。SWRESET
    SCI_enableInterrupt (SCIA_BASE、SCI_INT_TXRDY | SCI_INT_RXRDY_BRKDT);//启用 SCI_INT_TXRDY 和 SCI_INT_RXRDY_BRKDT
    //***已添加结束***
    
    
    //现在可以在 PIE 块
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1中启用中断;//启用 PIE 块
    PieCtrlRegs.PIEIER8.bit.INTx5=1;
    PieCtrlRegs.PIEIER8.bit.INTx6=1;
    IER|=M_Interrupt
    
    
    
    
    8;*Interrupt 8 (*中断组);*中断组8 (***) //acknowledge Group
    //**End Added ***
    
    EINT;
    ERTM;//启用全局实时中断 DBGM
    }
    

    我强烈建议使用最新版本的 C2000Ware (3.02.00.00)、因为该线程中提供的版本已经是少数旧版本(2.01.00.00)、并且可能自那时以来已经实现了一些修复!

    请告诉我上述建议是否有助于解决您的问题!

    此致、

    Vince

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

    您好、Vince

    客户 已根据您的建议进行调试、从而解决了该问题。
    他们感谢您为他们提供的所有帮助。

    他们告诉我根本原因是 RTS 和 CTS 是在其原始代码中实现的。
    我认为他们的代码可能会在读取接收到的数据之前等待 CTS 信号。

    总之、非常感谢您的帮助。
    此致、Taki