void CANMessageGet(uint32_t ui32Base, uint32_t ui32ObjID, tCANMsgObject *pMsgObject,bool bClrPendingInt)
这个函数完成对消息邮箱中数据的读取。有个疑问之一:
if(bClrPendingInt) { //这条语句是真,会执行。
ui32CmdMaskReg |= CAN_IF2CMD_CLRINTPND | CAN_IF2CMD_TXRQST;
}
//完成把清零消息邮箱中INTPND和NEWDATA标志位的指令写入IF2CMD
HWREGH(ui32Base + CAN_O_IF2CMD + 2) = ui32CmdMaskReg >> 16;
//触发上一条指令指定的操作内容,开始执行消息邮箱的数据、附加属性等的传输
HWREGH(ui32Base + CAN_O_IF2CMD) = ui32ObjID & CAN_IF2CMD_MSG_NUM_M;
按说这里,既然清除INTPND和NEWDATA的指令已经执行了,那么传输到消息邮箱中的这两个位就处于复位值0,那么传输到IF寄存器对应位置的内容也是复位后的值,但是实际上不是这样的,原始数据手册中说,实际上消息邮箱中的这两个位虽然清零了,,但是传输这两个位到IF寄存器中是在清零之前执行的。所以还是可以传输清零之前的值。:
这样后面那句话就好理解了:
// See if there is new data available.
if(ui32MsgCtrl & CAN_IF2MCTL_NEWDAT)这句话是询问IF寄存器中NEWDTA标志位是否置位了,由于这个标志位反应的是上面清零之前的消息邮箱中newdate的信息情况,所以当执行这个函数时时,有了消息进来,这句话就会执行。