器件型号: TM4C123AE6PM
这可能很简单,但我不能罚款. 我在环回/测试模式下设置 CAN-0 并发送消息、即成功发送和接收消息、但是指向接收到的数据的指针为 0、而不是 RAM 中的正确地址。 编程如下:
U8 TxData[8]={0x01、0x23、0x45、0x67、0x89、 0xAB、0xCD、0xEF };
U8 CAN0Data17[8]; //发送数据。
tCANMsgObject Can0MsgObj17;
U8 CAN0Data18[8]; //接收数据。
tCANMsgObject Can0MsgObj18;
void main (void){
SysCtlPeripheralEnable (SysCtl_Periph_GPIOB);
SysCtlPeripheralEnable (SYSCTL_PERIPH_CAN0);
(这里有延迟)
GPIOPinTypeCAN (GPIO_PORTB_BASE、PB_CAN2Rx_BIT | PB_CAN2Tx_BIT);
GPIOPinConfigure (GPIO_PB4_CAN0RX);
GPIOPinConfigure (GPIO_PB5_CAN0TX);
CANInit (CAN0_BASE);
CANBitRateSet (CAN0_BASE、GetClkSpeed ()、500000);
CANIntRegister (CAN0_BASE、CAN0_ISR);
CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN0);
CANEnable (CAN0_BASE);
HWREG (CAN0_BASE + CAN_O_CTL)|= CAN_CTL_TEST;
HWREG (CAN0_BASE + CAN_O_TST)|= CAN_TST_LBACK;
U8 CAN0Data18[8];
Can0MsgObj18.ui32MsgID = 0; //接收消息对象。
Can0MsgObj18.ui32MsgIDMask = 0;
CAN0MsgObj18.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
Can0MsgObj18.ui32MsgLen = 8;
CANMessageSet (CAN0_BASE、MsgObj18、&Can0MsgObj18、MSG_OBJ_TYPE_RX);
U8 CAN0Data17[8];
Memcpy (Can0Data17、TxData、8);
Can0MsgObj17.ui32MsgID = 0x100; //发送消息对象。
Can0MsgObj17.ui32MsgIDMask = 0x0;
CAN0MsgObj17.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
Can0MsgObj17.ui32MsgLen = 8;
Can0MsgObj17.pui8MsgData = Can0Data17;
CANMessageSet (CAN0_BASE、MsgObj17、&Can0MsgObj17、MSG_OBJ_TYPE_TX);
}
void CAN0_ISR (void){
U8 状态= CAN0_STS_R & 0x000000FF; // Get Status。
CAN0_STS_R = 0; //重置状态。
U32、 = CAN0_INT_R; //哪个消息对象。
其中=((why-1)& 0x1F)+ 1;
//在此处处理状态。
开关(哪个){
案例 17:
//传输成功。
休息;
案例 18:
CANMessageGet (CAN0_BASE、MsgObj18、&Can0MsgObj18、false);
//此处:
// Can0MsgObj18.ui32MsgID 为 100、
// Can0MsgObj18.ui32MsgLen 为 8、
//但 Can0MsgObj18.pui8MsgData 为 0、而不是 Can0Data17。
}
谢谢、Doug