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.

TMS320F280049C: CANB的初始化

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;
}
}
}

  • 建议您确认一下问题

    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;

  • 在CANA的时候是正常的收发状态但是到了CANB就是上面描述的样子。

  • 现在找到了问题所在:

    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);
    }

  • 请问您现在改写的是哪个例程?can_ex1_loopback?

  • 是的用的can_ex1_loopback

  • 是的用的can_ex1_loopback

  • 您现在使用的是launchpad?需要注意的是 launchpad的CAN 收发器仅连接到 GPIO32 和 GPIO33 引脚。

    这意味着只有上述引脚可用于 CAN 功能且只能用作 CAN-A。无法在 LaunchPAD 中使用 CANB。只有 CANA 可用且仅在 GPIO32 和 GPIO33 上可用。

  • 那如果是LAUNCHXL-F280049呢?这种的呢?和launchpad是一样的么?

  • 我手里现在3块板卡,1块是launchpad-28377S,2块是LAUNCHXL-280049.这三块板卡之间是要通信的。

  • 我指的就是LAUNCHXL-F280049,即F280049 的launchpad

  • 这三块板卡之间是要通信的。

    请问具体是怎样通信?能否详细说明一下?

  • 使用CANB通信,是不能用了?

  • 可以使用,但是您需要自己外接can收发器