TI中文支持网
TI专业的中文技术问题搜集分享网站

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

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

Susan Yang:

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

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

您的CAN_setupMessageObject函数是如何设置的呢?

user1787896:

回复 Susan Yang:

can func.zip

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

是根据

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

这个例程改的

Susan Yang:

回复 user1787896:

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时,不进行任何过滤。

user1787896:

回复 Susan Yang:

做了如下,两个操作,还是一样的

//! 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;

user1787896:

回复 Susan Yang:

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

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

就导致idfilter生效了

Susan Yang:

回复 user1787896:

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

e2echina.ti.com/…/188269

赞(0)
未经允许不得转载:TI中文支持网 » 28377D CAN通讯 可以接收指定ID的数据 不能接收任意其他ID报文
分享到: 更多 (0)