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.

[参考译文] LAUNCHXL-F28379D:两个 Launchxl-F28379d 之间的 SCI 通信

Guru**** 2529560 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1412718/launchxl-f28379d-sci-communication-between-two-launchxl-f28379d

器件型号:LAUNCHXL-F28379D
Thread 中讨论的其他器件:C2000WARE

工具与软件:

大家好、

我遇到无法从 launchpad1向 launchpad2发送数据的问题。

设置如下所示:

在主机板(运行 Modbus 主器件)和 launchpad1之间的 SCI 通信(SCIB)正常运行。

现在我添加了另一个板(让我们将其称为 launchpad2)。 我也想使用 SCI 在 launchpad1和 launchpad2之间进行通信。 为此、我已在 launchpad1上配置了另一个 SCI 模块(SCIC)、并在 launchpad2上配置了 SCIB。  

我将 FIFO 中断用于 Rx 和 Tx、但 我的 SCIC TX 中断仅触发一次、并且 launchpad2上接收到的数据不正确。  

注意:我不会在 launchpad1上使用 SCIC Rx ISR (因为我只想从 launchpad1进行传输)、也不会在 launchpad2上使用 SCIB TX (因为我只想在 launchpad2上接收)

我怀疑 FIFO 级别设置和/或 SCIC TX ISR 和 scib Rx ISR 有问题。 请参阅以下内容:

在 Launchpad1上:

scic fifo 初始化。

SCIC TX ISR

这就是我触发 SCIC TX ISR 的方式

在 Launchcpad2上:

Scib FIFO 初始化和 scib Rx ISR

请参考

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

    您好!

    我可以问一下为什么不在 SCIC 的其余 SCI 配置中启用 TX 中断?

    当您说只有一个 TX ISR 执行时、程序会在哪里执行? CPU 是卡住了什么地方、还是程序继续运行? 您是否仍在尝试从 LP1发送到 LP2? 您是否对这些行进行范围检查、以确保 TX 和 RX 的行为符合预期?

    您是否已参考适用于 SCI 的 C2000Ware 中的示例? 这些示例 SCI ISR 也有、如果您尚未检查、可能会有所帮助。

    此致。

    Allison

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

    Allison

    为简单起见、我在 LP1上创建了一个简单程序、在 LP2上使用 SCIC (只发送)和 SCIB (只接收)、但是它们不工作。  

    我启用了 SCIC TX FIFO 中断(见下文)、并禁用了与 RX FIFO 中断相关的所有内容、因为我只希望从 LP1发送数据。 我的问题是、由于 Rx FIFO 已禁用、我需要为 Rx FIFO 设置哪个 FIFO 中断级别?

    此外、有数据传入 LP2 (就像之前那样)、但此数据还是不正确。 但是、我在发送后使用一些延迟、没有延迟、接收端不会出现所有数据  

    波特率在两个 LaunchPad 上是相同的。  

    是的、我已经看到过这些示例(因为我在 LP1上使用其他 Linux 电路板来处理 SCIB)。

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

    您好!

    负责这一问题的专家目前不在办公室、于9月16日星期一返回。 请期待您的回复。

    谢谢!

    Luke

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

    大家好、

    你们能够研究一下吗?

    谢谢!

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

    您好、Sumit、

    对不起,我今天刚刚回来了。  

    我的问题是、Rx FIFO 禁用了时、我需要为 Rx FIFO 设置哪个 FIFO 中断级别?

    如果禁用 RX 中断、则该值无关紧要。 澄清一下、您没有进入或卷入任何已禁用的中断、对吗?

    另请查看此 SCI 常见问题解答主题: 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。 

    一些其他与中断相关的建议:

    -在您的 TX ISR 中:

    1. 首先检查 TXFIFO 中是否有可用空间
    2. 然后将数据写入 TXFIFO
    3. 注释掉检查 TXFIFO 是否为空的 while 循环
    4. 您也不需要该延迟

    -在你的 RX ISR 中

    1. 检查 RX FIFO 中是否有一个字符(可使用 SCI_getRxFIFOStatus ())
    2. 然后从 RXFIFO 读取数据

    此致、

    Allison

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

    Allison

    我接受了您建议的更改、但结果仍然相同。 您能否检查以下接收 LaunchPad 设置(GPIO 引脚配置)

    请注意、我确实会收到 FE 和 RXERROR 错误、并且我收到的数据确实不是我从其他 Launchpad 发送的数据(应该已为[1、2、5、9、10]

     

    谢谢!

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

    您好、Sumit、

    对于 RX 侧、您能否将 RX 的引脚从 GPIO_PIN_TYPE_PULLUP 更改为 GPIO_PIN_TYPE_STD?

    此外、您是否能够确定 SCI 线路的范围以验证数据在 两侧都正确发送?  

    您要发送什么数据格式? 您是否可以尝试添加2个停止位?

    此致、

    Allison

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

    Allison

    对于 RX 端、您能否将 RX 的 GPIO_PIN_TYPE_PULLUP 更改为 GPIO_PIN_TYPE_STD?

    当我将  RX 的引脚从 GPIO_PIN_TYPE_PULLUP 更改为 GPIO_PIN_TYPE_STD 时、Rx ISR 不会触发。

    此外、您是否能够确定 SCI 行的范围以验证 两侧是否正确发送了数据?

    是、传输线上有正确的数据(我将其确定范围)

    您发送的数据格式是什么? 您是否可以尝试添加2个停止位?

    这次我使它更加简单、只发送一个字节的数据、但问题仍然是一样的。

    在两侧添加了2个停止位、仍然是相同的问题。

    我已禁用 launchpad1上的 Rx 和 launchpad2上的 TX、因为我只想将一个字节从 LP1发送到 LP2。

    我仍怀疑 Rx 侧(LP2)有什么问题。 我要为您附加整个.c 文件。

    //#############################################################################
    //
    // FILE:   empty_bitfield_driverlib_main.c
    //
    // TITLE:  Empty Example
    //
    // Empty Bit-Field & Driverlib Example
    //
    // This example is an empty project setup for Bit-Field and Driverlib 
    // development.
    //
    //#############################################################################
    //
    // 
    // $Copyright:
    // Copyright (C) 2013-2023 Texas Instruments Incorporated - http://www.ti.com/
    //
    // Redistribution and use in source and binary forms, with or without 
    // modification, are permitted provided that the following conditions 
    // are met:
    // 
    //   Redistributions of source code must retain the above copyright 
    //   notice, this list of conditions and the following disclaimer.
    // 
    //   Redistributions in binary form must reproduce the above copyright
    //   notice, this list of conditions and the following disclaimer in the 
    //   documentation and/or other materials provided with the   
    //   distribution.
    // 
    //   Neither the name of Texas Instruments Incorporated nor the names of
    //   its contributors may be used to endorse or promote products derived
    //   from this software without specific prior written permission.
    // 
    // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    // $
    //#############################################################################
    
    //
    // Included Files
    //
    #include "F28x_Project.h"
    #include "driverlib.h"
    #include "device.h"
    
    #define TX_PIN              18U //(GPIO 18, pin# 4)
    #define RX_PIN              19U //(GPIO 19, pin# 3)
    
    
    __interrupt void SCIBRxFifoIsr(void);
    __interrupt void SCIBTxFifoIsr(void);
    void initSCIBFifo(void);
    
    uint16_t recv_data[5];
    uint16_t offset = 0;
    uint16_t data = 0;
    //
    // Main
    //
    void main(void)
    {
        //InitSysCtrl();
    
        //InitGpio();
        Device_init();
        Device_initGPIO();
    
        //sci tx
    /*
        GPIO_setMasterCore(TX_PIN, GPIO_CORE_CPU1);
        GPIO_setPinConfig(GPIO_18_SCITXDB);
        GPIO_setDirectionMode(TX_PIN, GPIO_DIR_MODE_OUT);
        GPIO_setPadConfig(TX_PIN, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(TX_PIN, GPIO_QUAL_ASYNC);
    */
        //sci rx
        //GPIO_SetupPinMux(RX_PIN, GPIO_MUX_CPU1, 2); //(for scirx GPIO MUX selection index = 2)
        //GPIO_SetupPinOptions(RX_PIN, GPIO_INPUT, GPIO_PULLUP); //pull up is important here, to keep the rx idle high where there is no data coming in
    
    
        GPIO_setMasterCore(RX_PIN, GPIO_CORE_CPU1);
        GPIO_setPinConfig(GPIO_19_SCIRXDB);
        GPIO_setDirectionMode(RX_PIN, GPIO_DIR_MODE_IN);
        GPIO_setPadConfig(RX_PIN, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(RX_PIN, GPIO_QUAL_ASYNC);
    
        DINT;
    
        InitPieCtrl();
    
        IER = 0x0000;
        IFR = 0x0000;
    
        Interrupt_initModule();
        Interrupt_initVectorTable();
    
        Interrupt_register(INT_SCIB_RX, SCIBRxFifoIsr);
        //Interrupt_register(INT_SCIB_TX, SCIBTxFifoIsr);
    
        initSCIBFifo();
    
        //Interrupt_enable(INT_SCIB_TX);
        Interrupt_enable(INT_SCIB_RX);
    
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    
        EINT;
        ERTM;
    
        int i;
        for(i=0; i<5; i++)
        {
            recv_data[i] = 0;
        }
    
        while(1)
        {
    
        }
    }
    
    void SCIBRxFifoIsr(void)
    {
        //wait until a char is available in the receive FIFO
        while(SCI_getRxFIFOStatus(SCIB_BASE) == SCI_FIFO_RX0)
        {
    
        }
    
        //recv_data[offset++] = SCI_readCharBlockingFIFO(SCIB_BASE);
        data = ScibRegs.SCIRXBUF.all;
    
        SCI_clearOverflowStatus(SCIB_BASE);
        SCI_clearInterruptStatus(SCIB_BASE, SCI_INT_RXFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    
        /*
        if(ScibRegs.SCIRXST.bit.RXERROR != 0)
        {
            SCI_performSoftwareReset(SCIB_BASE);
        }
         */
        //DELAY_US(2000);
    }
    
    void SCIBTxFifoIsr(void)
    {
        SCI_clearInterruptStatus(SCIB_BASE, SCI_INT_TXFF);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
    }
    
    void initSCIBFifo(void)
    {
        SCI_setConfig(SCIB_BASE, DEVICE_LSPCLK_FREQ, 115200, (SCI_CONFIG_WLEN_8 | SCI_CONFIG_STOP_TWO | SCI_CONFIG_PAR_NONE));
        SCI_enableModule(SCIB_BASE);
        SCI_resetChannels(SCIB_BASE);
        SCI_enableFIFO(SCIB_BASE);
        SCI_disableLoopback(SCIB_BASE);
    
        SCI_enableInterrupt(SCIB_BASE, SCI_INT_RXFF);
        SCI_disableInterrupt(SCIB_BASE, SCI_INT_RXERR);
        SCI_disableInterrupt(SCIB_BASE, SCI_INT_TXFF);
    
        SCI_setFIFOInterruptLevel(SCIB_BASE, SCI_FIFO_TX2, SCI_FIFO_RX2);
        SCI_performSoftwareReset(SCIB_BASE);
    
        SCI_resetTxFIFO(SCIB_BASE);
        SCI_resetRxFIFO(SCIB_BASE);
    
    #ifdef AUTOBAUD
        SCI_lockAutobaud(SCIB_BASE);
    #endif
    }
    
    //
    // End of File
    //
    

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

    您好、Sumit、

    很高兴听到示波器信号已确认、并且 LP1可以始终如一地发送良好的数据。 这样、我们至少可以排除 LP1的 TX、而将重点放在 LP2上的 RX。  

    您能否仔细检查项目是否也具有 launchpad 预定义? 什么是 DEVICE_LSPCLK_FREQ?

    在 LP2上、您可以尝试实现内部环回模式吗? 我们有多个 C2000Ware 示例。  如果您的 ISR 运行正常、那么 FIFO RX ISR 应该会在 FIFO 水平为2或更高(假设您的 RXFFIL 为2)时触发。  为什么不尝试使用内部环回模式的相同代码?  要测试 RX FIFO、请准备一个一次发送超过2个字的 TX 功能。  

    此致、

    Allison

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

    Allison

    事实证明、问题是共同的接地。 由于我尝试在连接到两台不同 PC 的两台 LP 之间建立通信、因此两者之间没有公共接地。 我添加了它、然后我能够发送数据。

    谢谢!

    现在解决问题。