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 评估板学习 CAN 通信。
我使用 CANB 端口传输数据、当我使用单个 ID 训练数据时、该数据工作正常。当我添加新 ID 时、我无法传输数据。
我附上了以下代码、请告诉我哪里出错了。
/*
* main.c
*
*创建日期:2021年9月16日
*作者:Devilal
*
#include
#include
#include
#include
#include "F28x_Project.h"
#include "F2837xD_DEVICE.h"
#include "UART_Communications.h"
#include "F2837xD_examples.h"
#include "device.h"
#include "driverlib.h"
//
//定义
//
#define TXCOUNT 100000
#define MSG_DATA_LENGTH 8.
#define TX_MSG_OBJ_ID 1.
#define TX_MSG_OBJ_ID_2 1.
#define RX_MSG_OBJ_ID 2 //使用邮箱1
#define RX_MSG_OBJ_ID_2 //使用邮箱1
//
//全局
//
volatile unsigned long i;
volatile uint32_t txMsgCount = 0;
uint16_t txMsgData_1_8]={0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08};
uint16_t txMsgData_2[8]={0X09X10、0x11、0x12、0x13、0x14、0x15、0x16};
字符 msg[50];
char msg2[100];
char msg3[50];
uint16_t j;
uint16_t rxMsgData[8];
uint16_t rxMsgData_2[8];
uint16_t rxMsgData_3[8];
volatile uint32_t rxMsgCount = 0;
volatile uint32_t rxMsgCount_2 = 0;
volatile uint32_t rxMsgCount_3 = 0;
uint16_t k=0;
void main (void)
{
device_init();
//
//初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚
//在模块 A 上
//
DEVICE_initGPIO();
UART_Init();
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXB);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXB);
CAN_initModule (CANB_BASE);
CAN_setBitRate (CANB_BASE、DEVICE_SYSCLK_FREQ、50000、16);
CAN_setupMessageObject (CANB_BASE、TX_MSG_OBJ_ID、0x18FB47FF、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);
CAN_setupMessageObject (CANA_base、TX_MSG_OBJ_ID_2、0x9555AA、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);
CAN_startModule (CANB_BASE);
//初始化中断控制器和矢量表。
//
interrupt_initModule();
interrupt_initVectorTable();
IER = 0x0000;
IFR = 0x0000;
//将 ISR 映射到唤醒中断。
//
interrupt_register (INT_SCIA_TX、sciaTxISR);
interrupt_register (INT_SCIA_RX、sciaRxISR);
//发送起始消息。
//
UARTA_Transmit 字符串(".......................................................................... \r\n",sizeof (".......................................................................... \r\n");
UARTA_Transmit _String ("\t\t\t CAN 通信\r\n"、sizeof ("\t\t\t CAN 通信\r\n"));
UARTA_Transmit 字符串(".......................................................................... \r\n",sizeof (".......................................................................... \r\n");
SCI_writeCharArray (SCIA_BASE、(uint16_t *)"Devilal\r\n"、sizeof ("Devilal\r\n");
INTERRUPT_ENABLE (INT_SCIA_RX);
INTERRUPT_ENABLE (INT_SCIA_TX);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);
EINT;
while (1)
//
//对无限传输的注释
//
//for (I = 0;I < TXCOUNT;I++)
//
{
CAN_sendMessage (CANB_BASE、TX_MSG_OBJ_ID、MSG_DATA_LENGTH、txMsgData_1);
CAN_sendMessage (CANB_BASE、TX_MSG_OBJ_ID_2、MSG_DATA_LENGTH、txMsgData_2);
while (((HWREGH (CANB_BASE + CAN_O_TXRQ_21))!= 0){}
//}
DEVICE_DELAY_US (50000);
}
}
/*
* main.c
*
*创建日期:2021年9月16日
*作者:Devilal
*
#include
#include
#include
#include
#include "F28x_Project.h"
#include "F2837xD_DEVICE.h"
#include "UART_Communications.h"
#include "F2837xD_examples.h"
#include "device.h"
#include "driverlib.h"
//
//定义
//
#define TXCOUNT 100000
#define MSG_DATA_LENGTH 8.
#define TX_MSG_OBJ_ID 1.
#define TX_MSG_OBJ_ID_2 1.
#define RX_MSG_OBJ_ID 2 //使用邮箱1
#define RX_MSG_OBJ_ID_2 //使用邮箱1
//
//全局
//
volatile unsigned long i;
volatile uint32_t txMsgCount = 0;
uint16_t txMsgData_1_8]={0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08};
uint16_t txMsgData_2[8]={0X09X10、0x11、0x12、0x13、0x14、0x15、0x16};
字符 msg[50];
char msg2[100];
char msg3[50];
uint16_t j;
uint16_t rxMsgData[8];
uint16_t rxMsgData_2[8];
uint16_t rxMsgData_3[8];
volatile uint32_t rxMsgCount = 0;
volatile uint32_t rxMsgCount_2 = 0;
volatile uint32_t rxMsgCount_3 = 0;
uint16_t k=0;
void main (void)
{
device_init();
//
//初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚
//在模块 A 上
//
DEVICE_initGPIO();
UART_Init();
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXB);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXB);
CAN_initModule (CANB_BASE);
CAN_setBitRate (CANB_BASE、DEVICE_SYSCLK_FREQ、50000、16);
CAN_setupMessageObject (CANB_BASE、TX_MSG_OBJ_ID、0x18FB47FF、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);
CAN_setupMessageObject (CANB_BASE、TX_MSG_OBJ_ID_2、0x9555AA、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);
CAN_startModule (CANB_BASE);
//初始化中断控制器和矢量表。
//
interrupt_initModule();
interrupt_initVectorTable();
IER = 0x0000;
IFR = 0x0000;
//将 ISR 映射到唤醒中断。
//
interrupt_register (INT_SCIA_TX、sciaTxISR);
interrupt_register (INT_SCIA_RX、sciaRxISR);
//发送起始消息。
//
UARTA_Transmit 字符串(".......................................................................... \r\n",sizeof (".......................................................................... \r\n");
UARTA_Transmit _String ("\t\t\t CAN 通信\r\n"、sizeof ("\t\t\t CAN 通信\r\n"));
UARTA_Transmit 字符串(".......................................................................... \r\n",sizeof (".......................................................................... \r\n");
SCI_writeCharArray (SCIA_BASE、(uint16_t *)"Devilal\r\n"、sizeof ("Devilal\r\n");
INTERRUPT_ENABLE (INT_SCIA_RX);
INTERRUPT_ENABLE (INT_SCIA_TX);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);
EINT;
while (1)
//
//对无限传输的注释
//
//for (I = 0;I < TXCOUNT;I++)
//
{
CAN_sendMessage (CANB_BASE、TX_MSG_OBJ_ID、MSG_DATA_LENGTH、txMsgData_1);
CAN_sendMessage (CANB_BASE、TX_MSG_OBJ_ID_2、MSG_DATA_LENGTH、txMsgData_2);
while (((HWREGH (CANB_BASE + CAN_O_TXRQ_21))!= 0){}
//}
DEVICE_DELAY_US (50000);
}
}
Devilal、
在 e2e 论坛上、调试您的代码不是我们可以支持的。 因此、我们在 C2000ware 中提供了每个外设的示例。 具体而言、对于 DCAN、我们还有一份有用的应用报告 www.ti.com/lit/SPRACE5。 请查看调试提示。
它显示您正在对两个 Tx 对象使用相同的消息对象(1)。
#define TX_MSG_OBJ_ID 1 #define TX_MSG_OBJ_ID_2 1
尝试使用不同的消息对象、如下所示:
#define TX_MSG_OBJ_ID_1 1 #define TX_MSG_OBJ_ID_2 2
// 最后,我解决了这个问题
//谢谢,先生(Hareesh Janakiraman)
/*
* main.c
*
*创建日期:2021年9月16日
*作者:Devilal
*
//
#include "F28x_Project.h"
#include "F2837xD_DEVICE.h"
#include "F2837xD_examples.h"
#include "UART_Communications.h"
#include "device.h"
#include "driverlib.h"
#include
#include
#include
#include
//
//定义
//
#define TXCOUNT 100000
#define MSG_DATA_LENGTH 8.
#define TX_MSG_OBJ_ID 1.
#define TX_MSG_OBJ_ID_2 1.
#define RX_MSG_OBJ_ID 2 //使用邮箱1
#define RX_MSG_OBJ_ID_2 //使用邮箱1
//
//全局
//
volatile unsigned long i;
volatile uint32_t txMsgCount = 0;
uint16_t txMsgData_1_8]={0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08};
uint16_t txMsgData_2[8]={0X09X10、0x11、0x12、0x13、0x14、0x15、0x16};
uint16_t txMsgData_3[8]={0X17、0X18、0x19、0x20、0x21、0x22、0x23、0x24};
字符 msg[50];
char msg2[100];
char msg3[50];
uint16_t j;
uint16_t rxMsgData[8];
uint16_t rxMsgData_2[8];
uint16_t rxMsgData_3[8];
volatile uint32_t rxMsgCount = 0;
volatile uint32_t rxMsgCount_2 = 0;
volatile uint32_t rxMsgCount_3 = 0;
uint16_t k=0;
void main (void)
{
device_init();
//
//初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚
//在模块 A 上
//
DEVICE_initGPIO();
UART_Init();
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXB);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXB);
CAN_initModule (CANB_BASE);
CAN_setBitRate (CANB_BASE、DEVICE_SYSCLK_FREQ、50000、16);
CAN_setupMessageObject (CANB_BASE、1、0x18FB47FF、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);
CAN_setupMessageObject (CANB_BASE、2、0x12345、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);
CAN_setupMessageObject (CANB_BASE、3、0x6789A、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_NO_FLAGS、MSG_DATA_LENGTH);
CAN_startModule (CANB_BASE);
//初始化中断控制器和矢量表。
//
interrupt_initModule();
interrupt_initVectorTable();
IER = 0x0000;
IFR = 0x0000;
//将 ISR 映射到唤醒中断。
//
interrupt_register (INT_SCIA_TX、sciaTxISR);
interrupt_register (INT_SCIA_RX、sciaRxISR);
//发送起始消息。
//
UARTA_Transmit 字符串(".......................................................................... \r\n",sizeof (".......................................................................... \r\n");
UARTA_Transmit _String ("\t\t\t CAN 通信\r\n"、sizeof ("\t\t\t CAN 通信\r\n"));
UARTA_Transmit 字符串(".......................................................................... \r\n",sizeof (".......................................................................... \r\n");
SCI_writeCharArray (SCIA_BASE、(uint16_t *)"Devilal\r\n"、sizeof ("Devilal\r\n");
INTERRUPT_ENABLE (INT_SCIA_RX);
INTERRUPT_ENABLE (INT_SCIA_TX);
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);
EINT;
while (1)
//
//对无限传输的注释
//
//for (I = 0;I < TXCOUNT;I++)
//
{
CAN_sendMessage (CANB_BASE、1、MSG_DATA_LENGTH、txMsgData_1);
CAN_sendMessage (CANB_BASE、2、MSG_DATA_LENGTH、txMsgData_2);
CAN_sendMessage (CANB_BASE、3、MSG_DATA_LENGTH、txMsgData_3);
while ((((HWREGH (CANB_BASE + CAN_O_ES)& CAN_ES_TXOK))= CAN_ES_TXOK)
{
}
// while (((HWREGH (CANB_BASE + CAN_O_TXRQ_21))!= 0){}
//}
DEVICE_DELAY_US (1000000);
}
}