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.

28377D CAN通讯 可以接收指定ID的数据 不能接收任意其他ID报文

Other Parts Discussed in Thread: CONTROLSUITE

28377D可以,通过CAN盒,接收到下面配置的ID   0x10000008;   的数据

但是CAN盒发送其他ID的数据,则不能收到,

就是只能接收,配置的时候指定的ID的数据,其他ID的数据就不能接到,

和ecan的读取方式区别有点大

下面是部分代码,根据TI的例程改的

#define TX_MSG_OBJ_ID    2
#define RX_MSG_OBJ_ID    1

// Initialize the transmit message object used for sending CAN messages.
 // Message Object Parameters:

     sTXCANMessage.ui32MsgID = 0x10000008;
     sTXCANMessage.ui32MsgIDMask = 0;
     sTXCANMessage.ui32Flags = 0;
     sTXCANMessage.ui32MsgLen = MSG_DATA_LENGTH;
     sTXCANMessage.pucMsgData = txMsgData;

     //
 // Initialize the receive message object used for receiving CAN messages.
 // Message Object Parameters:
 //
 sRXCANMessage.ui32MsgID = 0x10000008;
 sRXCANMessage.ui32MsgIDMask = 0;//0x1fffffff;
 sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE;
 sRXCANMessage.ui32MsgLen = MSG_DATA_LENGTH;
 sRXCANMessage.pucMsgData = rxMsgData;
 CANMessageSet(CANA_BASE, RX_MSG_OBJ_ID, &sRXCANMessage,MSG_OBJ_TYPE_RX);
     // Initialize the transmit message object data buffer to be sent

中断函数---若CAN盒发送的数据ID 为  0x10000008,则可以获取到数据

                   若ID为其他,则不能获取到数据

// 9.5 - CANA Interrupt 1
Void CANA_1_ISR()
{
    // Insert ISR Code here
    Uint32 status;


    status = CANIntStatus(CANA_BASE, CAN_INT_STS_CAUSE);


    // If the cause is a controller status interrupt, then get the status
    if(status == CAN_INT_INT0ID_STATUS)
    {
        status = CANStatusGet(CANA_BASE, CAN_STS_CONTROL);

        // Check to see if an error occurred.
        if(((status  & ~(CAN_ES_RXOK)) != 7) &&
           ((status  & ~(CAN_ES_RXOK)) != 0))
        {
            // Set a flag to indicate some errors may have occurred.
            //errorFlag = 1;
         errorFlag++;//
        }
    }
    // Check if the cause is the CAN-B receive message object 1
    else if(status == RX_MSG_OBJ_ID)   //此处ID为0x10000008则可以读取到数据,其他ID,status就不能触发进到这里
    {
        //
        // Get the received message
        //
        CANMessageGet(CANA_BASE, RX_MSG_OBJ_ID, &sRXCANMessage, true);   
        CANIntClear(CANA_BASE, RX_MSG_OBJ_ID);

    }
    else
    {}

    // Clear the global interrupt flag for the CAN interrupt line
    CANGlobalIntClear(CANA_BASE, CAN_GLB_INT_CANINT0);
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
}

  • 若是可以的话,请您以附件形式上传一下您的完整程序。您修改的是哪个例程呢?

    一般来说,当maskID都为“ 0”并且未设置标志CAN_MSG_OBJ_USE_ID_FILTER时,不进行任何过滤。

    您的CAN_setupMessageObject函数是如何设置的呢?
  • can func.zip

    工程文件,不太好传上来,附件只有CAN相关的两个文件,可以帮忙看下,

    是根据

    C:\ti\controlSUITE\device_support\F2837xD\v210\F2837xD_examples_Cpu1\can_external_transmit\cpu01

    这个例程改的

  • CAN_MSG_OBJ_USE_ID_FILTER 在代码中默认将其设置为true的。

    //! This indicates that a message object will use or is using filtering
    //! based on the object's message identifier.
    #define CAN_MSG_OBJ_USE_ID_FILTER (0x00000001U)

    我看您在代码中设置了CAN_MSG_OBJ_USE_ID_FILTER,也就是进行了ID 过滤

    如之前所说,当maskID都为“ 0”并且未设置标志CAN_MSG_OBJ_USE_ID_FILTER时,不进行任何过滤。
  • 做了如下,两个操作,还是一样的

    //! This indicates that a message object will use or is using filtering
    //! based on the object's message identifier.


    #define MSG_OBJ_USE_ID_FILTER           0x00000000;     //0x00000008

    在CANMessageSet(uint32_t ui32Base, uint32_t ui32ObjID, tCANMsgObject *pMsgObject,tMsgObjType eMsgType)中

        HWREGH(ui32Base + CAN_O_IF1MSK) = 0;      //ui32MaskReg & CAN_REG_WORD_MASK;
        HWREGH(ui32Base + CAN_O_IF1MSK + 2) = 0;       //ui32MaskReg >> 16;

  • 你好,请问有没有遇到过,初始化if2mask,就是maskID滤波设置为0,且语句已执行了。

    在can接收过程中,再次读取if2mask,对应的maskID就会有值了,但是软件中没有赋值的地方,

    就导致idfilter生效了

  • 我们继续在您的新帖中讨论

    e2echina.ti.com/.../188269