通信协议

串口通信详解
IIC通信详解
SPI通信详解
CAN通信详解

文章目录

  • 通信协议
  • CAN通信
    • 什么是CAN通信?
      • CAN通信的优点:
      • CAN通信电平格式:
      • CAN通信的结构:
    • CAN通信协议
      • 数据帧的传输:
      • 传输的实例:
      • 传输的“时钟”——位时序:
      • CAN通信波特率
    • CAN通信的特点
    • CAN通信传输过程
    • STM32中的CAN通信
    • STM32 CAN通信编程参数设置

计算机与外界的信息交互称为通信

基本的通信方式分为两种:
串行通信:所传送的数据各位按顺序一位一位地发送或接受,占用资源少,速度相对较慢。
并行通信:所传送的数据的各个位是同时发送或接受。速度快,占用引脚资源多。

通信的速率
比特率(bit rate):每秒能传输的二进制位数。
波特率(Baud rate):每秒能传输的码元数(不一定是二进制)。
对于数字信号而言,波特率=比特率。

串行通信的种类
同步通信:带时钟同步信号传输,通讯双方是受同一个时钟源控制,如I2C、SPI、USART。
异步通信:不带时钟信号同步,不是同一个时钟源,按照一定规则传输,如USART、UART、单总线、CAN。

串行通信的方式
单工:只允许单方向传输,只需一条信号线
半双工:允许非同时进行的双方向传输,只需一条信号线。
全双工:允许同时进行双方向传输,需要两条信号线。

通信协议是主控MCU与各类驱动器、传感器之间实现信息交互的基本逻辑,搞懂通信协议在机器人的电控系统中占有很重要的地位。在接下来的内容中,我将分别讲解串口IICSPICAN通信协议的区别原理以及结合实际一些模块的代码部分。


CAN通信

什么是CAN通信?

CAN通信是串行通信的一种,但要优于传统串口协议总线,如汽车上的电气部分就采用CAN总线。与SPI和I2C不同,CAN总线不是以时钟信号来进行同步的,而是通过自己独有的位时序来同步的。它是一种异步半双工通信,通过两条线传输(CANL和CANH)。

CAN通信的优点:

由于真实环境中干扰因素很多,不稳定,CAN通信采用了差分信号传输。即使环境问题导致CAN_High电压发送变化,则CAN_L也会发送同等变化,两者做差即可抵消由于这个环境引起的变化。
对比SPI:CAN节省了布线资源。
对比I2C:CAN提高了传输速率。

CAN通信电平格式:

CAN_Rx和CAN_Tx分别是从MCU中接出来的引脚。

比如MCU要发送一个逻辑1,则只要将CAN_Tx设置为1,经过CAN收发器转换(将MCU的TTL电平转化为CAN通信差分电平)。

CAN_High和CAN_Low 线上的电压均为 2.5v,即传到总线的电压差 Vh-Vl=0V,总线上的状态则就是逻辑1。

同样,当CAN_High和CAN_Low 读取到 CAN总线电压分别3.5V和1.5V,即压差为2V,经过收发器转换,MCU则可通过CAN_Rx读取到信号0。
**隐性电平——电压差为0——逻辑电平为1
**显性电平——电压差为2——逻辑电平为0

CAN通信的结构:

在CAN总线的起止端有一个 120Ω的终端电阻,是用来做阻抗匹配,以减少回波反射,保证传输的稳定性。匹配电阻不能过多,只用在传输线的起始位置和终止位置添加即可,过多会导致传输丢失,在实际中要看主控板和接收端是否都有匹配电阻。


CAN通信协议

CAN通信没有地址的概念,所以同样少的线要求CAN通信有一个更复杂的协议。

空闲状态:总线上连续出现11位隐形电平(逻辑电平为1,线上电压为0)时,节点就认为总线处于空闲状态。
*总线上显性电平具有优先权,只要一个节点显性,总线就为显性。隐形则意味着所有节点都要输出隐形电平。
*同一时间只允许一个节点传输数据。

传输状态:当总线为空闲状态时,节点就会立即上报自己的数据,这个数据里不仅有数据,还有本身的ID信息或者其他的控制指令,传输的整个数据包称为报文/邮件/帧。CAN中一共有5种类型的报文/邮件/帧。
------------------------------------------------------------------------------------------------------------------
数据帧:用于发送单元接收单元传送数据。(通常)
远程帧:用于接收单元向具有相同ID的发送单元请求数据。
错误帧:用于检测出错误时的上报。
过载帧:用于接收单元尚未做好准备时的上报。
帧间隔:用于以上几个帧之间的分隔。
------------------------------------------------------------------------------------------------------------------

数据帧的传输:

①起始位(SOF):显性位(置0,传输电压2V,代表传输开始)
②仲裁段(ID):11位,即本帧数据的ID信息,这段信息会被筛选器/过滤器筛选,来判断多个节点传输时谁优先?(0位多优先级高)传输目标节点通过识别ID数据位来判断是否接收?

  • 筛选器/过滤器有两种模式
    标识符列表模式:把要接收报文的ID列成一个表,要求报文ID与列表中的某一个标识符完全相同才可以接收,可以理解为白名单管理。
    掩码模式(屏蔽位模式):把可接收报文ID的某几位作为列表,这几位被称为掩码,可以把它理解成关键字搜索,只要掩码(关键字)相同,就符合要求,报文就会被保存到接收邮箱FIFO。

③是否为远程帧(RTR):1位,保持显性(置0)。数据帧为0,远程帧为1,远程帧没有数据段。
④标准格式和扩展格式(IDE):1位,标准格式为显性(置0),扩展格式为隐形(置1)。

  • 标准格式和扩展格式区别
    仲裁段(ID)长度:标准格式是11位,扩展格式是29位(即可以设置29位的CAN ID)
    控制段起始:标准格式为IDE位+r0位;扩展格式为r1位+r0位。

⑤数据长度帧DLC:4位,表示接下来数据段含有的字节数,因为数据段最多为64位(8字节),所以DLC表示的数字范围为0-8(0000到1000),先高位再低位。
⑥数据内容帧DATA:64位,共8字节,对于每个字节来说,先高位再低位。
⑦校验帧CRC:15位(检验位)+1位(间隔位)检查是否有错误。
⑧应答帧ACK:1位(应答位)+1位(间隔位)
⑨停止位:7个连续的隐性位(置1,传输电压0V,代表传输结束)

  • 为防止突发错误而设定,CAN协议中规定,当相同极性的电平持续五位时,则添加一个极性相反的位,这个位对数据传输没有影响。

传输的实例:

0 01000000000 0 0 1000 XX…XX CRC 11 1111111

传输的“时钟”——位时序:

CAN通信本身没有时钟线,所以它通过位时序来同步,充当时钟的作用,以此来保证接收的正确。

位时序:CAN通信传输一个数据帧本质是一连串的电平信号,每个电平信号代表一位。我们把每一位又分成四段,分解后最小时间段单位为Tq,一个完整的位由8到25个Tq组成,称为位时序:

  • 同步段(SS):1Tq,在帧起始信号SOF出现时,将这个信号的跳变沿包含到同步段SS内,实现硬同步。
  • 传播时间段(PTS):1—8Tq,用来补偿实际的物理延时。
  • 相位缓冲段1(PBS1):1—8Tq,用来补偿硬同步阶段的误差,延长时间长度,称为重新同步。
  • 相位缓冲段2(PBS2):2—8Tq,用来补偿硬同步阶段的误差,缩短时间长度,称为重新同步。
    *需要设置的参数:重新同步补偿宽度(SJW)1—4Tq,可以以此来规定PBS1和PBS2的长度,会对通信速率有影响。
    *采样点:某一位的电平由该位中的采样点电平决定,采样点在PBS1处结束。

CAN通信波特率

*CAN通信速率大小(波特率)=CAN外设时钟频率/((SJW+PBS1+PBS2)CAN分频系数)


CAN通信的特点

CAN总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。

降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。

CAN通信传输过程

此图来源于某站UP421施公队


STM32中的CAN通信

①CAN主控制寄存器(CAN_MCR)

②CAN通信工作模式

  • 工作模式
    初始化模式(INRQ=1,SLEEP=0)
    正常模式(INRQ=0,SLEEP=0)
    睡眠模式(SLEEP=1)

  • 测试模式
    静默模式( LBKM=0, SILM=1 )
    环回模式( LBKM=1,SILM=0 )
    环回静默模式(LBKM=1,SILM=1)

  • 调试模式

正常模式:节点正常向节点发送和接收数据。

静默模式:(发送受限,正常接收)

回环模式:(可以发送不能接收,总线可以监测数据)

回环静默模式:(可以发送不能接收,总线不可以监测数据)

③位时序寄存器(CAN_BTR)

④3个发送邮箱
每个发送邮箱包括标识符寄存器、数据长度控制寄存器、2个数据寄存器。负责设置传输协议中的各种帧参数大小

⑤2个接收邮箱(FIFO)

  • 每个接收邮箱(FIFO)包含标识符寄存器、 数据长度控制寄存器、2个数据寄存器,负责设置接收数据传输协议中的各种帧大小。
  • 有28个过滤器/筛选器,对应的寄存器用来设置CAN通信的模式,对应模式的长度以及过滤器的激活状态。

关于CAN通信更详细的知识看博客:
CAN通信寄存器详解

STM32 CAN通信编程参数设置

①主寄存器设置(CAN通信基本配置)

②位时序设置(波特率)

③过滤器设置(发送邮箱过滤器)

④发送邮箱设置(发送方参数)

⑤接收邮箱设置(接收方参数+中断标志参数)

CAN_GetITStatus函数用于检查CAN通信接收中断是否发生

其中检验的参数可以是如下几个

  • CAN_IT_TME: 发送邮箱空中断
  • CAN_IT_FMP0: FIFO0消息挂起中断(有信息之后产生中断)
  • CAN_IT_FF0: FIFO0满中断
  • CAN_IT_FOV0: FIFO0溢出中断
  • CAN_IT_FMP1: FIFO1消息挂起中断
  • CAN_IT_FF1: FIFO1满中断
  • CAN_IT_FOV1: FIFO1溢出中断
  • CAN_IT_WKU: 唤醒中断
  • CAN_IT_SLK: 睡眠确认中断
  • CAN_IT_EWG: 错误警告中断
  • CAN_IT_EPV: 错误被动中断
  • CAN_IT_BOF: 总线关闭中断
  • CAN_IT_LEC: 最后一个错误代码中断
  • CAN_IT_ERR: 错误中断

CAN_GetITStatus位将默认为0(RESET),当中断发生时,将变为1(SET)。

搭建机器人电控系统——通信协议——CAN通信及其实例相关推荐

  1. 搭建机器人电控系统——通信协议——串口通信USART/UART、RS232、RS485及其实例

    通信协议 串口通信详解 IIC通信详解 SPI通信详解 CAN通信详解 文章目录 通信协议 什么是串口? 串口分类 USART/UART.RS232.RS485的区别 串口协议原理 传输协议 需要定义 ...

  2. 搭建机器人电控系统——MCU基石——STM32 GPIO原理

    文章目录 搭建机器人电控系统--MCU基石 GPIO是什么? GPIO的模式 5种输入模式: 4种输出模式: GPIO的输出速度 搭建机器人电控系统--MCU基石 在上一章中,我讲解了搭建一个机器人电 ...

  3. 搭建机器人电控系统——如何从零开发主控?——文件下载、工程配置、烧录

    文章目录 搭建机器人电控系统--如何从零开发主控? 如何开发主控?(软件实现烧录控制功能) 确定你选择的MCU参数 ①首先去ST官网上找到对应的单片机型号: ②找到对应型号的三大关键参数: ③找到官网 ...

  4. 搭建机器人电控系统——PID算法——什么是PID?

    PID算法 PID算法介绍,不同系数仿真,优缺点 位置式.增量式.模糊式PID 大林算法.史密斯算法和PID算法的区别 文章目录 PID算法 控制系统介绍 开环控制系统 前馈控制系统 单闭环控制系统 ...

  5. 搭建机器人电控系统——器件选型——如何选择电机?

    器件选型 电源选择 传感器选择 电机选择 电机选型 电机是机器人电控系统控制机构动力的直接来源,一个好的电机可以解决很多机械的问题,也能解决很多控制的问题.电机的选型不仅和电控有关,也和机械环境密切相 ...

  6. 搭建机器人电控系统——器件选型——如何选择传感器?

    器件选型 电源选择 传感器选择 电机选择 传感器 传感器是电控中非常重要的元件,对于不同的传感器,我们也需要对其进行选型,在学校的时候,也许我们不用考虑到太多的成本问题.对于我们来说,选择一个传感器应 ...

  7. 搭建机器人电控系统——如何从零画一块主控板?——搭建最小系统电路原理图

    文章目录 如何画好一块主控? 搭建最小系统电路原理图 以STM32F407ZET6为例: 晶振电路原理 如何搭建晶振电路? 复位电路原理 如何搭建复位电路? 下载电路 电源电路原理 如何搭建电源电路? ...

  8. 搭建机器人电控系统——器件选型——如何选择机器人系统电源?

    器件选型 电源选择 传感器选择 电机选择 电源的参数 一般来说,一款电池的参数主要如下图所示.其中的电压V.容量MAH.持续放电电流A是我们主要的选型依据,接口端子和重量尺寸也是需要考虑的因素. 如何 ...

  9. 搭建机器人电控系统——常用电路——输入保护,过压保护,过流保护,光耦隔离抗干扰,输入补偿,稳压

    文章目录 一些常用电路的总结 输入保护电路 ①PMOS+电容防反接和缓冲 ②TVS瞬态电压抑制二极管 ③稳压(齐纳)二极管 过压保护电路 ①稳压二极管和三极管配合 ②双稳压二极管的反向串联 过流保护电 ...

最新文章

  1. 一步一步学习SignalR进行实时通信_6_案例
  2. Js让静态人物动起来Demo演示
  3. UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)
  4. CentOS6.2 自定义系统调用
  5. Myeclipse中web project各种常见错误及解决方法(持续更新)
  6. python使用ip代理抓取网页
  7. 初探线程之线程竞争及故障
  8. Flask-SocketIO传输二进制单元测试的Bug和修改
  9. 实战用Python+Pygame+Kivy(Buildozer)+Ubuntu开发安卓android手机端apk游戏及踩坑分享
  10. 计算机专业教师技能比赛,青年教师展风采,技能比赛促提升
  11. linux按行分割文件,按行切割大文件(linux split 命令简版)
  12. 设定Applocker和解决问题
  13. Excel房贷计算器
  14. eclipse的放大字体
  15. 华为交换机console密码相关
  16. C# CultureInfo列表详细说明
  17. linux下硬盘读写速度测试
  18. html5 占位图片,placeholder.js-可在浏览器端生成占位图片的js插件
  19. 收银台模块php课程设计,【基于PHP+MySQL的美发店收银系统的设计与实现最终版材料】...
  20. iOS 测试在应用发布前后的痛点探索以及解决方案

热门文章

  1. 我的世界租赁服务器维护怎么重新刷新,《我的世界》【PC】版大更新!租赁服购买/续租功能,自定义头像功能已开启!...
  2. Rust能力养成之(12)用Cargo进行项目管理:实操项目imgtool
  3. Hive中的order by ,sort by ,distribute by , cluster by 区别
  4. 上海数据库开发工程师的职业要求
  5. XQN-vivado fix类型
  6. WebSocket实现android消息推送
  7. IPRAN--vrrp eth-trunk
  8. dns电脑服务器修复系统假死,电脑隔一会就断网,我用360断网急救箱一直是dns跟最后一个异常,然后强力修复重启就好了,但还是一直断网...
  9. 容器化 中国5000年 历史时间轴
  10. android棋类计时器,棋类游戏计时器