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:从 CPU1接收到 IPC 命令后、CPU2在 CAN 初始化期间卡滞

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1480094/launchxl-f28379d-cpu2-stuck-during-can-initialization-after-receiving-ipc-command-from-cpu1

器件型号:LAUNCHXL-F28379D

工具与软件:

您好!

在我的项目中、我将使用两个 CPU、其中 CPU1通过处理器间通信(IPC)向 CPU2发送命令。 接收到来自 CPU1的命令后、CPU2发送存储在其缓冲器中的 CAN 数据。 CPU2从外部源接收 CAN 数据。 但我遇到了一个问题:启动或运行代码时、CPU2在 CAN 初始化期间会卡住。 调试时、代码在can_initialization_RAM该段中暂停。

我已按照 C2000 多核开发用户指南中提供的指导原则配置 CPU1和 CPU2之间的 IPC 通信。 具体而言、我已确保 CPU1将数据写入 CPU1_TO_CPU2 MSGRAM、而 CPU2从该位置读取数据。  

CPU1代码
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//包含的文件
//
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include "ipc.h"
#include "memcfg.h"

//
//定义
//
#define IPC_CMD_READ_CAN 0x1002

#define CPU1_TO_CPU2_FLAG IPC_FLAG0
#define CPU2_TO_CPU1_FLAG IPC_FLAG1
#define SYNC_FLAG IPC_FLAG31

#define CAN_DATA_SIZE 8.

#pragma DATA_SECTION (canData、"MSGRAM_CPU2_TO_CPU1")

易失性 uint32_t canData[CAN_DATA_SIZE];

//
//使 LED 闪烁
//
void blinkLED()

GPIO_togglePin (DEVICE_GPIO_PIN_LED1);
DEVICE_DELAY_US (500000);
GPIO_togglePin (DEVICE_GPIO_PIN_LED1);
}

//
// Main 函数
//
void main (void)

//初始化设备和外设
device_init();
// MemCfg_initSections (MEMCFG_SEC_MSGRAM_CPU2_TO_CPU1);
//MemCfg_initSections (MEMCFG_SEC_MSGRAM_CPU2_TO_CPU1);
Interrupt_initModule();
interrupt_initVectorTable();
board_init();

//配置 LED 引脚
GPIO_setPinConfig (DEVICE_GPIO_PIN_LED1);
GPIO_setDirectionMode (DEVICE_GPIO_PIN_LED1、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (DEVICE_GPIO_PIN_LED1、GPIO_PIN_TYPE_STD);
GPIO_setMasterCore (DEVICE_GPIO_PIN_LED1、GPIO_CORE_CPU1);

//初始化 IPC 并与 CPU2同步
IPC_clearFlagLtoR (IPC_CPU1_L_CPU2_R、IPC_FLAG_ALL);
IPC_SYNC (IPC_CPU1_L_CPU2_R、SYNC_FLAG);

eint;//启用全局中断
ERTM;

// while (1)
//{
//向 CPU2请求 CAN 数据
// ipc_sendCommand (IPC_CPU1_L_CPU2_R、CPU1_TO_CPU2_FLAG、IPC_ADDR_CORRECTION_ENABLE、
// IPC_CMD_READ_CAN、0、0);
//
////访问数据之前等待 CPU2响应
// ipc_waitForAck (ipc_CPU1_L_CPU2_R、CPU2_TO_CPU1_FLAG);
//
////接收到数据后立即闪烁 LED
// blinkLED ();
//
// device_delay_US (1000000);
//}

while (1)

//从 CPU2请求 CAN 数据
IPC_sendCommand (IPC_CPU1_L_CPU2_R、CPU1_TO_CPU2_FLAG、IPC_ADDR_CORRECTION_ENABLE、
IPC_CMD_READ_CAN、0、0);

//访问数据之前等待 CPU2响应
IPC_waitForAck (IPC_CPU1_L_CPU2_R、CPU2_TO_CPU1_FLAG);

//检查接收到的数据
uint8_t i;
bool 有效= true;
for (I = 0;I < CAN_DATA_SIZE;I++)

if (canData[i]== 0)

有效= false;
休息;
}
}

if (有效)

blinkLED();
}

DEVICE_DELAY_US (1000000);
}
}
CPU2代码
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
//包含的文件
//
#include "device.h"
#include "can.h"
#include "interrupt.h"
#include "sysctl.h"
#include "board.h"
#include "ipc.h"

//
//定义
//
#define IPC_CMD_READ_CAN 0x1002
#define IPC_CMD_RESP 0x2002

#define CPU1_TO_CPU2_FLAG IPC_FLAG0
#define CPU2_TO_CPU1_FLAG IPC_FLAG1
#define SYNC_FLAG IPC_FLAG31

#define TX_MSG_OBJ_ID 1.
#define RX_MSG_OBJ_ID 1.
#define MSG_DATA_LENGTH 8.


//#pragma DATA_SECTION (rxMsgData、"MSGRAM_CPU1_TO_CPU2")
//volatile uint16_t rxMsgData[MSG_DATA_LENGTH]={0};

#pragma DATA_SECTION (rxMsgData、"GSRAM");
volatile uint16_t rxMsgData[MSG_DATA_LENGTH]={0};

//
//函数原型
//
_interrupt void IPC_ISR0 (void);
_interrupt void canbISR (void);

//
// Main 函数
//
void main (void)

//初始化设备和 GPIO
device_init();
// MemCfg_initSections (MSGRAM_CPU1_TO_CPU2);
device_initGPIO();

//为 RX 配置 CANB
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXB);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXB);


//初始化 CANB 模块
CAN_initModule (CANB_BASE);
CAN_setBitRate (CANB_BASE、DEVICE_SYSCLK_FREQ、500000、20);

//启用 CANB 中断
CAN_enableInterrupt (CANB_BASE、CAN_INT_IE0 | CAN_INT_ERROR | CAN_INT_STATUS);

//初始化中断系统
Interrupt_initModule();
INTERRUPT_REGISTER (INT_CANB0、&C);
INTERRUPT_ENABLE (INT_CANB0);

//设置 RX 消息对象
CAN_setupMessageObject (CANB_BASE、RX_MSG_OBJ_ID、0x1、CAN_MSG_FRAME_STD、
CAN_MSG_OBJ_TYPE_RX、0、CAN_MSG_OBJ_RX_INT_ENABLE、MSG_DATA_LENGTH);

can_startModule (cNB_BASE);

// IPC 初始化
IPC_clearFlagLtoR (IPC_CPU2_L_CPU1_R、IPC_FLAG_ALL);
IPC_SYNC (IPC_CPU2_L_CPU1_R、SYNC_FLAG);

//寄存器 IPC 中断
interrupt_register (INT_IPC_0、IPC_ISR0);
INTERRUPT_ENABLE (INT_IPC_0);

//启用全局中断
EINT;
ERTM;

while (1);
}

//
// CANB 中断服务例程(ISR)
//
_interrupt void canbISR (void)

uint32_t status = can_getInterruptCAse (CANB_BASE);

if (STATUS == RX_MSG_OBJ_ID)

//读取接收到的 CAN 数据
can_readMessage (CANB_BASE、RX_MSG_OBJ_ID、(uint16_t*) rxMsgData);
}

CAN_clearGlobalInterruptStatus (CANB_BASE、CAN_GLOBAL_INT_CANINT0);
interrupt_clearACKGroup (interrupt_ACK_group9);
}

//
// IPC 中断服务例程(处理 CPU1 -> CPU2命令)
//
__interrupt void IPC_ISR0 (void)

uint32_t 命令;

//从 CPU1读取 IPC 命令
IPC_readCommand (IPC_CPU2_L_CPU1_R、CPU1_TO_CPU2_FLAG、IPC_ADDR_CORRECTION_ENABLE、
COMMAND、NULL、NULL);

如果(命令== IPC_CMD_READ_CAN)

uint8_t i;
//通过 IPC 将存储的 CAN 数据发送到 CPU1
对于(I = 0;I < MSG_DATA_LENGTH;I++)

IPC_sendCommand (IPC_CPU2_L_CPU1_R、CPU2_TO_CPU1_FLAG、IPC_ADDR_CORRECTION_ENABLE、
IPC_CMD_RESP、rxMsgData[i]、i);
}

//等待 CPU1确认接收
IPC_waitForAck (IPC_CPU2_L_CPU1_R、CPU2_TO_CPU1_FLAG);
}

IPC_ackFlagRtoL (IPC_CPU2_L_CPU1_R、CPU1_TO_CPU2_FLAG);
interrupt_clearACKGroup (INTERRUPT_ACK_GROUP1);
}