在我这样的傻瓜看来,对STR71x库函数的使用只要按要求填数据便可。
CAN的报文结构在STR71x库中定义为: typedef struct { int IdType; u32 Id; u8 Dlc; u8 Data[8]; } canmsg;
我认为,如果要发送一个ID为0x12345678的扩展帧,8字节数据为0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07
那么,准备好往一个canmsg结构变量填 { CAN_EXT_ID, 0x12345678, 8, { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }即可。
可是经CAN_SendMessage函数一处理,ID都面目全非了。
u32 CAN_SendMessage(u32 msgobj, canmsg* pCanMsg) { while (CAN->sMsgObj[0].CRR & CAN_CRR_BUSY);
/* if (CAN->sMsgObj[0].COMR & CAN_CRQ_BUSY) */ /* return 0; // message interface 0 not free */
CAN->SR &= ~CAN_SR_TXOK;
/* read the Arbitration and Message Control */ CAN->sMsgObj[0].CMR = CAN_CMR_ARB | CAN_CMR_CONTROL;
CAN->sMsgObj[0].CRR = 1 + msgobj;
while (CAN->sMsgObj[0].CRR & CAN_CRR_BUSY);
/* update the contents needed for transmission */ CAN->sMsgObj[0].CMR = CAN_CMR_WRRD | CAN_CMR_ARB | CAN_CMR_CONTROL | CAN_CMR_DATAA | CAN_CMR_DATAB;
if ((CAN->sMsgObj[0].A2R & CAN_A2R_XTD) == 0) { /* standard ID */ CAN->sMsgObj[0].A1R = 0; CAN->sMsgObj[0].A2R = (CAN->sMsgObj[0].A2R & 0xE000) | STD_FIXED_ID_ARB(pCanMsg->Id); } else { // extended ID CAN->sMsgObj[0].A1R = EXT_FIXED_ID_ARB_L(pCanMsg->Id); CAN->sMsgObj[0].A2R = (CAN->sMsgObj[0].A2R & 0xE000) | EXT_FIXED_ID_ARB_H(pCanMsg->Id); }
CAN->sMsgObj[0].MCR = (CAN->sMsgObj[0].MCR & 0xFEF0) | CAN_MCR_NEWDAT | CAN_MCR_TXRQST | pCanMsg->Dlc;
CAN->sMsgObj[0].DA1R = ((u16)pCanMsg->Data[1]<<8) | pCanMsg->Data[0]; CAN->sMsgObj[0].DA2R = ((u16)pCanMsg->Data[3]<<8) | pCanMsg->Data[2]; CAN->sMsgObj[0].DB1R = ((u16)pCanMsg->Data[5]<<8) | pCanMsg->Data[4]; CAN->sMsgObj[0].DB2R = ((u16)pCanMsg->Data[7]<<8) | pCanMsg->Data[6];
CAN->sMsgObj[0].CRR = 1 + msgobj;
return 1; }
|