本CAN过滤器组配置代替原例程,可以方便的配置CAN的过滤器组
在CAN.C 中:
/*********************************************************************************************************************************
* 函数名称:u8 CAN1_Mode_Init(u32 tsjw, u32 tbs2, u32 tbs1, u16 brp, u32 mode)
* 函数功能:CAN初始化
* 入口参数:tsjw:重新同步跳跃时间单元.范围:CAN_SJW_1TQ~CAN_SJW_4TQ
* tbs2:时间段2的时间单元. 范围:CAN_BS2_1TQ~CAN_BS2_8TQ;
* tbs1:时间段1的时间单元. 范围:CAN_BS1_1TQ~CAN_BS1_16TQ
* brp :波特率分频器.范围:1~1024; tq=(brp)*tpclk1
* 波特率=Fpclk1/((tbs1+1+tbs2+1+1)*brp);
* mode:CAN_MODE_NORMAL,普通模式;CAN_MODE_LOOPBACK,回环模式;
* 出口参数:0,初始化OK;其他,初始化失败;
* 说 明:Fpclk1的时钟在初始化的时候设置为54M,如果设置CAN1_Mode_Init(CAN_SJW_1tq,CAN_BS2_6tq,CAN_BS1_11tq,6,CAN_MODE_LOOPBACK);
* 则波特率为:54M/((6+11+1)*6)=500Kbps
**********************************************************************************************************************************/
u8 CAN1_Mode_Init(u32 tsjw, u32 tbs2, u32 tbs1, u16 brp, u32 mode)
{
CAN1_Handler.Instance = CAN1;
CAN1_Handler.pTxMsg = &TxMessage; //发送消息
CAN1_Handler.pRxMsg = &RxMessage; //接收消息
CAN1_Handler.Init.Prescaler = brp; //分频系数(Fdiv)为brp+1
CAN1_Handler.Init.Mode = mode; //模式设置
CAN1_Handler.Init.SJW = tsjw; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1TQ~CAN_SJW_4TQ
CAN1_Handler.Init.BS1 = tbs1; //tbs1范围CAN_BS1_1TQ~CAN_BS1_16TQ
CAN1_Handler.Init.BS2 = tbs2; //tbs2范围CAN_BS2_1TQ~CAN_BS2_8TQ
CAN1_Handler.Init.TTCM = DISABLE; //非时间触发通信模式
CAN1_Handler.Init.ABOM = DISABLE; //软件自动离线管理
CAN1_Handler.Init.AWUM = DISABLE; //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
CAN1_Handler.Init.NART = ENABLE; //禁止报文自动传送
CAN1_Handler.Init.RFLM = DISABLE; //报文不锁定,新的覆盖旧的
CAN1_Handler.Init.TXFP = DISABLE; //优先级由报文标识符决定
if (HAL_CAN_Init(&CAN1_Handler) != HAL_OK) return 1; //初始化
return 0;
}
/*****************************************************************
* 函数名称:u8 CAN1_Filer16_Conf(void)
* 函数功能:CAN1 过滤器配置(16位过滤)
*
* 入口参数:IdH: ID过滤器高位
* IdL: ID过滤器低位
* MaskIdH: ID屏蔽字高位
* MaskIdL: ID屏蔽字低位
* FIFOAssignment: 过滤器关联到的FIFO
* Number: 过滤器组号
* Mode: 屏蔽模式或者列表模式
* Scale: 过滤器深度(32BIT或者16BIT)
*
* 出口参数:0,配置OK;其他,配置失败;
* 说 明:
******************************************************************/
u8 CAN1_Filer_Conf(u16 IdH, u16 IdL, u16 MaskIdH, u16 MaskIdL,u8 FIFOAssignment,u8 Number,u8 Mode,u8 Scale)
{
CAN_FilterConfTypeDef CAN1_FilerConf;
CAN1_FilerConf.FilterIdHigh = IdH<<5; // 16位 ID
CAN1_FilerConf.FilterIdLow = IdL<<5;
CAN1_FilerConf.FilterMaskIdHigh = MaskIdH<<5; // 16位MASK
CAN1_FilerConf.FilterMaskIdLow = MaskIdL<<5;
CAN1_FilerConf.FilterFIFOAssignment = FIFOAssignment; // 过滤器0关联到FIFO0
CAN1_FilerConf.FilterNumber = Number; // 过滤器0
CAN1_FilerConf.FilterMode = Mode; // 屏蔽位模式(另一种是列表模式)
CAN1_FilerConf.FilterScale = Scale; // 过滤深度16 或者 32
CAN1_FilerConf.FilterActivation = ENABLE; // 激活滤波器0
CAN1_FilerConf.BankNumber = 14;
if (HAL_CAN_ConfigFilter(&CAN1_Handler, &CAN1_FilerConf) != HAL_OK) return 2; // 滤波器初始化
return 0;
}
在主程序中:
CAN1_Mode_Init ( CAN_SJW_1TQ,
CAN_BS2_6TQ,
CAN_BS1_11TQ,6,
CAN_MODE_NORMAL ); // CAN初始化正常模式,波特率500Kbps
CAN1_Filer_Conf ( // CAN1 16位标准帧过滤器组初始化
0x702, // FilterIdHigh
0x703, // FilterIdLow
0x704, // FilterMaskIdHigh
0x706, // FilterMaskIdLow
CAN_FILTER_FIFO0, // 过滤器0关联到FIFO0或者FIFO1
0, // 过滤器0~24
CAN_FILTERMODE_IDLIST, // FilterMode(或者屏蔽模式 CAN_FILTERMODE_IDMASK)
CAN_FILTERSCALE_16BIT ); // 过滤器深度( CAN_FILTERSCALE_32BIT或者CAN_FILTERSCALE_16BIT)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>