一、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位掩碼模式解析