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