分布式CAN通信网ID分配方法
在介绍本方法前,先构建CAN通信网系统模型:只有一个管理中心节点,其他均为从节点。主节点可与所有从节点之间相互通信,从节点之间不相互通信。CAN通信网采用网桥扩展方式增大网络中的节点。
报文帧格式
帧信息 | IDE=1 | RTR=0 | X | X | DLC |
扩展帧 | 远程帧 | 保留位 | 帧数据部分长度(不大于8) |
帧标 识符 | ID28 | ID27 | ID26 | ID25 | ID24 | ID24 | ID22 | ID21 |
DestMACID(目标节点编码) |
ID20 | ID19 | ID18 | ID17 | ID16 | ID15 | ID14 | ID13 |
xxxxxxx xxxxxxx |
|
ID12 | ID11 | ID10 | ID9 | ID8 | ID7 | ID6 | ID5 |
SrcMACID(源节点编码) |
ID4 | ID3 | ID2 | ID1 | ID0 | X | X | X |
| 0 | 保留位 |
当使用扩展帧进行数据传输时,扩展帧ID由STID+EXID组成。例如,在STM32中设置ExtID=0X1234时,则
CAN_FilterIdHigh=0x0000,CAN_FilterIdLow=(0x1234)X8+4= 0x91A4;
如果设置ExtID=0X5678,则
CAN_FilterMaskIdHigh=(u32(0x5678)X8/(0x10000)=0x0002; CAN_FilterMaskIdLow=(0x5678)X8+4=0xB3C4;(溢出,截高位,剩下的就是这个数)。
为方便计算,我们把ID最后一位直接置为0。ID28~ID01这28位平分,前14位为DestMACID(目标节点),后14位为SrcMACID(源节点)。对于前14位,ID28~ID22作为网桥标号,ID21~ID15作为子网内编号。后14位采用相同编号方式。
其中,地址0000000/0000000设置主地址
网桥编号为, 0000001/xxxxxxx~1101110/xxxxxxx,也就是1~110
网桥内子节点编号为xxxxxxx/0000001~xxxxxxx/1101110,也就是1~110
规定xxxxxxx/0000000,为网桥内广播地址。广播地址,其中,xxxxxxx!=0000000。这主要是为了管理中心向各个从节点采集数据(心跳连接)时使用的。通过网桥内广播,则管理中心最少只需要发送110次查询信息,就可以获取所有井盖终端的井盖当前状态。
例如,某节点地址为0000010/0000100,则表示为网桥2内的第4个节点
如果整个29位的ID设置为0000000/0000000 0000010/0000100 0,则表示数据从网桥2内的第4个节点,发送至管理中心;如果整个29位的ID设置为0000010/0000100 0000000/0000000 0,则表示数据从管理中心,发送至网桥2内的第4个节点。注意,源地址和目的地址必须有一个是管理中心的地址,因为各个井盖节点之间不相互传送数据。
关键字:STM32 CAN通信网 ID配置
引用地址:
基于STM32的CAN通信网-----一种ID配置方法
推荐阅读最新更新时间:2024-03-16 15:39
stm32 fsmc 功能讲解
LCD有如下控制线: CS:Chip Select 片选,低电平有效 RS:Register Select 寄存器选择 WR:Write 写信号,低电平有效 RD:Read 读信号,低电平有效 RESET:重启信号,低电平有效 DB0-DB15:数据线 假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多): 如果情况如下: DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。 CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效) RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。 WR为0,RD为1(表示是写动作
[单片机]
STM32控制IO基本配置的讲解
一个简单的工程搭建好之后,进一步就是了解里面的内容,也就是学习进入正轨。打开我之前新建的工程,主要调用的几个函数就是今天学习的内容,接下来我就讲解一下那些内容。 一、初始化时钟 这里的“时钟配置”函数在bsp.c文件下面; 使能了GPIOA --- GPIOD时钟,这里更加自己使用的IO进行配置(该工程实际只使用GPIOC)。 二、基本输入输出引脚配置 这里的“基本输入输出引脚配置”函数同样在bsp.c文件下面; 初始化GPIO, 包含端口引脚、频率、输出类型。 三、底层初始化 这里的“底层初始化”函数同样在bsp.c文件下面; 以后的底层初始化代码还会增加,这里调用上面的两个函数接口。 四、主函数应用
[单片机]
STM32环境搭建,建立工程及程序烧录
开发环境的搭建: STM32开发环境使用Keil MDK进行,那怎么使用MDK建立一个工程呢? MDK下载 首先应该下载到MDK官网:http://www.keil.com/arm/mdk.asp 下载最新版的MDK安装包,进入MDK官网,点击download按钮 跳转到下载界面,填入必要的信息: 然后在页面下方点击提交按钮: 如果填写的信息,符合要求,在本页面将会显示下载连接: 点击下载MDK(可以看到香农这里的MDK版本是MDK520,大概有567M的样子) MDK安装 下载完成之后点击安装: 选择安装目录,根据自己的需求定义, 随便填一些用
[单片机]
STM32编译环境、建立工程模板以及程序下载
1、之前写51的程序我们一般都是用的keil5软件,现在写32程序,要用到keil MDK软件,但是keil5和keil MDK不兼容,也就是说在keil5里面我们没办法写STM32F1之类的程序,而在keil MDK里面也没办法写51的程序,所以说为了让他们俩相互兼容,即我们要实现在keilMDK里面要既能够写51的程序,也能够写32的程序,我当初在网上找了好多方法都不行,最后发现一种特别简单好用的方法,就是在把keil5和keil MDK两个软件安装在同一个文件夹下面。具体步骤就是 (1)安装keil5软件(尽量不要安装在C盘),然后激活它。这里激活的时候要在注册机里选择C51。 (2)安装keil MDK软件,在安装
[单片机]
STM32调试过程中常见的问题及解决方法?
STM32调试过程中常见的问题及解决方法 一、 在 Debug选项卡 下设置好仿真器的类型后,下载程序时却提示 No ULINK Device found. 解决办法: Keil MDK默认使用ULINK仿真器下载程序,在 Project --- Option for Target 'xxx' --- Utilities选项卡 下把编程所使用的仿真器改为相应的类型即可。 二、 编译工程时提示如下信息: main.axf: Error: L6218E: Undefined symbol __BASEPRICONFIG (referred from stm32f10x_nvic.o). main.axf: E
[单片机]
STM32之DAC原理
1.DAC模块 1.数模转换功能 2.可以配置为8位和12位模式(8位右对齐,12位左对齐,12位右对齐) 3.DAC模块有两个单独的控制器,每个通道有着单独的转换器,可以独立转换,也可以同时转换 4.可以实现噪声波形和三角波形的生成 5.每个通道有着DMA功能 6.图示: PS:左上方为一些触发的条件,左下方为一些数字电源(VDDA,VSSA) Vref+为参考电压,DAC_OUT_x为DAC的输出通道,(2.4v Vref VDDA) 数据并不是直接传入DORx的,需要先传入DHRx(如果没有选择硬件触发(TENx=0),在一个时间周期后传入DORx),同时,又经过Tsetting(大约3us)
[单片机]
STM32系列第13篇--OLED
简介: OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。 OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,并且能够节省电能,从2003年开始这种显示设备在MP3播放器上得到了应用。 LCD都需要背光,而OLED不需要,因为它是自发光的。这样同样的显示,OLED效果要来得好一些。以目前的技术,OLED的尺寸还难以大型化,但是分辨率确可以做到很高。 多种接口方式,该模块提供了总共4种接口包括:6800、8080两
[单片机]
在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法
如果使用内部RC 振荡器 而不使用外部晶振,请按照下面方法处理:
1)对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法: 2.1)OSC_IN和OSC_OUT分别通过10K 电阻 接地。此方法可提高 EMC 性能。 2.2)分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出'0'。此方法可以减小功耗并(相对上面2.1)节省2个外部电阻。
以下是在 ST 英文网站FAQ上抄下的详细解释:
1) In 100 and 144 packages, the OSC_IN /OSC_Out pins are a de
[单片机]