1、根据硬件定义设备的ID和地址
/*
* The configuration table for devices
*/
XCanPs_Config XCanPs_ConfigTable[] =
{
{
XPAR_PS7_CAN_0_DEVICE_ID,
XPAR_PS7_CAN_0_BASEADDR
}
};
2、根据设备地址初始化XCanPs结构体,包括设备的ID和设备的基址还有中断的处理的回调函数
s32 XCanPs_CfgInitialize(XCanPs *InstancePtr, XCanPs_Config *ConfigPtr,
u32 EffectiveAddr)
{
s32 Status;
Xil_AssertNonvoid(InstancePtr != NULL);
Xil_AssertNonvoid(ConfigPtr != NULL);
/*
* Set some default values for instance data, don't indicate the device
* is ready to use until everything has been initialized successfully.
*/
InstancePtr->IsReady = 0U;
InstancePtr->CanConfig.BaseAddr = EffectiveAddr;
InstancePtr->CanConfig.DeviceId = ConfigPtr->DeviceId;
/*
* Set all handlers to stub values, let user configure this data later.
*/
InstancePtr->SendHandler = (XCanPs_SendRecvHandler) StubHandler;
InstancePtr->RecvHandler = (XCanPs_SendRecvHandler) StubHandler;
InstancePtr->ErrorHandler = (XCanPs_ErrorHandler) StubHandler;
InstancePtr->EventHandler = (XCanPs_EventHandler) StubHandler;
/*
* Indicate the component is now ready to use.
*/
InstancePtr->IsReady = XIL_COMPONENT_IS_READY;
/*
* Reset the device to get it into its initial state.
*/
XCanPs_Reset(InstancePtr);
Status = XST_SUCCESS;
return Status;
}
3、配置CAN device,设置波特率,设置同步位和同步时间 2 3 15 49
static void Config(XCanPs *InstancePtr)
{
// Enter Configuration Mode if the device is not currently in Configuration Mode.
XCanPs_EnterMode(InstancePtr, XCANPS_MODE_CONFIG);
while(XCanPs_GetMode(InstancePtr) != XCANPS_MODE_CONFIG);
// Setup Baud Rate Prescaler Register (BRPR) and Bit Timing Register (BTR) .
XCanPs_SetBaudRatePrescaler(InstancePtr, BRPR_BAUD_PRESCALAR);
XCanPs_SetBitTiming(InstancePtr, BTR_SYNCJUMPWIDTH,
BTR_SECOND_TIMESEGMENT,
BTR_FIRST_TIMESEGMENT);
// Set the threshold value for the Rx FIFO Watermark interrupt.
XCanPs_SetRxI