天天看点

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