ZYNQ SDK 2018.3 CAN接收中断例程
时间: 2023-08-16 18:03:41 浏览: 395
好的,以下是ZYNQ SDK 2018.3下的CAN接收中断例程:
```c
#include "xparameters.h"
#include "xscugic.h"
#include "xcanps.h"
#include "xil_printf.h"
#define CAN_DEVICE_ID XPAR_XCANPS_0_DEVICE_ID
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID
#define INTC_CAN0_VEC_ID XPAR_XCANPS_0_INTR
#define RX_BUFFER_SIZE 32
static XCanPs Can; // CAN控制器实例
static XCanPs_Config *CanConfig; // CAN控制器配置
static XScuGic Intc; // 中断控制器实例
static u32 RxBuffer[RX_BUFFER_SIZE][XCANPS_MAX_FRAME_SIZE_WORDS];
static u32 RxBufferPtr = 0;
// CAN接收中断处理函数
static void CanRecvHandler(void *CallBackRef, u32 Status, u32 *FramePtr)
{
// 将接收到的CAN帧保存到缓冲区中
u32 *DestPtr = RxBuffer[RxBufferPtr++];
u32 LenWords = (FramePtr[0] >> XCANPS_DLC_SHIFT) & XCANPS_DLC_MASK;
for (u32 i = 0; i < LenWords; i++) {
DestPtr[i] = FramePtr[i];
}
// 循环使用缓冲区
if (RxBufferPtr >= RX_BUFFER_SIZE) {
RxBufferPtr = 0;
}
// 清除中断标志位
XCanPs_AcknowledgeIntr(&Can, Status);
}
int main()
{
int Status;
XCanPs_Config *CanConfig;
// 初始化CAN控制器实例
CanConfig = XCanPs_LookupConfig(CAN_DEVICE_ID);
if (CanConfig == NULL) {
return XST_FAILURE;
}
Status = XCanPs_CfgInitialize(&Can, CanConfig, CanConfig->BaseAddr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
// 初始化中断控制器实例
XScuGic_Config *IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
if (IntcConfig == NULL) {
return XST_FAILURE;
}
Status = XScuGic_CfgInitialize(&Intc, IntcConfig, IntcConfig->CpuBaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
// 设置中断处理函数和优先级
Xil_ExceptionInit();
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler, &Intc);
XScuGic_Connect(&Intc, INTC_CAN0_VEC_ID,
(Xil_ExceptionHandler)CanRecvHandler, &Can);
XScuGic_SetPriorityTriggerType(&Intc, INTC_CAN0_VEC_ID, 0xA0, 0x3);
XScuGic_Enable(&Intc, INTC_CAN0_VEC_ID);
// 启用CAN接收中断
XCanPs_IntrEnable(&Can, XCANPS_IXR_RXNEMPTY_MASK);
XCanPs_IntrEnable(&Can, XCANPS_IXR_RXOK_MASK);
XCanPs_SetHandler(&Can, (void *)CanRecvHandler, &Can);
// 启动CAN控制器
XCanPs_Start(&Can);
while (1) {
// 此处可以添加其他代码
}
return 0;
}
```
此例程实现了CAN接收中断功能,并将接收到的CAN帧保存到缓冲区中。其中,CAN控制器实例使用XCanPs库,中断控制器实例使用XScuGic库。在main函数中,先初始化CAN和中断控制器实例,然后设置中断处理函数和优先级,接着启用CAN接收中断,最后启动CAN控制器。
阅读全文