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-F280025C:将 SCI 纳入通用电机控制实验时出现问题

Guru**** 2609895 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1579275/launchxl-f280025c-issue-incorporating-sci-into-universal-motor-control-lab

器件型号:LAUNCHXL-F280025C


我已成功运行了 4 级通用电机实验室、并能够旋转电机。  我还想连接 SCI 以使用操纵杆实现电机控制。  我使用了 sci_ex3_echoback 作为测试平台、并能够将数据从 Jetson orin nano 发送到 LaunchXL-F25C。  所以我尝试获取相同的代码并将其注入到 uinversal 电机控制实验室中、但它不起作用。  我发现 HAL 对象会在代码中初始化 SCI、它不会将 GPIO 16 和 17 初始化为 UART、而是用于其他目的。  所以我删除了我的代码并修改了现有的代码。 我注释掉此代码、以便初始化 UART 的 GPIO。  我还设置了适当的开关 s2、以便将 UART 的 GPIO 路由到 16 和 17。  

然后我使用代码读取传入的 UART。  但是、操纵杆变量始终为 0。  




我知道可能缺少一些密钥。  如有任何帮助、将不胜感激。  

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

    您好 Charlie、

    您是否可以访问逻辑分析仪或示波器、以便查看 TX/RX 线路? 我认为、这将是查看是否至少 C2000 发送任何 回显命令的第一步。

    此致、

    彼得

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

    它肯定回显了我在回声实验室中发送的内容。  它似乎没有在通用电机控制实验室收到数据。  我不确定是否需要为接收数据创建另一个线程。  当我在实验的 readCharArray 代码中设置断点时、没有将数据放入控制手柄数据变量中。  有分析仪和示波器、  在实验室中运行代码时、是否应该将其放在引脚上?  我想我可能会尝试从电机实验室回显。   

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

    这是回显实验中修改后的代码。  我只是从 Jetson orin nano 上的 python 程序发送数字 3127

    //#############################################################################
    //
    // FILE:   sci_ex3_echoback.c
    //
    // TITLE:  SCI echoback example.
    //
    //! \addtogroup driver_example_list
    //! <h1>SCI Echoback</h1>
    //!
    //!  This test receives and echo-backs data through the SCI-A port.
    //!
    //!  A terminal such as 'putty' can be used to view the data from
    //!  the SCI and to send information to the SCI. Characters received
    //!  by the SCI port are sent back to the host.
    //!
    //!  \b Running \b the \b Application
    //!  Open a COM port with the following settings using a terminal:
    //!  -  Find correct COM port
    //!  -  Bits per second = 9600
    //!  -  Data Bits = 8
    //!  -  Parity = None
    //!  -  Stop Bits = 1
    //!  -  Hardware Control = None
    //!
    //!  The program will print out a greeting and then ask you to
    //!  enter a character which it will echo back to the terminal.
    //!
    //!  \b Watch \b Variables \n
    //!  - loopCounter - the number of characters sent
    //!
    //! \b External \b Connections \n
    //!  Connect the USB cable from Control card J1:A to PC
    //!
    //
    //#############################################################################
    //
    //
    // $Copyright:
    // Copyright (C) 2025 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 "driverlib.h"
    #include "device.h"
    
    //
    // Defines
    //
    // Define AUTOBAUD to use the autobaud lock feature
    //#define AUTOBAUD
    
    //
    // Globals
    //
    uint16_t loopCounter = 0;
    
    #define MSB_MASK 0xFF00
    #define LSB_MASK 0x00FF
    //
    // Main
    //
    void main(void)
    {
        uint16_t joystickValue = 0;
        uint16_t receivedChar;
        unsigned char *msg;
        uint16_t rxStatus = 0U;
    
        //
        // Configure PLL, disable WD, enable peripheral clocks.
        //
        Device_init();
    
        //
        // Disable pin locks and enable internal pullups.
        //
        Device_initGPIO();
    
        //
        // SCI Rx pin configuration.
        //
        GPIO_setPinConfig(DEVICE_GPIO_CFG_SCIRXDA);
        GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCIRXDA, GPIO_DIR_MODE_IN);
        GPIO_setPadConfig(DEVICE_GPIO_PIN_SCIRXDA, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(DEVICE_GPIO_PIN_SCIRXDA, GPIO_QUAL_ASYNC);
    
        //
        // SCI Tx pin configuration.
        //
        GPIO_setPinConfig(DEVICE_GPIO_CFG_SCITXDA);
        GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCITXDA, GPIO_DIR_MODE_OUT);
        GPIO_setPadConfig(DEVICE_GPIO_PIN_SCITXDA, GPIO_PIN_TYPE_STD);
        GPIO_setQualificationMode(DEVICE_GPIO_PIN_SCITXDA, GPIO_QUAL_ASYNC);
    
        //
        // Initialize interrupt controller and vector table.
        //
        Interrupt_initModule();
        Interrupt_initVectorTable();
    
        //
        // Initialize SCIA and its FIFO.
        //
        SCI_performSoftwareReset(SCIA_BASE);
    
        //
        // Configure SCIA for echoback.
        //
        SCI_setConfig(SCIA_BASE, DEVICE_LSPCLK_FREQ, 115200, (SCI_CONFIG_WLEN_8 |
                                                            SCI_CONFIG_STOP_ONE |
                                                            SCI_CONFIG_PAR_NONE));
        SCI_resetChannels(SCIA_BASE);
        SCI_resetRxFIFO(SCIA_BASE);
        SCI_resetTxFIFO(SCIA_BASE);
        SCI_clearInterruptStatus(SCIA_BASE, SCI_INT_TXFF | SCI_INT_RXFF);
        SCI_enableFIFO(SCIA_BASE);
        SCI_enableModule(SCIA_BASE);
        SCI_performSoftwareReset(SCIA_BASE);
    
    #ifdef AUTOBAUD
        //
        // Perform an autobaud lock.
        // SCI expects an 'a' or 'A' to lock the baud rate.
        //
        SCI_lockAutobaud(SCIA_BASE);
    #endif
    
        for(;;)
        {
            while(SCI_getRxFIFOStatus(SCIA_BASE) == SCI_FIFO_RX0) {}
            // Read a character from the FIFO.
            
            // receivedChar = SCI_readCharBlockingFIFO(SCIA_BASE);
            uint16_t myArray;
            SCI_readCharArray(SCIA_BASE, &myArray, 2);
            uint16_t *temp_num = &myArray;
            uint16_t temp =  (temp_num[0] << 8);
            joystickValue = temp | (temp_num[1]);
       
    
            rxStatus = SCI_getRxStatus(SCIA_BASE);
            if((rxStatus & SCI_RXSTATUS_ERROR) != 0)
            {
                //
                //If Execution stops here there is some error
                //Analyze SCI_getRxStatus() API return value
                //
                ESTOP0;
            }
    
            uint16_t value[2];
            value[0] = (joystickValue & MSB_MASK) >> 8;
            value[1] = joystickValue & LSB_MASK;
            SCI_writeCharArray(SCIA_BASE, value, 2);
            
            joystickValue = 0;
            myArray = NULL;
    
            // Increment the loop count variable.
            //
            loopCounter++;
        }
    }
    
    //
    // End of File
    //
    
    



    这里是 Jetson 发送和响应从 LaunchXL-F25C 接收到的内容的视频
    e2e.ti.com/.../Echo_5F00_back_5F00_video.mp4

    然后我用同样的代码,并将它注入电机控制实验室后,用户启动电机与设置旗舰

    以及 Jetson 发送以及从 Launchpad 接收信号的视频

    e2e.ti.com/.../motor_5F00_lab_5F00_video.mp4

    您可以看到它发回 0。  因此、似乎没有设置 JoystickValue、或者没有任何值通过 Rx 行。  尽管这没有意义、因为回显上运行的代码与成功返回该值的代码相同。  我觉得我在第一个问题中列出的代码中设置了所有 GPIO 和坐标线。  我可能没有、这就是为什么它不会出现的原因。 还是线程/竞态条件?  我是否需要启动新线程并从中读取 UART 数据?   

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

    您好 Charlie、

    我认为这不是线程问题、因为您将 RX 读数包含在主控制循环中。 但通常对于通信集成、优先选择在后台循环中执行通信、并利用 FIFO 来减少与目标通信所需的 CPU 带宽。 如果您可以将逻辑分析仪连接到 TX/RX 线路、最好是 UART 解码、则可以仔细检查这是硬件配置问题还是软件解码问题

    此致、

    彼得

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

    是的、我当时正考虑尝试将新线程用于 UART。  我度过了周末、试图让 FreeRTOS 正常运行。  我认为这将是最好的解决办法。  将所有电机代码放在一个任务中而不是主任务中、然后使用 UART 读取执行另一个任务。  还是中断在这里也起作用?

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

    您好 Charlie、  

    由于 SCI 的中断优先级较低、因此不会对控制环路产生负面影响、因此您也肯定可以使用中断。 您实际上还可以参考 MCSDK 中 010265 示例代码中的实现、这展示了如何将 SCI 通信集成到电机控制结构中。 此时、我们没有任何依赖于 RTOS 的电机控制解决方案、但根据您的偏好、可能会采用类似的方法

    此致、

    彼得