一、PE配置

二、生成函数
2.1 不使用中断
生成的CAN1.c文件
生成的调用函数CAN1.c
** Contents :
** Enable - byte CAN1_Enable(void); //使能
** Disable - byte CAN1_Disable(void); //失能
//接收帧数据 (帧ID、帧类型、帧格式、数据长度、数据)
** ReadFrame - byte CAN1_ReadFrame(dword *MessageID, byte *FrameType, byte *FrameFormat,...
** GetStateRX - bool CAN1_GetStateRX(void); //数据接收完成标志
//发送帧数据 (帧ID、帧类型、数据长度、数据)
** SendFrameExt - byte CAN1_SendFrameExt(dword MessageID, byte FrameType, byte Length, byte...
不使用CAN中断接收帧数据实例:
main.c
if ( !CAN1_GetStateRX() ) //接收未完成,后面不执行
{
continue;
}
byTemp = CAN1_ReadFrame( &stCAN_RX.EID , &byTyp , &byFmt, &stCAN_RX.DLR , (void *)(stCAN_RX.data) );
if (byTemp) //接收帧数据失败,跳出循环
{
break;
}
发送帧
main.c
stCAN_TX.EID = 0x107U; //帧ID
DATA_FRAME = 0; //数据帧
stCAN_TX.DLR = 8; //数据长度
stCAN_TX.data[0] = 0;
stCAN_TX.data[1] = 0;
stCAN_TX.data[4] = 0x4e;
stCAN_TX.data[5] = 0x45;
stCAN_TX.data[6] = 0x48;
stCAN_TX.data[7] = 0x43;
byTemp = CAN1_SendFrameExt( stCAN_TX.EID, DATA_FRAME, stCAN_TX.DLR, stCAN_TX.data );
2.2使用中断
PE配置
生成的CAN1.C文件调用函数
** Contents :
** EnableEvent - byte CAN1_EnableEvent(void); //中断使能
** SetAcceptanceCode - byte CAN1_SetAcceptanceCode(dword AccCode1, dword AccCode2); //接收寄存器
** SetAcceptanceMask - byte CAN1_SetAcceptanceMask(dword AccMask1, dword AccMask2); //掩码寄存器
** SetAcceptanceMode - byte CAN1_SetAcceptanceMode(byte Mode); //标识符滤波器模式
** ReadFrame - byte CAN1_ReadFrame(dword *MessageID, byte *FrameType, byte *FrameFormat,...
** SendFrameExt - byte CAN1_SendFrameExt(dword MessageID, byte FrameType, byte Length, byte...
标识符滤波器在PE已经配置过了(生成的配置函数void CAN1_Init(void)),而且可在代码中二次重定义,示例如下:
main.c
void user_can1_filter_init(void)
{
UINT8 j;
j = CAN1_SetAcceptanceMode(EIGHT_8_FILTERS);
if(j == ERR_OK)
{
j = CAN1_SetAcceptanceCode(0x00000000, 0x00000000);
if(j == ERR_OK)
{
CAN1_SetAcceptanceMask(0xffffffff, 0xffffffff);
}
}
}
在生成的中断函数中处理接收数据,实例如下:
Events.c
//接收完成中断
void CAN1_OnFullRxBuffer(void)
{
r = CAN1_ReadFrame(&(Can1_rece_FreeList->id),
&(Can1_rece_FreeList->frame_type),
&(Can1_rece_FreeList->message_type),
&(Can1_rece_FreeList->data_length),
&(Can1_rece_FreeList->data[0]));
}
//CAN总线异常
void CAN1_OnBusOff(void)
{
/* Write your code here ... */
}
//发送成功中断
void CAN1_OnFreeTxBuffer(word BufferMask)
{
/* Write your code here ... */
}
注:发送数据不需要中断
三、CAN滤波器
DZ60
接收标识符寄存器IDR0-IDR3
标识符接收滤波器
掩码寄存器CANIDMR和接收寄存器CANIDAR设置
实例:
使用16位掩码模式,仅接受标识符为0x101、102/103、104/105的数据
PE配置
16位掩码模式解析