工具/软件:
尊敬的团队:
我目前正在为一个 PMSM 控制器工程设计 F2800156-Q1 (32引脚)微控制器。 我们已经使用 bitfield 格式为电机控制器逻辑开发了代码、但 MCAN 通信代码部分以 driver-lib 格式完成、因为此时 MCAN 上没有 bitfield 示例。 请帮助我如何 在一个 CCS 工程中合并 Bitfield 代码和 Driver-lib 代码?
此致
Shivani
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.
工具/软件:
尊敬的团队:
我目前正在为一个 PMSM 控制器工程设计 F2800156-Q1 (32引脚)微控制器。 我们已经使用 bitfield 格式为电机控制器逻辑开发了代码、但 MCAN 通信代码部分以 driver-lib 格式完成、因为此时 MCAN 上没有 bitfield 示例。 请帮助我如何 在一个 CCS 工程中合并 Bitfield 代码和 Driver-lib 代码?
此致
Shivani
尊敬的 Shivani:
在您的示例中、应该可以在 driverlib 和 bit-field 中组合器件文件、请查看此论坛帖子以了解更多信息。 关键是确保已在工程中正确包含 device_support 文件。
您还可以查看该软件指南。 它还包含指向位域和 driverlib 应用手册的链接。
https://software-dl.ti.com/C2000/docs/software_guide/c2000ware/drivers.html
此致、
Ozino
尊敬的 Ozino:
很抱歉延迟回复、
我已经浏览了您提供的两个链接、我 已成功地在单个工程中设置了驱动程序库和 Bitfield、当我尝试传输 CAN 消息时、构建 和调试成功运行、但 PCAN 工具上没有收到 CAN 消息、反之亦然。 代码在循环中出现、但当我在 driver-lib 工程文件中运行相同的代码时、工作正常。 我不明白为什么会发生这种情况?
此致
Shivani
尊敬的 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)) { } }
尊敬的 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