相关寄存器的宏定义
#define AFMR (*(volatile unsigned long *)0x4003C000)
#define SFF_SA (*(volatile unsigned long *)0x4003C004)
#define SFF_GRP_SA (*(volatile unsigned long *)0x4003C008)
#define EFF_SA (*(volatile unsigned long *)0x4003C00C)
#define EFF_GRP_SA (*(volatile unsigned long *)0x4003C010)
#define ENDOFTABLE (*(volatile unsigned long *)0x4003C014)
/*********************************************************************************************************
FileName:CAN_AF.h
CAN过滤器表格结构体
*********************************************************************************************************/
#ifndef CAN_AF_H
#define CAN_AF_H
#include "..config.h"
struct AF_SFF_CELL
{ //标准表示符单元类型定义
INT32U UpId : 11; //ID1
INT32U UpRsv : 1; //未定义
INT32U UpDis : 1; //禁能位
INT32U UpCh : 3; //CAN控制器号
INT32U LoId : 11; //ID0
INT32U LoRsv : 1; //未定义
INT32U LoDis : 1; //禁能位
INT32U LoCh : 3; //CAN控制器号
};
struct AF_EFF_CELL
{
//扩展标识符单元类型定义
INT32U ID : 29;
INT32U CH : 3;
};
struct AF_AUTOSTORE_MSG
{ //FullCAN自动接收报文格式数据类型定义
struct HEAD
{
INT32U ID : 11;
INT32U RSV5 : 5;
INT32U DLC : 4;
INT32U RSV12 : 4;
INT32U SEM : 2;
INT32U RSV41 : 4;
INT32U RTR : 1;
INT32U FF : 1;
}Head;
INT32U Data_A;
INT32U Data_B;
};
struct AF_Ram_Tab_Cell
{
INT32U F_CAN_Cell;
INT32U SFF_Cell;
INT32U SFF_GRP_Cell;
INT32U EFF_Cell;
INT32U EFF_GRP_Cell;
};
/*********************************************************************************************************
设定CAN过滤器各个表格的起始地址
*********************************************************************************************************/
void CAN_Set_AF_Tab(struct AF_Ram_Tab_Cell af_ram_tab_cell);
/*********************************************************************************************************
设定CAN接收过滤器的工作模式
mode: 0 旁路模式,关闭过滤器,接收所有帧
1 开启过滤器
2 FullCAN模式
3 屏蔽所有帧
*********************************************************************************************************/
void CAN_Set_Mode(INT8U mode);
void CAN_Add_SFF_Tab(struct AF_SFF_CELL af_sff_cell[],INT32U celln);
void CAN_Add_EFF_Tab(struct AF_EFF_CELL af_eff_cell[],INT32U celln);
void CAN_Add_SFF_GRP_Tab(struct AF_SFF_CELL af_sff_cell[],INT32U celln);
void CAN_Add_EFF_GRP_Tab(struct AF_EFF_CELL af_eff_cell[],INT32U celln);
#endif
#include "CAN_AF.h"
/*********************************************************************************************************
FileName: CAN_AF.c
设定CAN过滤器各个表格的起始地址
*********************************************************************************************************/
void CAN_Set_AF_Tab(struct AF_Ram_Tab_Cell af_ram_tab_cell)
{
INT32U A,B,C,D,E;
A=af_ram_tab_cell.F_CAN_Cell*4;
B=A+af_ram_tab_cell.SFF_Cell*4;
C=B+af_ram_tab_cell.SFF_GRP_Cell*4;
D=C+af_ram_tab_cell.EFF_Cell*4;
E=D+af_ram_tab_cell.EFF_GRP_Cell*4;
SFF_SA=A;
SFF_GRP_SA=B;
EFF_SA=C;
EFF_GRP_SA=D;
ENDOFTABLE=E;
}
/*********************************************************************************************************
设定CAN接收过滤器的工作模式
mode: 0 旁路模式,关闭过滤器,接收所有帧
1 开启过滤器
2 FullCAN模式
3 屏蔽所有帧
*********************************************************************************************************/
void CAN_Set_Mode(INT8U mode)
{
AFMR&=(~0x07);
if(mode<4)
{
switch(mode)
{
case 0: AFMR=0x02;break; //旁路模式
case 1: AFMR=0x00;break; //开启过滤器
case 2: AFMR=0x04;break; //FullCAN模式
case 3: AFMR=0x01;break; //屏蔽所有帧
default:break;
}
}
}
void CAN_Add_SFF_Tab(struct AF_SFF_CELL af_sff_cell[],INT32U celln)
{
INT32U i;
struct AF_SFF_CELL *p;
p=(struct AF_SFF_CELL *)(0x40038000+((SFF_SA>>2)&0xFF)/4);
for(i=0;i
{
*(p+i)=af_sff_cell[i];
}
}
void CAN_Add_EFF_Tab(struct AF_EFF_CELL af_eff_cell[],INT32U celln)
{
INT32U i;
struct AF_EFF_CELL *p;
p=(struct AF_EFF_CELL *)(0x40038000+((EFF_SA>>2)&0x01FF)/4);
for(i=0;i
{
*(p+i)=af_eff_cell[i];
}
}
void CAN_Add_SFF_GRP_Tab(struct AF_SFF_CELL af_sff_cell[],INT32U celln)
{
INT32U i;
struct AF_SFF_CELL *p;
p=(struct AF_SFF_CELL *)(0x40038000+((SFF_GRP_SA>>2)&0x03FF)/4);
for(i=0;i
{
*(p+i)=af_sff_cell[i];
}
}
void CAN_Add_EFF_GRP_Tab(struct AF_EFF_CELL af_eff_cell[],INT32U celln)
{
INT32U i;
struct AF_EFF_CELL *p;
p=(struct AF_EFF_CELL *)(0x40038000+((EFF_GRP_SA>>2)&0x03FF)/4);
for(i=0;i
{
*(p+i)=af_eff_cell[i];
}
}