TI中文支持网
TI专业的中文技术问题搜集分享网站

LAUNCHXL-F28379D: CAN通信在CPU2中进行通信的问题

Part Number:LAUNCHXL-F28379DOther Parts Discussed in Thread:C2000WARE, TMS320F28379D

利用C2000ware中28379D的双核例程led_ex1_blinky_cpu1和led_ex1_blinky_cpu2烧录到开发板上,指示灯可以在CPU1和CPU2的控制下闪烁,之后根据C2000 ware中的单核例程中的can_ex4_simple_transmit中的can例程加入到双核点灯例程中,CAN的GPIO的定义以及CAN的主控选择语句在CPU1中,其他CAN的相应配置在CPU2中定义,在debug过程中CPU2进不去CAN的CAN_initModule(CANB_BASE),暂停CPU2的仿真,出现下面界面。

代码如下:

CPU1:

#include "driverlib.h"
#include "device.h"
#include "inc/hw_ipc.h"

void main(void)
{uint16_t ipcFlag17 = 17U;Device_init();Device_initGPIO();SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL8_CAN, 2, SYSCTL_CPUSEL_CPU2);

#ifdef _STANDALONE
#ifdef _FLASH//// Send boot command to allow the CPU2 application to begin execution//Device_bootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
#else//// Send boot command to allow the CPU2 application to begin execution//Device_bootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);

#endif // _FLASH
#endif // _STANDALONE//// Initialize GPIO and configure the GPIO pin as a push-pull output//GPIO_setPinConfig(GPIO_12_CANTXB);GPIO_setPinConfig(GPIO_17_CANRXB);GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD);GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1, GPIO_DIR_MODE_OUT);GPIO_setPadConfig(DEVICE_GPIO_PIN_LED2, GPIO_PIN_TYPE_STD);GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED2, GPIO_DIR_MODE_OUT);//// Configure CPU2 to control the LED GPIO//GPIO_setMasterCore(DEVICE_GPIO_PIN_LED2, GPIO_CORE_CPU2);HWREG(IPC_BASE + IPC_O_SET) = 1UL << ipcFlag17;//// Initialize PIE and clear PIE registers. Disables CPU interrupts.//Interrupt_initModule();//// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).//Interrupt_initVectorTable();//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;//// Loop Forever//for(;;){GPIO_writePin(DEVICE_GPIO_PIN_LED1, 0);DEVICE_DELAY_US(500000);GPIO_writePin(DEVICE_GPIO_PIN_LED1, 1);DEVICE_DELAY_US(500000);}
}

CPU2:

#include "driverlib.h"
#include "device.h"
#include "inc/hw_ipc.h"

//
// Main
//

#define TXCOUNT  100000
#define MSG_DATA_LENGTH8
#define TX_MSG_OBJ_ID1


#pragma DATA_SECTION(txMsgData, "SHARERAMGS2");
uint16_t txMsgData[8];


void main(void)
{uint16_t ipcFlag17 = 17U;Interrupt_initModule();//// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).//Interrupt_initVectorTable();while(!(HWREG(IPC_BASE + IPC_O_STS) & (1UL << ipcFlag17))){}//// ACK IPC flag 17 for CPU1//HWREG(IPC_BASE + IPC_O_ACK) = 1UL << ipcFlag17;CAN_initModule(CANB_BASE);//// Set up the CAN bus bit rate to 500kHz for each module// Refer to the Driver Library User Guide for information on how to set// tighter timing control. Additionally, consult the device data sheet// for more information about the CAN module clocking.//CAN_setBitRate(CANB_BASE, 200000000, 500000, 20);//// Initialize the transmit message object used for sending CAN messages.// Message Object Parameters://CAN Module: A//Message Object ID Number: 1//Message Identifier: 0x95555555//Message Frame: Extended//Message Type: Transmit//Message ID Mask: 0x0//Message Object Flags: None//Message Data Length: 4 Bytes//CAN_setupMessageObject(CANB_BASE, TX_MSG_OBJ_ID, 0x1,CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 1,CAN_MSG_OBJ_NO_FLAGS, MSG_DATA_LENGTH);// Initialize the transmit message object data buffer to be sent//txMsgData[0] = 0x01;txMsgData[1] = 0x23;txMsgData[2] = 0x45;txMsgData[3] = 0x67;txMsgData[4] = 0x89;txMsgData[5] = 0xAB;txMsgData[6] = 0xCD;txMsgData[7] = 0xEF;//// Start CAN module A operations//CAN_startModule(CANB_BASE);//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;//// Loop Forever//for(;;){GPIO_writePin(DEVICE_GPIO_PIN_LED2, 0);DEVICE_DELAY_US(500000);GPIO_writePin(DEVICE_GPIO_PIN_LED2, 1);DEVICE_DELAY_US(500000);CAN_sendMessage(CANB_BASE, TX_MSG_OBJ_ID, MSG_DATA_LENGTH, txMsgData);}
}

Green Deng:

你好,问题已经收到,但是这个问题我需要咨询一下其他工程师,还请耐心等待一下。

,

Green Deng:

首先这边建议为了方便调试,先不要包含blinky 项目。先从 CPU2 运行 CAN 例程。等CAN工作正常,就可以加个blinky代码。也就是把调试顺序反一下

另外,关于报错,你可以看看这个文档的4.3 How to Get Visibility into Driverlib Files

www.ti.com/…/sprace5a.pdf

,

xiaohao li:

您好,这里在CPU2运行CAN例程,GPIO的初始化以及CANB的控制器选择应该放在CPU1的代码中还是CPU2的代码中

,

Green Deng:

在CPU1中分配引脚并通过CPUSEL8将ownership分配给CPU2就可以了。

“CANB的控制器选择”这个是指什么?

,

Green Deng:

另外可以看看这个帖子:e2e.ti.com/…/ccs-tms320f28379d-can-bus-assigned-to-cpu2

,

xiaohao li:

#include "driverlib.h"
#include "device.h"
#include "inc/hw_ipc.h"void main(void)
{uint16_t ipcFlag17 = 17U;Device_init();Device_initGPIO();GPIO_setPinConfig(GPIO_12_CANTXB);GPIO_setPinConfig(GPIO_17_CANRXB);SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL8_CAN, 2, SYSCTL_CPUSEL_CPU2);HWREG(IPC_BASE + IPC_O_SET) = 1UL << ipcFlag17;//// Initialize PIE and clear PIE registers. Disables CPU interrupts.//Interrupt_initModule();//// Initialize the PIE vector table with pointers to the shell Interrupt// Service Routines (ISR).//Interrupt_initVectorTable();//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;//// Loop Forever//while(1){}
}

这是CPU1的代码。

#include "driverlib.h"
#include "device.h"
#include "inc/hw_ipc.h"//
// Main
//#define TXCOUNT100000
#define MSG_DATA_LENGTH8
#define TX_MSG_OBJ_ID1#pragma DATA_SECTION(txMsgData, "SHARERAMGS2");
uint16_t txMsgData[8];void main(void)
{uint16_t ipcFlag17 = 17U;Device_init();Interrupt_initModule();Interrupt_initVectorTable();while(!(HWREG(IPC_BASE + IPC_O_STS) & (1UL << ipcFlag17))){}//// ACK IPC flag 17 for CPU1//HWREG(IPC_BASE + IPC_O_ACK) = 1UL << ipcFlag17;CAN_initModule(CANB_BASE);//// Set up the CAN bus bit rate to 500kHz for each module// Refer to the Driver Library User Guide for information on how to set// tighter timing control. Additionally, consult the device data sheet// for more information about the CAN module clocking.//CAN_setBitRate(CANB_BASE, 200000000, 500000, 20);//// Initialize the transmit message object used for sending CAN messages.// Message Object Parameters://CAN Module: A//Message Object ID Number: 1//Message Identifier: 0x95555555//Message Frame: Extended//Message Type: Transmit//Message ID Mask: 0x0//Message Object Flags: None//Message Data Length: 4 Bytes//CAN_setupMessageObject(CANB_BASE, TX_MSG_OBJ_ID, 0x1,CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 1,CAN_MSG_OBJ_NO_FLAGS, MSG_DATA_LENGTH);// Initialize the transmit message object data buffer to be sent//txMsgData[0] = 0x01;txMsgData[1] = 0x23;txMsgData[2] = 0x45;txMsgData[3] = 0x67;txMsgData[4] = 0x89;txMsgData[5] = 0xAB;txMsgData[6] = 0xCD;txMsgData[7] = 0xEF;//// Start CAN module A operations//CAN_startModule(CANB_BASE);//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;//// Loop Forever//for(;;){CAN_sendMessage(CANB_BASE, TX_MSG_OBJ_ID, MSG_DATA_LENGTH, txMsgData);DEVICE_DELAY_US(1000000);}
}

这是CPU2的代码。

我按照帖子上面配置的,板子是LaunchPad Development Kit TMS320F28379D系列,上位机一直采集不到信号,您看看哪里还没有配置好。

,

Green Deng:

板子的CAN引脚上有信号吗?

,

xiaohao li:

示波器量的没有信号,幅值一直是2V

,

xiaohao li:

谢谢这些天您的回复,问题解决了,问题在于初始化那里,CAN时钟的初始化应该在CPU2中,代码附上,以便后面的人可以少走一些弯路。

CPU1:

#include "driverlib.h"
#include "device.h"
#include "inc/hw_ipc.h"void Example_Device_init(void);uint16_t ipcFlag17 = 17U;
void main(void)
{Example_Device_init();Device_initGPIO();GPIO_setPinConfig(GPIO_12_CANTXB);GPIO_setPinConfig(GPIO_17_CANRXB);HWREG(IPC_BASE + IPC_O_SET) = 1UL << ipcFlag17;Interrupt_initModule();Interrupt_initVectorTable();//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;while(1){}
}
void Example_Device_init(void)
{//// Disable the watchdog//SysCtl_disableWatchdog();#ifdef _FLASH//// Copy time critical code and flash setup code to RAM. This includes the// following functions: InitFlash();//// The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols// are created by the linker. Refer to the device .cmd file.//memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);//// Call Flash Initialization to setup flash waitstates. This function must// reside in RAM.//Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES);#endif//// Set up PLL control and clock dividers//SysCtl_setClock(DEVICE_SETCLOCK_CFG);SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_4);ASSERT(SysCtl_getClock(DEVICE_OSCSRC_FREQ) == DEVICE_SYSCLK_FREQ);ASSERT(SysCtl_getLowSpeedClock(DEVICE_OSCSRC_FREQ) == DEVICE_LSPCLK_FREQ);SysCtl_selectCPUForPeripheral(SYSCTL_CPUSEL8_CAN, 2, SYSCTL_CPUSEL_CPU2);
}

CPU2:

#include "driverlib.h"
#include "device.h"
#include "inc/hw_ipc.h"#define MSG_DATA_LENGTH8
#define TX_MSG_OBJ_ID1uint16_t txMsgData[8];
uint16_t ipcFlag17 = 17U;void main(void)
{Example_Device_init();Interrupt_initModule();Interrupt_initVectorTable();while(!(HWREG(IPC_BASE + IPC_O_STS) & (1UL << ipcFlag17))){}HWREG(IPC_BASE + IPC_O_ACK) = 1UL << ipcFlag17;CAN_initModule(CANB_BASE);CAN_initRAM(CANB_BASE);//// Set up the CAN bus bit rate to 500kHz for each module// Refer to the Driver Library User Guide for information on how to set// tighter timing control. Additionally, consult the device data sheet// for more information about the CAN module clocking.//CAN_setBitRate(CANB_BASE, 200000000, 500000, 20);//// Initialize the transmit message object used for sending CAN messages.// Message Object Parameters://CAN Module: A//Message Object ID Number: 1//Message Identifier: 0x95555555//Message Frame: Extended//Message Type: Transmit//Message ID Mask: 0x0//Message Object Flags: None//Message Data Length: 4 Bytes//CAN_setupMessageObject(CANB_BASE, TX_MSG_OBJ_ID, 0x1,CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 1,CAN_MSG_OBJ_NO_FLAGS, MSG_DATA_LENGTH);// Initialize the transmit message object data buffer to be sent//txMsgData[0] = 0x01;txMsgData[1] = 0x23;txMsgData[2] = 0x45;txMsgData[3] = 0x67;txMsgData[4] = 0x89;txMsgData[5] = 0xAB;txMsgData[6] = 0xCD;txMsgData[7] = 0xEF;//// Start CAN module A operations//CAN_startModule(CANB_BASE);//// Enable Global Interrupt (INTM) and realtime interrupt (DBGM)//EINT;ERTM;//// Loop Forever//for(;;){CAN_sendMessage(CANB_BASE, TX_MSG_OBJ_ID, MSG_DATA_LENGTH, txMsgData);DEVICE_DELAY_US(1000000);}
}
void Example_Device_init(void)
{//// Disable the watchdog//SysCtl_disableWatchdog();#ifdef _FLASH//// Copy time critical code and flash setup code to RAM. This includes the// following functions: InitFlash();//// The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols// are created by the linker. Refer to the device .cmd file.//memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);//// Call Flash Initialization to setup flash waitstates. This function must// reside in RAM.//Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES);#endifSysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_CANB);
}

赞(0)
未经允许不得转载:TI中文支持网 » LAUNCHXL-F28379D: CAN通信在CPU2中进行通信的问题
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1