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.
以下是我的CANB的初始化程序,麻烦帮我看看哪里出了问题。由原来的CANA改CANB ,原来CANA的时候是好用的修改成CANB就不好用了。
GPIO_setPinConfig(DEVICE_GPIO_CFG_CANRXB);
GPIO_setPinConfig(DEVICE_GPIO_CFG_CANTXB);
CAN_initModule(CANB_BASE);
CAN_setBitRate(CANB_BASE, DEVICE_SYSCLK_FREQ, 500000, 20);
EPWM_INIT_GPIO();
EPWM_INIT_func();
PwmEnable();
Control_Init(); //控制参数初始化
EINT; //Enable interrupts globally
ERTM;
CAN_enableTestMode(CANB_BASE, CAN_TEST_EXL);
CAN_setupMessageObject(CANB_BASE, 1, 0x18102700, CAN_MSG_FRAME_EXT,
CAN_MSG_OBJ_TYPE_TX, 0x0, CAN_MSG_OBJ_NO_FLAGS ,
MSG_DATA_LENGTH);
CAN_setupMessageObject(CANB_BASE, 2, 0x18102700, CAN_MSG_FRAME_EXT,
CAN_MSG_OBJ_TYPE_RX, 0x0, CAN_MSG_OBJ_USE_EXT_FILTER,
MSG_DATA_LENGTH);
CAN_startModule(CANB_BASE);
temp_txMsgData[0]=0x1234;
temp_txMsgData[1]=0x5678;
txMsgData[0] = temp_txMsgData[0]>>8;
txMsgData[1] = temp_txMsgData[0]&0xFF;
txMsgData[2] = temp_txMsgData[1]>>8;
txMsgData[3] = temp_txMsgData[1]&0xFF;
*(uint16_t *)rxMsgData = 0;
while(1)
{
CAN_sendMessage(CANB_BASE, 1, MSG_DATA_LENGTH, txMsgData);
DEVICE_DELAY_US(500000);
if (CAN_readMessage(CANB_BASE, 2, rxMsgData))
{
// Check that received data matches sent data.
// Device will halt here during debug if data doesn't match.
if((txMsgData[0] != rxMsgData[0])||(txMsgData[1] != rxMsgData[1])||
(txMsgData[2] != rxMsgData[2])||(txMsgData[3] != rxMsgData[3]))
{
Example_Fail = 1;
asm(" ESTOP0");
}
else
{
temp_rxMsgData[0]=rxMsgData[0]<<8|rxMsgData[1];
temp_rxMsgData[1]=rxMsgData[2]<<8|rxMsgData[3];
// Increment message received counter
msgCount++;
Example_PassCount++;
}
}
else
{
//
// Device will halt here during debug if no new data was received.
//
Example_Fail = 1;
asm(" ESTOP0");
}
txMsgData[0] += 0x01;
txMsgData[1] += 0x01;
if(txMsgData[0] > 0xFF)
{
txMsgData[0] = 0;
}
if(txMsgData[1] > 0xFF)
{
txMsgData[1] = 0;
}
}
}
建议您确认一下问题
1 您的CANB引脚是否设置正确?您使用的是launchpad?
2 请使用内部的loopback先测试一下,以确保配置没有问题
3 您现在是测试不成功的表现是什么?
4 后续上传代码的话,请使用“”插入-->代码“的形式,谢谢
1、
#define DEVICE_GPIO_CFG_CANRXB GPIO_10_CANRXB // "pinConfig" for CANB RX
#define DEVICE_GPIO_CFG_CANTXB GPIO_8_CANTXB // "pinConfig" for CANB TX
2、就是采用的loopback测试的不好用了,现象为
while(1)
{
CAN_sendMessage(CANB_BASE, 1, MSG_DATA_LENGTH, txMsgData);
DEVICE_DELAY_US(500000);
if (CAN_readMessage(CANB_BASE, 2, rxMsgData))
{
// Check that received data matches sent data.
// Device will halt here during debug if data doesn't match.
if((txMsgData[0] != rxMsgData[0])||(txMsgData[1] != rxMsgData[1])||
(txMsgData[2] != rxMsgData[2])||(txMsgData[3] != rxMsgData[3]))
{
Example_Fail = 1;
asm(" ESTOP0");
}
else
{
temp_rxMsgData[0]=rxMsgData[0]<<8|rxMsgData[1];
temp_rxMsgData[1]=rxMsgData[2]<<8|rxMsgData[3];
// Increment message received counter
msgCount++;
Example_PassCount++;
}
}
else
{
//
// Device will halt here during debug if no new data was received.
//
Example_Fail = 1;
asm(" ESTOP0"); //直接跑到这了
}
txMsgData[0] += 0x01;
txMsgData[1] += 0x01;
现在找到了问题所在:
if((msgCtrl & CAN_IF2MCTL_NEWDAT) == CAN_IF2MCTL_NEWDAT)
{
//
// Read out the data from the CAN registers.
//
CAN_readDataReg(msgData, (base + CAN_O_IF2DATA),//CAN_O_IF2DATA这里面没有数据
(msgCtrl & CAN_IF2MCTL_DLC_M));
现在的状态数据发出去了,但是没有没有发送至CAN_O_IF2DATA数据寄存器中。
不知道发哪去了?
还有一个问题,
CAN_startModule(uint32_t base)
{
//
// Check the arguments.
//
ASSERT(CAN_isBaseValid(base)); //这句不执行不知道为啥,有没有办法解决一下么。
//
// Clear Init and CCE bits
//
HWREGH(base + CAN_O_CTL) &= ~(CAN_CTL_INIT | CAN_CTL_CCE);
}
您现在使用的是launchpad?需要注意的是 launchpad的CAN 收发器仅连接到 GPIO32 和 GPIO33 引脚。
这意味着只有上述引脚可用于 CAN 功能且只能用作 CAN-A。无法在 LaunchPAD 中使用 CANB。只有 CANA 可用且仅在 GPIO32 和 GPIO33 上可用。