can总线(STM32笔记)

发布时间:2026/10/23 11:40:55
can总线(STM32笔记)
介绍CAN总线Controller Area Network Bus控制器局域网总线。CAN总线构建的是一种局域网网络每一个挂载在CAN总线的设备都可以利用这个局域网去发送自己的消息也可以接收局域网的各种消息每个设备都是平等的都在共享这个局域网的通信资源。不存在什么主从关系。CAN总线是由BOSCH公司开发的一种简洁易用、传输速度快、易扩展、可靠性高的串行通信总线广泛应用于汽车、嵌入式、工业控制等领域。can总线特征两根通信线CAN_H、CAN_L线路少无需共地差分信号通信抗干扰能力强若线路产生干扰则一般两根线的电压都会同时出现波动但是两根线的电压差值仍然是不变的所以用电压差值来传递数据可以极大的避免干扰高速CANISO11898125k~1Mbps, 传输距离40 m本课程侧重学习的是高速CAN低速CANISO1151910k~125kbps, 传输距离1 km异步无需时钟线通信速率由设备各自约定半双工不可以同时发送和接收可挂载多设备多设备同时发送数据时通过仲裁判断先后顺序11位/29位报文ID用于区分消息功能同时决定优先级高速can:低速can:差分信号can_High和can_Low走的是一对差分信号传统的单端信号传输一根信号线和一根地线差分传输是一种信号传输的技术差分传输在这两根线上都传输信号这两个信号的振幅相同相位相反信号接收端比较这两个电压的差值来判断发送端发送的逻辑状态。在电路板上差分走线必须是等长、等宽、紧密靠近、且在同一层面的两根线。优点抗干扰能力强干扰噪声一般会等值、同时的被加载到两根信号线上而其差值为0即噪声对信号的逻辑意义不产生影响。差分走线必须是等长、等宽、紧密靠近就是为了让外界干扰同等的附加在这两根线上最后的差值为0缺点差分信号一定要走两根等长、等宽、紧密靠近、且在同一层面的线。对电路板比较小走线比较紧张的情况下给布线带来挑战。can差分信号的逻辑电平高速can逻辑1隐性电平can_High can_Low 2.5V标准电压差为-0.5 0.05之间逻辑0显性电平can_High - can_Low 2.0V标准电压差为1.5 3.0之间低速can逻辑1隐性can_High - can_Low -1.5标准电压差为-0.3 ∞逻辑0显性can_High - can_Low 3.0标准电压差为0.3 ∞can总线协议帧can总线的报文种类CAN总线是广播类型的总线。这意味着所有节点都可以侦听到所有传输的报文。无法将报文单独发送给指定节点所有节点都将始终捕获所有报文。但是CAN硬件能够提供本地过滤功能让每个节点对报文有选择性地做出响应。这段话的意思是当一个节点发送数据时所有的节点都能得知这个数据但是会有一个本地过滤功能让指定的节点来接收数据。五中不同的报文类型数据帧数据帧是最常见的报文类型用于发送单元向接收单元发送数据。远程帧遥控帧远程帧用于接收单元向具有相同id的发送单元请求发送数据。不带数据仅仅就是发送一个求数据的请求错误帧错误帧当检测出错误时向其他单元通知错误的帧。过载帧接收设备通知其尚未做好接收准备过载帧并不常用因为当今的CAN控制器会非常智能化地避免使用过载帧帧间隔用于将数据帧及遥控帧与前面的帧分离开来的帧其中错误帧、过载帧、帧间隔都是由硬件自动完成的没有办法用软件来控制。对于一般使用者来说只需要掌握数据帧与遥控帧。数据帧和遥控帧有标准格式与扩展格式。标准格式有11位标识符扩展格式有29位标识符。数据帧介绍标准帧帧起始1位总线空闲时发送总裁段标识符位11位可以理解为节点ID高位在前远程发送请求位区分是数据帧还是远程帧显性信号0代表数据帧控制段IDE位1位 区分标准格式还是拓展格式显性电平代表标准格式R0位保留位以后使用DLC段4位 用于表示本报文中的数据有多少个字节。数据段64位。8个字节CRC段CRC校验码15位 用于校验传输是否正确界定符隐性位表示CRC校验的结束同时释放总线等待接收方拉低ACK段ACK确认位发送方发送完之后接收方会将总线置显性0表示接收到了信息。界定符隐性位用于跟后面的分开同时接收方释放总线帧结束7个隐性位表示帧的结束拓展帧扩展帧与标准帧的不同在于仲裁段和控制段其他完全一样。遥控帧遥控帧就是发送一个请求没有数据。错误帧总线上所有设备都会监督总线的数据一旦发现“位错误”或“填充错误”或“CRC错误”或“格式错误”或“应答错误” 这些设备便会发出错误帧来破坏数据同时终止当前的发送设备错误帧分主动错误帧和被动错误帧主动错误帧是将总线拉低被动错误帧是将总线拉高根据线与的特性主动错误帧会破坏原有的数据被动错误帧不会破坏原有的数据。过载帧当接收方收到大量数据而无法处理时其可以发出过载帧延缓发送方的数据发送以平衡总线负载避免数据丢失帧间隔帧间隔是在数据帧/遥控帧与前面的帧分开帧间隔也分主动错误与被动错误主动错误是上方的有三个帧间隔被动错误是下方的三个帧间隔后还有八个延迟传送。位填充位填充规则发送方每发送5个相同电平后自动追加一个相反电平的填充位接收方检测到填充位时会自动移除填充位恢复原始数据例如作用当发送方发送一连串相同的电平时会对接收方的接受造成干扰将正常数据流与“错误帧”和“过载帧”区分开标志“错误帧”和“过载帧”的特异性can总线仲裁CAN总线处于空闲状态的时候最先发送消息的单元获得发送权。多个单元同时开始发送时从仲裁段报文id的第一位开始进行仲裁。连续输出显性电平最多的单元可以继续发送即首先出现隐性电平的单元失去对总线的占有权变为接收。(即报文id小的优先级高)。因为我们的仲裁段是高位在前的谁先出现0谁的优先级就高竞争失败会自动检测总线空闲在第一时间再次尝试发送。can的位时序介绍位同步是为了解决时序同步的机制这里一帧包含了四位同步段的时间往往被看做是这一帧的时间单元后面三段的时间都需要是同步段时间的整数倍同步段ss的大小固定是1Tq若通讯节点检测到总线上信号的跳变沿被包含在 SS段的范围之内则表示节点与总线的时序是同步的。这段看不懂不用管了传播时间段CAN总线上数据的传输会受到各种物理延迟。比如发送单元的发送延迟、总线上信号的传播延迟、接收单元的输入延迟等。PTS段就是用来补偿这些因素产生的时间延迟。这样降低波特率来实现稳定的功能相位缓冲段1主要是来补偿边沿阶段的误差。它的时间长度在重新同步阶段的时候可以被自动加长。PBS1段的初始大小可以为1~8Tq。相位缓冲段2另一个相位缓冲段也是用来补偿边沿阶段误差的他的时间长度在重新同步阶段会被缩短。位同步CAN总线没有时钟线总线上的所有设备通过约定波特率的方式确定每一个数据位的时长发送方以约定的位时长每隔固定时间输出一个数据位接收方以约定的位时长每隔固定时间采样总线的电平输入一个数据位理想状态下接收方能依次采样到发送方发出的每个数据位且采样点位于数据位中心附近硬同步因为can总线没有时钟线他们传输数据是按照双方约定好的波特率来实现的。当发送方率先发送报文随后接收方接收到SOF的下降沿后接收方会直接把自己的位时序周期拨动到ss的位置与发送方的时序保持一致。可以类比为右边的钟表每一时刻所有的节点都必须指向同一位置。再同步我们的理想状态下是接收方在数据中心采样但是这只是一种理想的状态我们难免会因为一些影响导致我们的采样点不在数据中心位所以我们有一个解决方法就是我们在一个跳变沿开始计时到采样时刻如果时间短的话那就让后面采样慢一点。以此类推。仲裁不同时发这时设备1正在发送数据然后设备2检测到有设备正在发送数据所以说设备2进入等待状态。等待下一次总线空闲总线空闲当检测到11位隐性电平时就认为此时总线是空闲状态。一旦有设备正在发数据总线就会变成活跃状态必然不会出现11个隐性电平。同时发总线空闲时来了两个设备来争夺那么ID号小的优先级高的先发送ID号大的优先级低后发送。这里有两个特点就是1.总线的线与特性2.回读机制。因为这两个特性正是硬件自身判断ID号大小的关键。两个设备同时来的设备1和设备2发送起始位都是显性0将总线拉低他们分别回读后发现与自身一样就进行下一位的判断。随后通过判断前几位两个设备对总线的操作都是一样的回读也与自身一样。直到红色时刻。单元1发送隐性1拉高总线单元2发送显性0拉低总线。因为总线线与的特性所以总线呈现出拉低的状态单元1回读后发现与自身不一样那他就放弃总线的争夺等到下一次的总线空闲再去争夺。错误类型错误共有5种 位错误、填充错误、CRC错误、格式错误、应答错误当这些发送单元和接收单元检测到以上的错误是会产生错误通知。错误帧产生后这帧数据就会报废。数据传输也会终止。等错误帧结束后总线就会回归空闲。大家谁想发数据谁就开始一个新的帧。总线上的每个设备都是一个独立的检察官。但是有一个新的问题如果有一个设备坏了那么他收到的数据不管是不是错误的他都会认为是错误的就会一直发送错误帧干扰其他设备的运行。所以就引出了错误状态我们的设备状态都被分为主动错误状态和被动错误状态主动错误状态的设备检测到错误就发送主动错误相反被动错误状态的设备检测到错误就发被动错误状态。因为主动错误状态能打断总线上的数据所以当一个设备发生主动错误状态的次数越来越多时总线就会觉得这个设备会不会坏了就把他变成被动错误状态。变成被动错误状态后如果还频繁产生错误就把他转入总线关闭状态不让他参与通信。每个设备内部会有一个TEC发送错误计数值和REC接收错误计数值的值TEC是设备作为发送方每次检测到一个错误后会1成功发送一帧数据后会-1。相反REC也是当设备作为接收方时检测到一个错误REC就会1接收到一帧数据后会-1.设备在主动状态下TEC或REC的值大于127后会被转入被动错误状态。被动错误状态下TEC的值大于255后被转入总线关闭状态。STM32 can外设can基本结构这里的CAN_TX和CAN_RX与我们芯片上的GPIO相连。当接收到数据后我们的发送和接收控制器会自动根据过滤器的配置进行过滤然后发送数据时我们可以通过发送和接受控制器来设置要发送的报文ID标识符过滤器