推挽输出与开漏输出详解

一、推挽输出(Push-Pull Output)

  1. 内部结构
    由一对互补的 N 型 MOS 管和 P 型 MOS 管组成,两管交替导通 / 截止:
    1. 输出高电平时:P 型 MOS 管导通,N 型 MOS 管截止,引脚直接连接 VCC(如 3.3V)
    2. 输出低电平时:N 型 MOS 管导通,P 型 MOS 管截止,引脚直接连接 GND
  2. 核心特点
    1. 无需外部上拉电阻,可直接输出稳定的高 / 低电平
    2. 驱动能力强(高低电平均有主动驱动能力)
    3. 输出速度快,适合高速信号传输(如 SPI、UART 等)
    4. 无法实现线与逻辑(多个推挽输出直接并联可能导致短路)
  3. 典型应用
    1. 直接驱动 LED、继电器等中小功率负载
    2. 单端信号传输(如普通 GPIO 控制、数字电路接口)

二、开漏输出(Open-Drain Output)

  1. 内部结构
    仅包含一个 N 型 MOS 管(漏极开路):
    1. 输出低电平时:N 型 MOS 管导通,引脚连接 GND
    2. 输出高电平时:N 型 MOS 管截止,引脚呈高阻态(浮空),需外接上拉电阻才能输出高电平
  2. 核心特点
    1. 必须外接上拉电阻(阻值通常 1kΩ~10kΩ)才能输出高电平
    2. 支持电平转换:通过选择不同电压的上拉电源(如 3.3V→5V 或 5V→3.3V),实现不同电平器件间通信
    3. 支持线与逻辑:多个开漏输出引脚并联时,只要有一个输出低电平,总线即为低电平;所有输出高阻态时,上拉电阻将总线拉为高电平
    4. 驱动能力有限(仅低电平有主动驱动能力,高电平由上拉电阻提供)
  3. 典型应用
    1. I2C、SMBus 等需要线与逻辑的总线协议
    2. 电平转换电路(如 3.3V 单片机控制 5V 外设)
    3. 多个设备共享总线的场景(避免信号冲突)

三、关键区别总结

特性

推挽输出

开漏输出

输出高电平

主动驱动(接 VCC)

依赖上拉电阻(高阻态)

输出低电平

主动驱动(接 GND)

主动驱动(接 GND)

上拉电阻

无需

必须

线与逻辑

不支持

支持

电平转换

不支持

支持

驱动能力

较弱(高电平依赖电阻)

适用场景

高速单端信号、直接驱动

总线协议、电平转换

stm32时钟系统

1.系统时钟(SYSTICK)由HSE / HSI 经过 PLL锁相环倍频得到

2.AHB系统总线(HCLK)由systick分频得到,通常是1分频等于systick, 供CPU和DMA使用

3.APB1(PCK1)由Hclk分频得到,通常2分频36Mhz 用于低速外设(I2C,UART)

3.APB2(PCK2)由Hclk分频得到,通常1分频72Mhz 用于低速外设(SPI,ADC)

USART启动流程

1.开启时钟

2.初始化GPIO引脚和USART初始化配置

3.配置NVIC中断

4.使能USART

5.根据中断向量表编写中断函数(记得清除中断标志位)

AFIO的作用

AFIO主要用于引脚复用功能的选择和重定义

在stm32单片机中,AFIO主要完成两个任务:复用功能引脚重映射,中断引脚选择

定时器(TIM)

定时器的本质就是计数器,stm32中定时器是16位的。

不仅支持基本的定时中断,还可选择内外时钟源,以及主从模式,输入捕获,输出比较,编码器接口等多种功能。

stm32f103c8t6有四个定时器 : TIM1(高级定时器),TIM2,TIM3,TIM4(均为通用定时器)。

高级定时器继承了通用定时器所有功能,除此之外还拥有重复计数器,死区生成,刹车输入,互补输出等功能。

定时器中断模式框图如下

定时器中断步骤

  1. 开启时钟
  2. 选择时钟源
  3. 时基单元初始化
  4. NVIC分组,配置NVIC
  5. 编写定时器中断函数

影子寄存器

影子寄存器:是一个特殊的寄存器,作用是缓冲定时器配置寄存器的修改配置(ARR,PSC)。

当开启影子寄存器时,对配置寄存器的写入不会立即生效,而是先存入「预装载寄存器」,等待定时器更新事件(如计数器溢出、手动触发更新)发生后,才将预装载寄存器的值「同步」到影子寄存器,最终作用于定时器。

优点:1. 确保 ARR、PSC 等参数在同一个更新事件中统一生效,适合需要精确同步的场景(如 PWM 周期与占空比同时更新);2. 防止运行中修改参数导致的计数异常(如避免中途修改 ARR 引发的意外溢出)。

缺点:参数更新存在延迟,需等待下一次更新事件才能生效,不适合需要即时修改参数的场景。

一般建议开启影子寄存器。

OC输出比较

输出比较可以通过比较CNT与当前CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。stm32f103c8t6中,拥有四个通道。

PWM

PWM是一种脉冲宽度调制技术,通过周期性改变高低电平的占空比,等效输出平均电压,实质其实就是方波,核心点其实就是周期和占空比。

PWM配置步骤

  1. 开启时钟
  2. 配置时钟源
  3. GPIO 时基单元 OC比较初始化
  4. 定时器使能

为什么 PWM 控制 LED 不会闪烁

PWM频率高于50HZ,超出了人体所能识别的频率,在人体看来LED不会闪烁,一般设置为大小超过1khz,既避免闪烁,又不会因频率过高导致驱动电路损耗增加。

STM32 定时器如何产生 PWM?涉及哪些关键寄存器?

核心就是定时器计数器(CNT)和比较寄存器(CCR)实时比较

根据设置的PWM模式判断与CNT的比较置有效电平还是无效电平

  • 关键寄存器:TIMx_ARR(设置周期)、TIMx_PSC(预分频,控制计数频率);
  • TIMx_CCRx(设置占空比)、TIMx_CCMRx(配置 PWM 模式)
  • TIMx_CR1(使能定时器)。

为什么要开启影子寄存器?关闭会有什么问题?

影子寄存器是 CCR/ARR 的缓冲器,开启后(如 ARPE 位使能),对寄存器的修改会在 “更新事件”(如下一次溢出)时同步生效,避免参数突变导致的波形异常。

如果关闭可能会造成:

  • 当新的CCR的值小于当前CNT的值,可能会让PWM脉冲翻转,产生窄脉冲。
  • 对于电机需要同时更新占空比和周期,多路PWM同时更新产生了相位差。

PWM 控制电机抖动,可能的原因及解决办法?

  • 频率过低(提高频率至1khz以上)
  • PWM占空比跳变 (改为渐变过程)
  • 多路电机驱动时,各通道PWM不同步,采用主从定时器解决。

软件模拟 PWM 的实现方式及精度影响因素?

实现方式:

定时器中断 + GPIO电平翻转。达到CCR的值就翻转电平,达到ARR的值就重置计数。

精度影响因素:

  • 中断响应延迟:高优先级的中断抢占,导致脉冲宽度有偏差
  • CPU负载:高频的PWM会频繁触发中断,占用大量CPU的资源
  • 系统时钟不稳定性:会导致周期不准。

IC输入捕获

用于实时捕捉外部信号的边沿(上升沿 / 下降沿),并记录该时刻定时器的计数值。通过计算两次捕获的时间差,可精确测量外部信号的频率、周期、脉冲宽度等参数。

ADC

ADC配置步骤

  1. 开启时钟,对时钟进行分频(一般6分频)
  2. 配置GPIO,初始化ADC(配置连续模式OR扫描模式)
  3. 使能ADC
  4. 进行校准
  5. 读取转换后的数值

ADC是什么?有什么作用?

ADC是模数转换器,他的作用是将模拟信号转换为单片机所能理解并存储计算的数字信号。

ADC的工作原理

  1. 采样:ADC对连续的模拟信号进行定时采样将其转换为离散的数字值
  2. 量化:将采集到的模拟信号映射到离散的数字值
  3. 编码:将量化后的值转化为二进制数值

ADC配置

扫描模式:当开始转换后,会根据ADC通道数量按顺序进行N次转换,全部转换完成后设置 EOC(规则组转换结束) 标志位

非扫描模式:当开始转换后,仅会对规则组位置一的通道进行1次转换,转换完成设置 EOC 标志位

单次转换:在开始转换后,仅仅对规则组整组进行一次转换

间断模式:在开始转换后,进行 N 次转换后停下,并记录当前位置,当下次开始转换时按顺序下去。

ADC 的分辨率是什么意思?假设参考电压是 3.3V,12位的ADC的最小分辨电压分别是多少?

分辨率表示 ADC 能区分的最小模拟信号变化量,分辨率越高,采集精度越高

最小分辨电压 = 3.3/(2^12)

什么是 “ADC 多通道扫描模式”?什么时候需要用它?

ADC多通道指的是在进行ADC数据扫描时,按照设定的通道顺序逐个扫描。

使用场景:需要同时采集多个物理量

ADC 的 “规则通道” 和 “注入通道” 有什么区别?什么时候用注入通道?

ADC的规则通道和注入通道是两个优先级不同的采集通道。

使用区别:

规则通道的优先级较低,一般用于处理常规非紧急的信号采集,通道数量多至16个

注入通道的优先级较高,一般用于处理紧急高优先级的信号采集,通道数量多至4个

若需要同时采集 “高频信号(如 100kHz 电流)” 和 “低频信号(如 1Hz 温度)”,ADC 该如何设计方案?

核心思想:规则组 + 注入组

单ADC实现:

高频信号(100kHz 电流):用 规则通道 + 连续转换 + DMA

低频信号(1Hz 温度):用 注入通道 + 定时器触发,配置定时器定时1s 触发一次注入通道,打断规则通道的连续转换,采集完温度后自动回到规则通道继续采集电流。

双ADC实现:

ADC1 专门采集高频电流:规则通道 + 连续转换 + DMA

ADC2 专门采集低频温度:单通道单次转换 + 定时器 1s 触发

DMA

DMA是什么?DMA有什么用?

DMA全称直接内存访问,是单片机的一种硬件机制,无需CPU的干预,可以实现存储器到存储器、存储器到外设、外设到存储器数据传输。用来释放CPU的

其实就是用来搬运数据的这么一个助手。

DMA 传输完全不需要 CPU 吗?CPU 需介入的环节?

CPU 仅在传输初始化和特殊状态处理时介入,核心传输过程由 DMA 硬件完成。

ADC 连续采样 100 组数据到 RAM 的核心步骤?

  1. 时钟使能:使能 GPIO、ADC1、DMA1 时钟
  2. GPIO 配置:PA0 设为模拟输入
  3. ADC 配置:单通道连续转换,使能 ADC 的 DMA 请求
  4. DMA 配置:
    1. 通道:DMA1_Channel1(ADC1 对应通道);
    2. 参数:源地址 =(&ADC1->DR)、目标地址 = RAM 数组首地址、传输长度 = 100、方向 = 外设→内存、源地址固定、目标地址自增、传输宽度 = 半字(16 位)、循环传输禁用(单次传 100 组);
  5. 使能传输:使能 DMA 通道,软件触发 ADC 转换
  6. 数据处理:DMA 传输完成后(查状态位或中断),读取 RAM 数组数据

USART

USART是什么?和UART有什么区别

USART全称 通用同步异步收发器,是一种串口通信协议。

与UART的区别:UART只支持异步,发送方和接收方通过约定好的波特率进行数据收发

而USART可以支持同步也可以支持异步数据收发,但是同步的时候只支持时钟输出,不支持时钟输入,所以无法实现两个USART同步通信。

数据传输的格式/通信协议

1.起始位:

​ 当未有数据发送时,数据线处于逻辑“1”状态;先发出一个逻辑“0”信号,表示开始传输字符。

2.数据位:

​ 紧随起始位之后,数据位表示真正要发送或接收的信息,位数一般有8位或9位

3.奇偶校验位:

​ 数据位末尾可以选择是否添加奇偶校验位,用于检测数据传输是否正确

4.停止位:

​ 代表信息传输结束的标志位,可以是1位,1.5位或2位。停止位的位数越多,数据传输的速率也越慢。

5.波特率设置:

波特率表示每秒钟传输码元的个数,是衡量数据传输速率的指标,单位Baud。

 USART 的 “串行” 含义?与 SPI、I2C 的通信特点差异?

串行含义:数据按位依次传输(默认先传低位后传高位),仅需 1-2 根数据线(异步 2 根:TX/RX;同步 3 根:TX/RX/SCLK)

异步模式下的帧结构及各字段作用?

异步模式以 “帧” 为单位传输,典型帧结构(1 位起始位 + 8 位数据位 + 1 位偶校验位 + 1 位停止位)

  • 起始位:低电平(逻辑 0),标志一帧数据开始(打破空闲时的高电平,提醒接收方准备接收);
  • 数据位:传输实际数据(5-9 位可选,常用 8 位),低位在前、高位在后;
  • 校验位:用于检错(奇 / 偶 / 无校验可选),偶校验时 “数据位 + 校验位” 的 1 的个数为偶数,奇校验相反,可检测单 bit 错误;
  • 停止位:高电平(逻辑 1),标志一帧数据结束(长度 1-2 位可选),给接收方留出 “恢复到空闲状态” 的时间。

异步模式无时钟线,如何保证同步?

收发双方提前约定相同的波特率,接收方通过 “起始位” 同步时序 —— 检测到起始位(低电平)后,按波特率对应的位周期采样后续数据位。

USART 初始化的核心步骤及寄存器?

核心步骤:“时钟使能→GPIO 配置→USART 参数配置→中断 / DMA 使能→USART 使能”:

  1. 时钟使能:使能 USART 外设时钟和 GPIO 时钟;
  2. GPIO 配置:TX 引脚设为 “复用推挽输出”(如 PA9→AF_PP),RX 引脚设为 “浮空输入”(如 PA10→IN_FLOATING);
  3. USART 参数配置:
    1. 波特率:通过USART_InitStruct.USART_BaudRate配置(如 115200);
    2. 数据格式:USART_WordLength(8 位)、USART_StopBits(1 位)、USART_Parity(无校验);
    3. 模式:USART_Mode_Tx(发送使能)+USART_Mode_Rx(接收使能);
      调用USART_Init(USART1, &USART_InitStruct)
  4. 中断 / DMA 使能:若用中断接收,开启 “USART 接收中断”(USART_ITConfig(USART1, USART_IT_RXNE, ENABLE))并配置 NVIC;若用 DMA,使能 USART 的 DMA 请求;
  5. USART 使能:USART_Cmd(USART1, ENABLE)

传输 1024 字节大数据包的优化方案?

核心思路:用 DMA 配合 USART,避免 CPU 逐字节收发,同时自定义帧格式防止数据丢包,步骤:

  1. DMA 配置:
    1. 发送:DMA 通道设为 “内存→USART_TX 寄存器”,内存地址自增(1024 字节数组),传输长度 1024,循环禁用;
    2. 接收:DMA 通道设为 “USART_RX 寄存器→内存”,内存地址自增,传输长度 1024;
  2. 帧格式定义:在数据包前后加 “帧头(如 0xAA、0xBB)” 和 “帧尾(如 0xCC、0xDD)”,中间加 “长度字段”(1 字节,标识数据长度)和 “CRC 校验位”(1 字节,检错),避免接收端误判数据边界;
  3. 传输控制:发送时,先将 “帧头 + 长度 + 数据 + CRC + 帧尾” 组成完整数据包,启动 DMA 传输;接收时,DMA 将数据存内存,传输完成后(中断),软件解析帧头 / 帧尾 / CRC,确认数据完整性。

I2C

用三句话概括I2C的特点,与SPI有什么区别?

I2C第一种同步半双工的串行通信协议,两线通信(SCL,SDA),采用主从架构,通过设备地址寻址,实现多主多从。

区别:I2C两根线,SPI至少四根线,I2C有应答机制,SPI无应答机制,I2C有设备地址寻址,SPI拉低片选,I2C多主多从,SPI一主多从,I2C速度较慢,SPI速度较快。

SDA 和 SCL 为什么需要上拉电阻?阻值怎么选?

I2C 设备的 SDA/SCL 引脚采用开漏输出,只能拉低总线电平,无法主动输出高电平,因此需要上拉电阻将总线默认拉到高电平。

起始条件(S)和停止条件(P)的定义及作用?

起始条件是 SCL 为高电平时,SDA 从高电平跳变到低电平;停止条件是 SCL 为高电平时,SDA 从低电平跳变到高电平。

这两个条件的核心作用是界定一次完整通信的边界:起始条件后,总线被当前主设备占用,开始数据传输;停止条件后,总线释放,其他主设备可发起通信。

应答位(ACK)由谁发送?主设备没收到 ACK 会怎么处理?

应答位由从设备发送,位于每 8 位数据传输后的第 9 个时钟周期,低电平表示应答,高电平表示非应答。

主设备若没收到 ACK,工程中通常会:① 重试 1-3 次(排除偶发干扰);② 若仍失败,触发中断并记录错误码;③ 必要时发送停止条件复位总线,避免死锁。

举一个你用过的 I2C 从设备,说说配置流程?

以 EEPROM(如 AT24C02)为例,写数据流程是:

① 主设备发送起始条件(S);

② 发送从设备地址(7 位地址 + 写方向位 0),等待 ACK;

③ 发送要写入的存储单元地址(如 0x00),等待 ACK;

④ 发送数据字节,等待 ACK;

⑤ 发送停止条件(P)完成写入。

以 EEPROM(如 AT24C02)为例,读数据流程是:

① 主设备发送起始条件(S);

② 发送从设备写地址(7 位地址 + 写方向位 0),等待 ACK;

③ 发送要读取的存储单元地址(如 0x00),等待 ACK;

④ 主设备重新发送起始条件(S);

⑤ 发送从设备读地址(7 位地址 + 读方向位 1),等待 ACK;

⑥读取指定地址的数据

⑦主机主动发送非应答信号(告诉从设备读取结束)

⑧发送停止信号,结束通信

如何解决 I2C 设备地址冲突?

通过改变设备的地址引脚(进行拉高或者拉低)

通过I2C多路复用器

SPI

描述 SPI 协议的工作方式及关键信号线的作用?

SPI是一种同步串行通信协议,支持全双工,采用主从结构,支持一主多从,但不支持多主多从(没有总线仲裁机制)

核心信号线及作用:

  • SCLK(时钟线):由主设备产生,决定数据传输速率和采样时机;
  • MOSI(主发从收线):主设备向从设备发送数据的通道;
  • MISO(主收从发线):从设备向主设备返回数据的通道;
  • CS/SS(片选线):低电平有效,主设备通过拉低某一从设备的 CS,单独选中该设备通信。

解释 CPOL、CPHA 及 SPI 的工作模式?如何确定使用哪种模式?

CPOL(时钟极性):决定了空闲时期,SCLK是高电平还是低电平。

CPHA(时钟相位):决定了采样条件,是奇数边沿采样,还是偶数边沿采样

CPOL和CPHA可以组成四种模式,具体使用哪种模式,需要看从设备支持哪个工作模式

SPI 全双工与 I2C 半双工的区别及对效率的影响?

  • SPI 全双工:通过 MOSI 和 MISO 两根独立线,主从设备可同时收发数据(如主设备发命令时,从设备同步返回数据);
  • I2C 半双工:共用 SDA 一根线,同一时刻只能收或发,需通过方向位切换。

效率差异:SPI 在高速场景(如 10Mbps 以上)优势明显,尤其适合批量数据传输;I2C 因需切换方向和处理 ACK,速率通常受限,更适合低速小数据场景。

SPI 的 CS 信号为何需要上拉?多从设备时 CS 时序注意事项?

默认情况下CS是低电平有效,空闲时需通过上拉电阻保持高电平,避免误触发。

同一时刻只能有一个从设备进行通信(CS信号只能有一个为低,确保唯一选中)

在切换从设备时,需要将当前设备CS拉高并延时一段时间(防止总线残留干扰)

SPI 信号线是否需要上拉?与 I2C 的区别?

SPI的SCLK,MOSI,MISO通常不需要上拉,CS可能需要(防误触),因为采用的时推挽输出,能够输出稳定的高低电平。

与 I2C 的核心区别:I2C 采用开漏输出(只能拉低,无法主动输出高电平),必须依赖上拉电阻才能输出高电平。

SPI 读取数据流程

  1. 拉低片选信号(CS)
  2. 发送读数据寄存器的命令
  3. 接收数据
  4. 拉高片选信号(CS)

CAN

CAN总线概述和特征

  1. CAN全称:控制器局域网总线,是一种异步半双工串行通信总线
  2. CAN通信由两根差分通信线(CAN_H,CAN_L)进行差分通信(抗干扰强)
  3. 高速CAN(传输距离<40m,硬件采用闭环设计)低速CAN(传输距离<1km,硬件采用开环设计)两种模式
  4. 异步,通信速率由设备各自约定(发送每个数据位都有位时序)
  5. 半双工,可挂载多设备,多主机通信(无从机,不需要设备寻址),多个设备同时发送数据时通过仲裁判断来决定先后顺序
  6. 11位(标准帧)或29位(扩展位)报文ID,用来区分消息功能
  7. 可配置1-8字节的有效载荷(CAN通信一次最大发送8字节数据)
  8. 可以实现广播式(数据帧)和请求式(遥控帧 先发送遥控帧给主机设备,然后主机设备发送数据帧给从机设备)两种传输方式
  9. 有应答,CRC校验,位填充,位同步,错误处理等特性

CAN总线硬件电路

高速CAN采用闭环网络,这里相当于个收紧作用,将CAN_H电平和CAN_L电平拉到一个电平状态,使他们差值为0,默认为隐性电平1

终端电阻的作用主要是为了防止回波反射

注意:CAN控制器的TX与CAN收发器的TX相连,RX与RX相连无需交叉

高速CAN:总线回归隐性电平快,传输速率快

CAN总线五种数据帧

数据帧

发送前,总线必须处于空闲状态(隐性电平1)

  1. 帧起始:1位 SOF(显性电平0),代表数据传输开始
  2. 仲裁段:11位报文ID(标识符,区分功能,同时决定优先级(数字小的优先级大,详细看仲裁)),然后发送RTR位(显性电平0,代表这是数据帧)
  3. 控制段:IDE(扩展标志位,显性电平 0 ,表示这是标准格式)),R0(数据保留位),4位DLC(用于标识后续数据段传输数据字段的大小)
  4. 数据段:0-64位数据段,发送具体的数据
  5. CRC段:CRC 位循环冗余校验位,校验数据是否正确,CRC界定符
  6. ACK段:ACK应答位,判断数据有没有被接收方接收
  7. CRC/ACK界定符:为应答位前后发送方和接收方释放总线留下时间
  8. 帧结束:7位 EOF(隐形电平 1 ),代表数据传输结束

遥控帧

错误帧

  1. 位错误:节点发送的电平与实际监测到的总线电平不一致(仲裁位、应答位等特殊位除外)
  2. 填充错误:违反 CAN 的 位填充规则(连续 5 个相同电平时,需插入 1 个相反电平,若未正确插入 / 检测到填充位则报错)
  3. CRC错误:接收方计算的 CRC 校验码与发送方的 CRC 码不一致
  4. 格式错误:帧结构不符合规范(如帧结束不是 7 个隐性位)
  5. 应答错误:发送方发送应答位(隐性)后,未检测到总线的显性应答

错误帧的作用

  • 破坏错误数据:错误标志的显性电平会强制打断当前正在传输的错误数据帧,让错误数据无法被错误接收;
  • 通知所有节点:总线上的所有节点都能检测到错误帧,从而知晓当前传输存在错误;
  • 触发重发机制:发送节点检测到错误帧后,会启动 “重发流程”,再次尝试发送数据帧,确保数据最终能正确传输。

过载帧

帧间隔

CAN总线位填充

位填充规则:

发送方每发送5个相同电平后,自动追加一个相反电平的填充位,接收方检测到填充位时,会自动移除填充位,恢复原始数据

位填充作用:

  1. 增加波形的定时信息,利于接收方执行“再同步”,防止波形长时间无变化,导致接收方不能精确掌握数据采样时机

实现原理:由于总线上各个节点的时钟存在一定的误差,长时间没有电平变化,接收方就难以依据时钟信号准确判断采样点,从而导致数据接收错误。 而位填充机制通过插入相反的位,强制改变了总线电平状态,为接收方提供了更多的电平跳变沿。接收方可以利用这些跳变沿来调整自身的时钟,实现再同步,进而精确掌握数据采样时机,确保准确接收数据 。

  1. 将正常数据流与“错误帧”和“过载帧”区分开,标志“错误帧”和“过载帧”的特异性

实现原理:接收方在接收数据时,按照位填充规则进行解析。如果在接收过程中,发现数据流不符合位填充规则(出现了连续 6 个及以上相同的位),就可以判断接收到的不是正常数据流,而是错误帧或过载帧, 从而能够迅速识别并采取相应的处理措施,比如通知发送方重发数据等。

  1. 保持CAN总线在发送正常数据流时的活跃状态,防止被误认为总线空闲(默认发送11个隐形电平1)

实现原理:CAN 总线通过检测总线电平是否长时间处于隐性状态来判断总线是否空闲。如果没有位填充机制,当数据中存在大量连续相同的位时,总线电平会长时间保持不变,可能被总线上的节点误认为总线处于空闲状态,进而导致其他节点错误地开始发送数据,造成数据冲突。而位填充机制插入的位不断改变总线电平状态, 向总线上的所有节点表明总线处于数据传输的活跃状态,避免总线空闲误判。

CAN总线数据采样

  1. CAN总线没有时钟线,总线上的所有设备通过约定波特率的方式确定每一个数据位的时长
  2. 发送方以约定的位时长每隔固定时间输出一个数据位
  3. 接收方以约定的位时长每隔固定时间采样总线的电平,输入一个数据位
  4. 理想状态下,接收方能依次采样到发送方发出的每个数据位,且采样点位于数据位中心附近

位时序

位同步

分为硬同步(解决初始位置不同步)和再同步(解决初始位置同步,后续位置不同步)

硬同步

再同步

仲裁机制

仲裁原则

  1. 先占先得

2.非破坏性仲裁

其实发送方每次发送一位数据都会回传比对看正不正确。由于线与特性,只要发送0就一定会让总线读回0,但是发1就不一定读回1了,比如发1,但是总线上有人发0,读回的就是0,这个时候你的数据帧被破坏了,你就释放总线,这就是为什么ID相同的设备,数据帧的优先级(0)比遥控帧的优先级(1)高,标准格式(0)比扩展格式(0)的优先级高,ID小的比ID大的优先级高,因为他们0出现的较早,1出现的较晚,所以他们得到总线的几率大。

非破坏性仲裁过程

错误处理

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐