视频:
CAN总线入门教程 - 持续更新中_哔哩哔哩_bilibili
CAN 通讯 实验 程序现象
接线图
有 3个STM32设备 作为CAN总线的 节点 均接入TJA1050 CAN收发器模块 将三个 CAN收发器的 CAN_H接在一起 CAN_L也接在一起
(设备一发送 设备二和设备三接收)按下设备一的按键 设备一 会广播TXID为555的数据(设置了设备一TXID为555) 数据长度为4字节 数据内容在最下面
(设备二发送 设备一和设备三接收)按下设备二的按键 设备一 会广播TXID为666的数据(设置了设备一TXID为666) 数据长度为4字节 数据内容在最下面 (设备三同理)
CAN:可以 广播发送自己的数据 可以配置为 请求模式传输 我请求你了 你才发数据 每个设备还能设置过滤器 进行选择性的接收
CAN简介
CAN总线:为差分信号(双绞线) 两根通讯线(CAN_H CAN_L)无需供地
CAN总线 分为 高速CAN(ISO11898) 和 低速CAN(ISO11519)
CAN总线: 半双工 所以不能同时发送和接收 多设备同时发送时 会通过仲裁判断先后顺序 根据报文ID仲裁。
报文ID 11位的叫标准格式 29位的 叫扩展格式 ID号小的优先发送
CAN总线与其他总线对比
应用场景:
串口:
点对点的 两个设备的互相通信 例如 单片机 和 电脑的 串口助手 点对点通讯。 (弊端:只能俩点对点通讯)(但两个设备都可以是主控 也就是 两主 一主一从)
I2C: 默认为高电平 如果想传输0 则把线路强制拉低 1 则总线不操作 实现线与的操作
一个单片机当主控 其他全部为从设备(外挂多个被动 传感器之类的模块) 主要 一主多从
SPI:
场景和 I2C类似 一主 多从(但通讯速率 最快 ) 应用于高速通信的场景
CAN: 如果想实现 有很多 主控单片机 相互进行通讯 比如 5个STM32 之间任意通信
这时候就可以利用到 CAN总线了 , USART I2C SPI 都难以实现这个要求
CAN总线硬件电路:总线默认状态就是 1
CAN收发器 就是一个芯片 主要实现 电平转换 输出驱动和输入采样 几个功能
STM32(CAN控制器) 与CAN收发器 TX接TX RX接RX 无需交叉
高速 CAN总线:使用闭环网络 两端有120Ω的电阻
电阻作用: 1.防止回波反射 尤其是 高频信号、远距离传输的场景 如果不加终端电阻 信号波形会在线路终端反射,进而干扰原始信号
加了终端电阻 且 阻抗匹配 则电平跳变会比较平稳
2. 在没有设备操作时 将两根差分线的电压 “收紧” (收紧为 电平1 呈隐性) 使其电压一致。
收紧:在没有设备操作总线的情况下 电阻就和弹簧一样 将两根线(CAN_H CAN_L) 的电压拉到同一个电平 和I2C的上拉电阻很像。
如果某个设备想要发送 0 时 设备会操作总线 把总线 拉开(总线的电平拉开) 使其呈现0状态
当设备想要发送 1时 就不去碰总线 总线 在终端电阻的收缩下 自动默认为1状态。
低速 CAN总线:开环网络 CAN_H 和CAN_L 其中一端 +一个2.2KΩ的电阻。
没有形成环路 一端接到总线 另一端 悬空
电平标准:1为隐性 0为显性
高速CAN总线
电压差(是电压差!!!差!!) 0V 表示 逻辑1 (隐性电平) 因为没有压差
电压差(是电压差!!!差!!) 2V 表示 逻辑0 (显性电平) 因为有压差
下图有两种 表示方式 一种是 逻辑电平 另一种 是 差分电平(有两根线 CAN_H和 L)
当CAN_H和L对地的电压都为2.5V时(压差为0): 表示当前 CAN总线 处于 逻辑1 的状态
当CAN_H对地电压3.5 L对地电压1.5V (压差 2V):表示 当前 处于 逻辑0 的状态
如果 CAN 想发送 101 数据流 则 CAN总线就会呈现出 两线收紧 两线张开 两线收紧的状况
总线 收紧状态:成为 隐性电平 张开状态(电压差增大 就很像张开):称为显性电平
显性和隐性表现的是总线的状态 没有电压差 为 默认状态 所以叫隐性
两线张开 产生电压差 需要设备干预 所以为 显性。
低速CAN总线
电压差(是电压差!!!差!!) -1.5V 表示 逻辑1 (隐性电平) 因为没有压差
电压差(是电压差!!!差!!) 3V 表示 逻辑0 (显性电平) 因为有压差
因为低速CAN 传输距离更远 考虑到线路会有压降 所以把1和0的 电压差的 差距增大了