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.

[参考译文] TMS320F2800156-Q1:如何在一个 CCS 工程中合并 Bitfield 代码&Driver-lib 代码?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1513793/tms320f2800156-q1-how-to-merge-bitfield-code-driver-lib-code-in-one-ccs-project

器件型号:TMS320F2800156-Q1

工具/软件:

尊敬的团队:

 我目前正在为一个 PMSM 控制器工程设计 F2800156-Q1 (32引脚)微控制器。 我们已经使用 bitfield 格式为电机控制器逻辑开发了代码、但 MCAN 通信代码部分以 driver-lib 格式完成、因为此时 MCAN 上没有 bitfield 示例。 请帮助我如何  在一个 CCS 工程中合并 Bitfield 代码和 Driver-lib 代码?

此致

Shivani

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

    尊敬的 Shivani:

    在您的示例中、应该可以在 driverlib 和 bit-field 中组合器件文件、请查看此论坛帖子以了解更多信息。 关键是确保已在工程中正确包含 device_support 文件。

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/889632/ccs-tms320f28075-tms320f28075-driverlib-and-bit-fields 

    您还可以查看该软件指南。 它还包含指向位域和 driverlib 应用手册的链接。

    https://software-dl.ti.com/C2000/docs/software_guide/c2000ware/drivers.html

    此致、

    Ozino

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

    尊敬的 Ozino:

    很抱歉延迟回复、  

    我已经浏览了您提供的两个链接、我 已成功地在单个工程中设置了驱动程序库和 Bitfield、当我尝试传输 CAN 消息时、构建 和调试成功运行、但 PCAN 工具上没有收到 CAN 消息、反之亦然。 代码在循环中出现、但当我在 driver-lib 工程文件中运行相同的代码时、工作正常。 我不明白为什么会发生这种情况?

    此致  

    Shivani

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

    尊敬的 Shivani:

    您的 CAN 设置是否调用任何位域代码? 您的代码滞留在循环的哪个部分? 它是否在 CAN 设置例程中? 请确保设备安装程序 仅运行一次、因为您已支持两个版本的软件。

    此致、

    Ozino

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

    尊敬的 Ozino:

    1.我的 MCAN 设置未调用任何位域代码。

    2.我没有使用任何中断/ISR。

    我正在与您共享代码文件以供查看。 该实现不使用任何中断;相反、它在while循环中运行以验证循环执行时间。 我创建了两个单独的工程:一个仅包含 DriverLib 文件、另一个工程同时包含 DriverLib 和 bitfield 文件。 我在两个项目中运行了相同的代码。 然而、我观察到只有基于 DriverLib 的工程才会在 CANH 和 CANL 线路上产生输出、正常比特率为500kb/s、数据比特率为2Mb/s

    循环执行时间-使用 GPIO29

     在 DriverLib 和 bitfield 组合工程文件中调试代码时、不会收到输出(PCAN 工具设置相同)。  在此代码中、我到目前为止没有添加任何 bitfield 器件、但我想在将来添加。

      在 DriverLib 和 bitfield 组合工程文件中需要提到的另一个重要事项是、我测试了 GPIO 切换和 ePWM 生成、两者都可以正常工作、但我只遇到了 MCAN 问题。

    我遇到的问题- 1. 每当我开始将数据从 PCAN 工具传输到 MCU 时、PCAN LED 开始呈红色闪烁、没有完成任何数据传输。  

      2.每当我开始将数据从 MCU 传输到 PCAN 工具时、CANH 和 CANL 引脚上看不到输出波形、PCAN 工具上没有接收到数据。 (TBPRP = 1)

    组合的 DriverLib 和 bitfield 工程文件是否会影响循环执行过程?

    我不明白为什么会发生这种情况、因为相同的代码 仅在 DriverLib 文件工程中运行良好

     

    // Include Files
    #include "driverlib.h"
    #include "device.h"
    #include "inc/stw_types.h"
    #include "inc/stw_dataTypes.h"
    #include <string.h>
    
    // Defines
    #define NUM_OF_MSG                      (1U)
    #define MCAN_STD_ID_FILTER_NUM          (1U)
    #define MCAN_EXT_ID_FILTER_NUM          (0U)
    #define MCAN_FIFO_0_NUM                 (0U)
    #define MCAN_FIFO_0_ELEM_SIZE           (MCAN_ELEM_SIZE_64BYTES)
    #define MCAN_FIFO_1_NUM                 (0U)
    #define MCAN_FIFO_1_ELEM_SIZE           (MCAN_ELEM_SIZE_64BYTES)
    #define MCAN_RX_BUFF_NUM                (10U)
    #define MCAN_RX_BUFF_ELEM_SIZE          (MCAN_ELEM_SIZE_64BYTES)
    #define MCAN_TX_BUFF_SIZE               (0U)
    #define MCAN_TX_FQ_SIZE                 (0U)
    #define MCAN_TX_BUFF_ELEM_SIZE          (MCAN_ELEM_SIZE_64BYTES)
    #define MCAN_TX_EVENT_SIZE              (0U)
    
    //  Defining Starting Addresses for Message RAM Sections,
    //  (Calculated from Macros based on User defined configuration above)
    #define MCAN_STD_ID_FILT_START_ADDR     (0x0U)
    #define MCAN_EXT_ID_FILT_START_ADDR     (MCAN_STD_ID_FILT_START_ADDR + ((MCAN_STD_ID_FILTER_NUM * MCANSS_STD_ID_FILTER_SIZE_WORDS * 4U)))
    #define MCAN_FIFO_0_START_ADDR          (MCAN_EXT_ID_FILT_START_ADDR + ((MCAN_EXT_ID_FILTER_NUM * MCANSS_EXT_ID_FILTER_SIZE_WORDS * 4U)))
    #define MCAN_FIFO_1_START_ADDR          (MCAN_FIFO_0_START_ADDR + (MCAN_getMsgObjSize(MCAN_FIFO_0_ELEM_SIZE) * 4U * MCAN_FIFO_0_NUM))
    #define MCAN_RX_BUFF_START_ADDR         (MCAN_FIFO_1_START_ADDR + (MCAN_getMsgObjSize(MCAN_FIFO_1_ELEM_SIZE) * 4U * MCAN_FIFO_1_NUM))
    #define MCAN_TX_BUFF_START_ADDR         (MCAN_RX_BUFF_START_ADDR + (MCAN_getMsgObjSize(MCAN_RX_BUFF_ELEM_SIZE) * 4U * MCAN_RX_BUFF_NUM))
    #define MCAN_TX_EVENT_START_ADDR        (MCAN_TX_BUFF_START_ADDR + (MCAN_getMsgObjSize(MCAN_TX_BUFF_ELEM_SIZE) * 4U * (MCAN_TX_BUFF_SIZE + MCAN_TX_FQ_SIZE)))
    
    // Global Variables.
    int32_t     error = 0;
    MCAN_RxBufElement rxMsg[NUM_OF_MSG], rxMsg1;
    int32_t loopCnt = 0U;
    MCAN_RxNewDataStatus newData;
    
    // Function Prototype
    static void MCANConfig(void);
    
    void main()
    {
        int i = 0;
        volatile uint32_t mode = 0U;
        uint32_t dataBytes = 64;
    
        // Initialize device clock and peripherals
        Device_init();
    
        // Initialize GPIO and unlock the GPIO configuration registers
        Device_initGPIO();
    
        // Configure the divisor for the MCAN bit-clock
        SysCtl_setMCANClk(SYSCTL_MCANCLK_DIV_3);
    
        // Configure GPIO pins for MCANTX/MCANRX operation
        GPIO_setPinConfig(DEVICE_GPIO_CFG_MCANRXA);
        GPIO_setPinConfig(DEVICE_GPIO_CFG_MCANTXA);
    
        GPIO_setPadConfig(29, GPIO_PIN_TYPE_PULLUP);    // Enable pullup on GPIO29
        GPIO_writePin(29, 1);                           // Load output latch
        GPIO_setPinConfig(GPIO_29_GPIO29);              // GPIO29 = GPIO29
        GPIO_setDirectionMode(29, GPIO_DIR_MODE_OUT);   // GPIO29 = output
    
        // Initialize message to receive
        rxMsg[loopCnt].id = 0U;
        rxMsg[loopCnt].rtr = 0U;
        rxMsg[loopCnt].xtd = 0U;
        rxMsg[loopCnt].esi = 0U;
        rxMsg[loopCnt].rxts = 0U;   // Rx Timestamp
        rxMsg[loopCnt].dlc = 0U;
        rxMsg[loopCnt].brs = 0U;
        rxMsg[loopCnt].fdf = 0U;
        rxMsg[loopCnt].fidx = 0U;   // Filter Index
                                    // (of matching Rx acceptance filter element)
        rxMsg[loopCnt].anmf = 0U;   // Accepted Non-matching Frame
    
        for(i = 0; i < dataBytes; i++)  // Initialize receive buffer to 0
        {
            rxMsg[loopCnt].data[i]  = 0;
        }
    
        // Configure the MCAN Module.
        MCANConfig();
    
        while(1)
    {
        GPIO_writePin(29, 1);
        // Get the New Data Status.
        MCAN_getNewDataStatus(MCANA_DRIVER_BASE, &newData);
    
        if((newData.statusLow & (1UL << 0U)) != 0)
        {
            MCAN_readMsgRam(MCANA_DRIVER_BASE, MCAN_MEM_TYPE_BUF, loopCnt, 0, &rxMsg[loopCnt]);
        }
        else
        {
            error++;
            //  Interrupt handling for other interrupt sources goes here
        }
    
        //  Clearing the NewData registers
        MCAN_clearNewDataStatus(MCANA_DRIVER_BASE, &newData);
    
        GPIO_writePin(29, 0);
    }
    
        // Stop Application.
       asm("   ESTOP0");
    }
    
    static void MCANConfig(void)
    {
        MCAN_InitParams initParams;
        MCAN_MsgRAMConfigParams    msgRAMConfigParams;
        MCAN_StdMsgIDFilterElement stdFiltelem;
        MCAN_BitTimingParams       bitTimes;
    
        //  Initializing all structs to zero to prevent stray values
        memset(&initParams, 0, sizeof(initParams));
        memset(&msgRAMConfigParams, 0, sizeof(msgRAMConfigParams));
        memset(&stdFiltelem, 0, sizeof(stdFiltelem));
        memset(&bitTimes, 0, sizeof(bitTimes));
    
        // Configure MCAN initialization parameters
        initParams.fdMode            = 0x1U; // FD operation enabled.
        initParams.brsEnable         = 0x1U; // Bit rate switching enabled
    
        // Initialize Message RAM Sections Configuration Parameters
        msgRAMConfigParams.flssa                = MCAN_STD_ID_FILT_START_ADDR;
        // Standard ID Filter List Start Address.
        msgRAMConfigParams.lss                  = MCAN_STD_ID_FILTER_NUM;
        // List Size: Standard ID.
        msgRAMConfigParams.rxBufStartAddr       = MCAN_RX_BUFF_START_ADDR;
        // Rx Buffer Start Address.
        msgRAMConfigParams.rxBufElemSize        = MCAN_RX_BUFF_ELEM_SIZE;
        // Rx Buffer Element Size.
    
        // Initialize Rx Buffer Configuration parameters.
        stdFiltelem.sfid2              = 0x0U; // Standard Filter ID 2.
        // Configuring received frame to be stored in buffer element 0
        stdFiltelem.sfid1              = 0x4U; // Standard Filter ID 1.
        // Confifuring frames with msg ID = 0x4U to be accepted by filter element
        stdFiltelem.sfec               = 0x7U; // Store into Rx Buffer
                                               // configuration of SFT[1:0] ignored
    
        // Initialize bit timings.
        bitTimes.nomRatePrescalar   = 0x3U; // Nominal Baud Rate Pre-scaler
        bitTimes.nomTimeSeg1        = 0xEU; // Nominal Time segment before SP
        bitTimes.nomTimeSeg2        = 0x3U; // Nominal Time segment after SP
        bitTimes.nomSynchJumpWidth  = 0x4U; // Nominal SJW
        bitTimes.dataRatePrescalar  = 0x0U; // Data Baud Rate Pre-scaler
        bitTimes.dataTimeSeg1       = 0xEU; // Data Time segment before SP
        bitTimes.dataTimeSeg2       = 0x3U; // Data Time segment after SP
        bitTimes.dataSynchJumpWidth = 0x4U; // Data SJW
    
        // Wait for memory initialization to happen.
        while(FALSE == MCAN_isMemInitDone(MCANA_DRIVER_BASE))
        {
        }
    
        // Put MCAN in SW initialization mode.
        MCAN_setOpMode(MCANA_DRIVER_BASE, MCAN_OPERATION_MODE_SW_INIT);
    
        // Wait till MCAN is not initialized.
        while (MCAN_OPERATION_MODE_SW_INIT != MCAN_getOpMode(MCANA_DRIVER_BASE))
        {
    
        }
    
        // Initialize MCAN module.
        MCAN_init(MCANA_DRIVER_BASE, &initParams);
    
        // Configure Bit timings.
        MCAN_setBitTime(MCANA_DRIVER_BASE, &bitTimes);
    
        // Configure Message RAM Sections
        MCAN_msgRAMConfig(MCANA_DRIVER_BASE, &msgRAMConfigParams);
    
        // Configure Standard ID filter element
        MCAN_addStdMsgIDFilter(MCANA_DRIVER_BASE, 0U, &stdFiltelem);
    
        // Take MCAN out of the SW initialization mode
        MCAN_setOpMode(MCANA_DRIVER_BASE, MCAN_OPERATION_MODE_NORMAL);
    
        while (MCAN_OPERATION_MODE_NORMAL != MCAN_getOpMode(MCANA_DRIVER_BASE))
        {
    
        }
    }

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

    感谢您提供的信息。

    我将把这篇文章转发给 MCAN 专家。 同时、您能否确认仅使用 driverlib 代码即可正确初始化 main ()函数器件启动例程?

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

    尊敬的 Shivani:

    它应该很简单。  在调用 MCAN driverlib functrion 的 c 文件中、添加头文件:

      #include "driverlib.h"

    此外、在 CCS 工程的 Include Options 中、请确保添加以下路径:

      [ C2000根所在的路径]\device_support\f280015x\common\include

      [ C2000根所在的路径]\driverlib\f280015x\driverlib

    在 CCS 工程中、从  [ C2000 root 所在的路径]\driverlib\f280015x\driverlib 添加以下文件:

      - mcan.c

      - interrupt.c (如果您使用的是 driverlib 的中断函数)

    您可能需要添加其他 driverlib c 文件。  例如、如果编译后收到以 SysCtl_*开头的函数调用的错误/链接警告、则需要将 sysctl.c 文件添加到 CCS 工程中。 根据会导致编译或链接错误的函数名称、关于需要添加的 driverlib.c 文件的内容非常直观。

    建议您首先运行并播放任何 MCAN driverlib 示例、因为在将 driverlib 函数调用与 bitfield 例程合并时、您可以将其用作指南/参考。

    此致、

    Joseph  

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

    您好、Joseph

    感谢您的帮助。  

    我正在尝试、只是提供一些时间。  

    此致、  

    Shivani

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

    尊敬的 Ozino:

    感谢 您的帮助。  

     是的、 仅使用 driverlib 代码即可正确初始化 main ()函数设备启动例程。  

    我正在尝试、只是提供一些时间。

    此致、  

    Shivani

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

    尊敬的 Shivani:

    好的、如果您在合并 MCAN driverlib 代码时遇到问题、根据您下面的回复、您似乎已经在使用 driverlib 函数进行器件初始化。  然后、您可能不需要在工程中添加 mcan.c 文件。  可能只是调用 driverlib MCAN 函数会起作用、因为 driverlib 依赖项已经在 main()中。

    此致、

    Joseph  

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

    谢谢 Joseph、  

    位域和驱动程序库合并问题已解决。 我将获得输出。

    此致

    Shivani

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

    尊敬的 Shivani:

    很高兴您能成功完成对 F280015x 工程的 bitfield 和 driverlib 合并。

    此致、

    Joseph