NXP

针对LPC1752的CAN接收过滤器的配置方法

2019-07-12 12:11发布

相关寄存器的宏定义 #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];
 }
}