历史上的今天
今天是:2025年03月18日(星期二)
2019年03月18日 | STM32F103 CAN通信的滤波器设置
2019-03-18 来源:eefocus
刚开始接触CAN通信,测试过收发后,还需要使用标识符过滤来实现固定节点的数据收发。记录一下“屏蔽位模式”下滤波参数的设置。
发送代码如下:
//can发送一组数据(固定格式:ID为0X123,标准帧,数据帧)
//len:数据长度(最大为8)
//msg:数据指针,最大为8个字节.
//返回值:0,成功;
// 其他,失败;
u8 Can_Send_Msg(u8* msg,u8 len)
{
u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0X123; // 标准标识符
TxMessage.ExtId=0x00; // 设置扩展标示符
TxMessage.IDE=CAN_Id_Standard; // 标准帧
TxMessage.RTR=CAN_RTR_Data; // 数据帧
TxMessage.DLC=len; // 要发送的数据长度
for(i=0;i TxMessage.Data[i]=msg[i]; mbox= CAN_Transmit(CAN1, &TxMessage); i=0; while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))i++; //等待发送结束 if(i>=0XFFF)return 1; return 0; } 代码中使用回环测试标识符滤波功能。标准标识符0X123。这里要注意虽然赋值为0X123但是在CAN_Transmit(CAN1, &TxMessage)函数内部会有这样一句话,会发现把StdId右移了21位。 CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | TxMessage->RTR);//标准帧只有31-21位 由上图的寄存器位结构,实际上移位以后可以看做0X123<<21=0X24600000; 再看标识符滤波器的设置代码 CAN_FilterInitStructure.CAN_FilterNumber=0; //过滤器0 CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; //屏蔽位模式 CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位宽 CAN_FilterInitStructure.CAN_FilterIdHigh=0x2460; //32位ID CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFE0;//32位MASK 设置为31-21位全部匹配 CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//过滤器0关联到FIFO0 CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//激活过滤器0 标准帧只有31-21位,所以滤波器设置参数时只需要设置31-21位。 由123<<21位得到0x24600000,所以CAN_FilterInitStructure.CAN_FilterIdHigh=0x2460。 屏蔽位设置为31-21位全部匹配CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFE0;这样只能接收0x123发送的数据。
史海拾趣
|
/************************************************************** 320×240 16Bpp TFT LCD功能模块初始化 **************************************************************/ void Lcd_Init(void) { rLCDCON1=( ...… 查看全部问答> |
|
别人的导航软件的手写输入在我定制的CE平台上识别不了,为什么?跟平台定制有关没?CE组件没加? 别人的导航软件的手写输入在我定制的CE平台上识别不了,为什么?跟平台定制有关没?CE组件没加?… 查看全部问答> |
|
上次使用学习了一下Timer,每隔1秒钟中断一次,现在准备实现每隔1S钟读取一下内部的温度值,并在LCD上显示出来。 从手册288页上可以看出,LM3S8962的内部温度传感器有两个目的: 1. 防止温度过高或过低,影响系统芯片正常运行 ...… 查看全部问答> |
|
从《钢铁侠1》到《复仇者联盟》再到《钢铁侠3》,托尼胸前的反应堆,也更新了好几代。高中刚毕业,放假在家,就有了想自己做一个反应堆的想法,然后就开始实践了。 ◆ 第一步:采购原材料(具体如下) ● 网上定制的亚 ...… 查看全部问答> |
|
本帖最后由 DavidZH 于 2014-7-9 00:05 编辑 已经收到的HELP2416开发板,很精致。准备开始学习,按照以往学习其他MCU的经验,先是了解开发板的硬件,然后开始收集相关资料,如下图所示: 一、HELP2416的主芯片是S3C2416 芯片,其内核属于ARMv5 ...… 查看全部问答> |




