void canBus::processMessage (uint8_t a_msgNo)
{
uint32_t msgId;
can_msg msg;
while (LPC_CAN->IF2_CMDREQ & CMDREQ_BUSY);
LPC_CAN->IF2_CMDMSK = WR_RD|MASK|ARB|CTRL|INTPND|TREQ|DATAA|DATAB;
LPC_CAN->IF2_CMDREQ = a_msgNo;
while (LPC_CAN->IF2_CMDREQ & CMDREQ_BUSY);
if (IS_BIT_ENABLED(LPC_CAN->IF2_ARB2, MSG_EXTENDED)) {
msgId = (LPC_CAN->IF2_ARB1 | ((LPC_CAN->IF2_ARB2&0x5fff)<<16));
}
else {
msgId = (LPC_CAN->IF2_ARB2 & ID_STD_MASK) >> 2;
}
msg.ident = msgId;
msg.len = MIN(LPC_CAN->IF2_MCTRL & 0x0f, 8);
switch (msg.len) {
case 8:
case 7:
msg.data[7] = LPC_CAN->IF2_DB2>>8;
msg.data[6] = LPC_CAN->IF2_DB2;
case 6:
case 5:
msg.data[5] = LPC_CAN->IF2_DB1>>8;
msg.data[4] = LPC_CAN->IF2_DB1;
case 4:
case 3:
msg.data[3] = LPC_CAN->IF2_DA2>>8;
msg.data[2] = LPC_CAN->IF2_DA2;
case 2:
case 1:
msg.data[1] = LPC_CAN->IF2_DA1>>8;
msg.data[0] = LPC_CAN->IF2_DA1;
break;
default:
break;
}
}
|