大家好、
使用 setubject 方法配置了两个消息对象:一个是 TX、另一个是 Rx。
想要在 getcanmessage 中提取接收报文对象中的报文标识符、如下所示、为什么 if2arb 寄存器中不提供报文 ID、因为通过将 msgnum 分配给 if2cmd 寄存器集、if2data 寄存器中可以提供数据。
由于已使用 if1arb 重定位器设置消息,因此即使在 getcanmessage 方法中将 msgnum 分配给 if2cmd 寄存器集,消息 ID 仅在 if1arb 寄存器中可用。
请清除这些混乱????
「香港
//
// getCANMessage -检查消息对象是否有新数据。
//如果是新数据,则写入数组并返回 true 的数据。
//如果没有新数据,则返回 false。
//
bool getCANMessage (uint32_t Objid)
{
bool 状态;
uint32_t arbreg1value;
uint32_t arbreg2value;
uint32_t msgid1;
uint32_t msgid2;
//
//设置要读取的消息数据 A、数据 B 和控制值
//从报文对象请求数据时。
//
CANARegs.CAN_IF2CMD.ALL = 0;
CANARegs.CAN_IF2CMD.bit.Control = 1;
CANARegs.CAN_IF2CMD.bit.DATA_A = 1;
CANARegs.CAN_IF2CMD.bit.DATA_B = 1;
//
//将报文对象传输到报文对象 IF 寄存器。
//
CANARegs.CAN_IF2CMD.bit.MSG_NUM = Objid;
//
//等待忙位清零。
//
while (CANaRegs.CAN_IF2CMD.bit.BUSY)
{
}
//
//查看是否有可用的新数据。
//
if (CANaRegs.CAN_IF2MCTL.bit.NewDat = 1)
{
//
//从 CAN 寄存器中读出数据。
//
uint16_t 索引;
arbreg1value = CanaRegs.CAN_IF1ARB.all;
arbreg1value = arbreg1value & CAN_IF1ARB_STD_ID_M;
msgid1 = arbreg1value >> CAN_IF1ARB_STD_ID_S; // if1arg 寄存器中存在预期值
arbreg2value = CanaRegs.CAN_IF2ARB.all;
arbreg2value = arbreg2value & CAN_IF1ARB_STD_ID_M;
msgid2 = arbreg2value >> CAN_IF1ARB_STD_ID_S;
for (index = 0;index < messageSize;index++)
{
switch (索引)
{
情况0:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATA.bit.Data_0;
中断;
案例1:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATA.bit.Data_1;
中断;
案例2:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATA.bit.Data_2;
中断;
案例3:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATA.bit.Data_3;
中断;
案例4:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATB.bit.Data_4;
中断;
情况5:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATB.bit.Data_5;
中断;
案例6:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATB.bit.Data_6;
中断;
案例7:
ucRXMsgData[index]= CANaRegs.CAN_IF2DATB.bit.Data_7;
中断;
}
}
//
//清除新数据标志
//
CANaRegs.CAN_IF2CMD.bit.TxRqst = 1;
//
//等待忙位清零。
//
while (CANaRegs.CAN_IF2CMD.bit.BUSY)
{
}
//
//将报文对象传输到报文对象 IF 寄存器。
//
CANARegs.CAN_IF2CMD.bit.MSG_NUM = Objid;
状态= true;
}
其他
{
状态= false;
}
退货(状态);
}
「香港
设置对象对于 TX 消息和 Rx 消息对象都是通用的、如下所示。
(小部分
//
// setupMessageObject -将消息对象设置为发送或接收
//
void setupMessageObject (uint32_t Objid、uint32_t msgid、msgObjType msgType)
{
//
//等待忙位清零。
//
while (CANaRegs.CAN_IF1CMD.bit.BUSY)
{
}
//
//清除并写出寄存器以编程报文对象。
//
CANARegs.CAN_IF1CMD.ALL = 0;
CANaRegs.CAN_IF1MSK.ALL = 0;
CanaRegs.CAN_IF1ARB.all = 0;
CANaRegs.CAN_IF1MCTL.ALL = 0;
//
//设置 Control、Mask 和 ARB 位,以便将它们传送到
//消息对象。
//
CANARegs.CAN_IF1CMD.bit.Control = 1;
CanaRegs.CAN_IF1CMD.bit.ARB = 1;
CANARegs.CAN_IF1CMD.bit.Mask = 1;
CANARegs.CAN_IF1CMD.bit.DIR = 1;
//
//设置发送方向
//
if (msgType = MSG_obj_type_transmit)
{
CANARegs.CAN_IF1ARB.bit.Dir = 1;
}
//根据第2246页
//CanaRegs.CAN_IF1MCTL.bit.umask = 0x7ff;
//
//设置消息 ID (此示例假定11位 ID 掩码)
//StdID
CANaRegs.CAN_IF1ARB.bit.XTD = 0;
msgid =(msgid << CAN_IF1ARB_STD_ID_S);
msgid = msgid & CAN_IF1ARB_STD_ID_M;
CanaRegs.CAN_IF1ARB.bit.ID = msgid;
//CanaRegs.CAN_IF1ARB.bit.StdID = msgid;
CANARegs.CAN_IF1ARB.bit.MsgVal = 1;
//
//设置数据长度,因为这是为所有传输设置的。 这是
//也是单次传输,而不是 FIFO 传输,所以将 EOB 位置位。
//
CanaRegs.CAN_IF1MCTL.bit.DLC =消息大小;
CANaRegs.CAN_IF1MCTL.bit.EOB = 1;
//
//将数据传输到消息对象 RAM
//
CANaRegs.CAN_IF1CMD.bit.MSG_NUM = Objid;
}
(小部分
谢谢