天天看點

S08DZ60 & CodeWarrior6.3學習筆記5--CAN

一、PE配置

S08DZ60 & CodeWarrior6.3學習筆記5--CAN
S08DZ60 & CodeWarrior6.3學習筆記5--CAN

二、生成函數

2.1 不使用中斷

生成的CAN1.c檔案

S08DZ60 & CodeWarrior6.3學習筆記5--CAN

生成的調用函數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配置

S08DZ60 & CodeWarrior6.3學習筆記5--CAN
S08DZ60 & CodeWarrior6.3學習筆記5--CAN

生成的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

S08DZ60 & CodeWarrior6.3學習筆記5--CAN

接收辨別符寄存器IDR0-IDR3

S08DZ60 & CodeWarrior6.3學習筆記5--CAN

辨別符接收濾波器

掩碼寄存器CANIDMR和接收寄存器CANIDAR設定

S08DZ60 & CodeWarrior6.3學習筆記5--CAN
S08DZ60 & CodeWarrior6.3學習筆記5--CAN

執行個體:

使用16位掩碼模式,僅接受辨別符為0x101、102/103、104/105的資料

PE配置

S08DZ60 & CodeWarrior6.3學習筆記5--CAN

16位掩碼模式解析

S08DZ60 & CodeWarrior6.3學習筆記5--CAN
S08DZ60 & CodeWarrior6.3學習筆記5--CAN