Part Number:TMS320F280049C
以下是我的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;
}
}
}
Susan Yang:
建议您确认一下问题
1 您的CANB引脚是否设置正确?您使用的是launchpad?
2 请使用内部的loopback先测试一下,以确保配置没有问题
3 您现在是测试不成功的表现是什么?
4 后续上传代码的话,请使用“”插入–>代码“的形式,谢谢
,
shipeng huang:
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;
,
shipeng huang:
在CANA的时候是正常的收发状态但是到了CANB就是上面描述的样子。
,
shipeng huang:
现在找到了问题所在:
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数据寄存器中。
不知道发哪去了?
,
shipeng huang:
还有一个问题,
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);}
,
Susan Yang:
请问您现在改写的是哪个例程?can_ex1_loopback?
,
shipeng huang:
是的用的can_ex1_loopback
,
shipeng huang:
是的用的can_ex1_loopback
,
Susan Yang:
您现在使用的是launchpad?需要注意的是 launchpad的CAN 收发器仅连接到 GPIO32 和 GPIO33 引脚。
这意味着只有上述引脚可用于 CAN 功能且只能用作 CAN-A。无法在 LaunchPAD 中使用 CANB。只有 CANA 可用且仅在 GPIO32 和 GPIO33 上可用。
,
shipeng huang:
那如果是LAUNCHXL-F280049呢?这种的呢?和launchpad是一样的么?
,
shipeng huang:
我手里现在3块板卡,1块是launchpad-28377S,2块是LAUNCHXL-280049.这三块板卡之间是要通信的。
,
Susan Yang:
我指的就是LAUNCHXL-F280049,即F280049 的launchpad
,
Susan Yang:
shipeng huang 说:这三块板卡之间是要通信的。
请问具体是怎样通信?能否详细说明一下?
,
shipeng huang:
使用CANB通信,是不能用了?
,
Susan Yang:
可以使用,但是您需要自己外接can收发器