| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 搭建机器人电控系统——通信协议——CAN通信及其实例 -> 正文阅读 |
|
[嵌入式]搭建机器人电控系统——通信协议——CAN通信及其实例 |
通信协议串口通信详解 计算机与外界的信息交互称为通信。 基本的通信方式分为两种: 通信的速率: 串行通信的种类: 串行通信的方式: 通信协议是主控MCU与各类驱动器、传感器之间实现信息交互的基本逻辑,搞懂通信协议在机器人的电控系统中占有很重要的地位。在接下来的内容中,我将分别讲解串口、IIC、SPI和CAN通信协议的区别原理以及结合实际一些模块的代码部分。 CAN通信什么是CAN通信?CAN通信是串行通信的一种,但要优于传统串口协议总线,如汽车上的电气部分就采用CAN总线。与SPI和I2C不同,CAN总线不是以时钟信号来进行同步的,而是通过自己独有的位时序来同步的。它是一种异步半双工通信,通过两条线传输(CANL和CANH)。 CAN通信的优点:由于真实环境中干扰因素很多,不稳定,CAN通信采用了差分信号传输。即使环境问题导致CAN_High电压发送变化,则CAN_L也会发送同等变化,两者做差即可抵消由于这个环境引起的变化。 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。 CAN通信的结构:在CAN总线的起止端有一个 120Ω的终端电阻,是用来做阻抗匹配,以减少回波反射,保证传输的稳定性。匹配电阻不能过多,只用在传输线的起始位置和终止位置添加即可,过多会导致传输丢失,在实际中要看主控板和接收端是否都有匹配电阻。 CAN通信协议CAN通信没有地址的概念,所以同样少的线要求CAN通信有一个更复杂的协议。 空闲状态:总线上连续出现11位隐形电平(逻辑电平为1,线上电压为0)时,节点就认为总线处于空闲状态。 传输状态:当总线为空闲状态时,节点就会立即上报自己的数据,这个数据里不仅有数据,还有本身的ID信息或者其他的控制指令,传输的整个数据包称为报文/邮件/帧。CAN中一共有5种类型的报文/邮件/帧。 数据帧的传输:①起始位(SOF):显性位(置0,传输电压2V,代表传输开始)
③是否为远程帧(RTR):1位,保持显性(置0)。数据帧为0,远程帧为1,远程帧没有数据段。
⑤数据长度帧DLC:4位,表示接下来数据段含有的字节数,因为数据段最多为64位(8字节),所以DLC表示的数字范围为0-8(0000到1000),先高位再低位。
传输的实例:0 01000000000 0 0 1000 XX…XX CRC 11 1111111 传输的“时钟”——位时序:CAN通信本身没有时钟线,所以它通过位时序来同步,充当时钟的作用,以此来保证接收的正确。 位时序:CAN通信传输一个数据帧本质是一连串的电平信号,每个电平信号代表一位。我们把每一位又分成四段,分解后最小时间段单位为Tq,一个完整的位由8到25个Tq组成,称为位时序:
CAN通信波特率*CAN通信速率大小(波特率)=CAN外设时钟频率/((SJW+PBS1+PBS2)CAN分频系数) CAN通信的特点CAN总线是可同时连接多个单元的总线。可连接的单元总数理论上是没有限制的。但实际上可连接的单元数受总线上的时间延迟及电气负载的限制。 降低通信速度,可连接的单元数增加;提高通信速度,则可连接的单元数减少。 CAN通信传输过程此图来源于某站UP421施公队 STM32中的CAN通信①CAN主控制寄存器(CAN_MCR) ②CAN通信工作模式
正常模式:节点正常向节点发送和接收数据。 静默模式:(发送受限,正常接收) 回环模式:(可以发送不能接收,总线可以监测数据) 回环静默模式:(可以发送不能接收,总线不可以监测数据) ③位时序寄存器(CAN_BTR) ④3个发送邮箱 ⑤2个接收邮箱(FIFO)
关于CAN通信更详细的知识看博客: STM32 CAN通信编程参数设置①主寄存器设置(CAN通信基本配置) ②位时序设置(波特率) ③过滤器设置(发送邮箱过滤器) ④发送邮箱设置(发送方参数) ⑤接收邮箱设置(接收方参数+中断标志参数) CAN_GetITStatus函数用于检查CAN通信接收中断是否发生 其中检验的参数可以是如下几个:
CAN_GetITStatus位将默认为0(RESET),当中断发生时,将变为1(SET)。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:43:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |