背景
接触了一些芯片,发现所有的芯片而言,库和API接口随着芯片,开发环境甚至开发情况,公司都有着明显的区别。基于这种情况的话,了解协议的底层个人觉得是十分必要的,同时也是找工作的必备选项。所以对常见的嵌入式协议做一个个人的总结。
本章节仅仅用于个人的学习和记录。
常见的协议类型
常用的协议(必备):SPI、IIC、USART、FSMC、8086
相比较少一点协议(特定):485、CAN、I2S
协议如何学习?
个人学习了多家的嵌入式视频,觉得有一个方法觉得比较清楚:就是一个协议的话,一定是分为协议层和物理层的,所以物理层就是他的接线方式和电器特性,协议层的话就是他的时序。这个说法不一定准确,应为部分协议无所谓接线方式,都能用。
串口
用处: 1.用作打印功能,调试 2.部分的模块的话适用串口,如有名的ESP8266 等 基本知识(自行了解): 可以看这个 https://blog.csdn.net/weixin_46468790/article/details/107198486 RS-232 标准的COM口(电脑后面的COM口) 电平转换芯片,比较有名的CH340 物理层: 接线比较简单,分为RX和TX,两个IO,其中RX用于接收,TX用于发送数据。 这里提一个小技巧,串口作为作为比较简单的总线,排查很简答:1.接线有问题 2.波特率有问题 3.挂载的总线时钟设置有问题 4.串口调试软件出问题
协议层:
- 波特率(我觉得可以理解为解码方式,双方约定的)
用虚线分开的每一格就是代表一个码元。 - 通讯的起始和停止信号
数据包的起始信号由一个逻辑0 的数据位表示,而数据包的停止信号可由0.5、1、1.5 或2 个逻辑1 的数据位表示 - 有效数据
有效数据的长度常被约定为5、6、7 或8 位长。 - 数据校验
奇校验(odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity),它 奇校验(odd)就是有效数据1的个数+校验位 =奇数 同理 偶校验(even)为有效数据1的个数+校验位 =偶数 0 校验(space)始终为0 01校验(space)始终为1 在无校验的情况下,数据包中不包含校验位。
IIC
用处:作为常见的通信协议,常用于控制传感器和外设 基本知识(自行了解): 硬件IIC 软件IIC 硬件IIC和软件IIC的区别?为什么常使用软件IIC而不是硬件IIC? 两种方式的区别和优势弱点 物理层: 由于我自己一般都是使用的软件IIC,所以是直接的GPIO控制。这里提一个知识点:IIC可以接多个设备码?答案是可以的。 一般的话 我们只需要2根线,SDA作为数据线,SCL作为时钟。 协议层: S代表的起始信号和停止信号,用电平表示 有效数据电平表示 SCL拉高的时候,SDA为有效数据,然后SCL拉低,开始传输。
这个代表的是读写的设备地址+读写模式选择,R/W为1的话是读,为0的话就是写,你要分辨是谁往谁发,比如我和你说话,那我就是向你写,你和我说话,那我就是读,所以你要确定谁往谁发。
同理这里的设备地址的话,由两种情况,7 位或10 位,所以有个知识点:假如我的写地址是0x48,那我的读地址就是0x48,应为就差1. (有些API提供的地址原本就是7位的,读写区分开了)
这个代表协议中的A,这里有两个情况:应答,表示我还需要接收,你继续;另外非应答,就是可以停止发送了。
SPI
用处:作为常见的通信协议,常用于控制传感器和外设 基本知识(自行了解): 软件SPI,相比于软件IIC,来说,用的比较少 物理层: MOSI:主输出从输入 MISO:主输入从输出 SCK:时钟 SS:片选引脚,一般对应芯片的CS引脚,低时有效,选中器件,开始。拉高,终止。 协议层: 通讯的起始和停止信号 NSS拉低作为起始信号,拉高作为停止信号。 数据有效性 在SCK 的下降沿时刻,MOSI 及MISO 的数据有效,高电平时表示数据“1”,为低电平时表示数据“0”。在其它时刻,数据无效,MOSI 及MISO为下一次表示数据做准备。 CPOL/CPHA 及通讯模式
FSMC
用处:控制SRAM,用作内存管理;作为8086时序 物理层: 协议层:
对于FSMC来说,和IIC有一个很大的不同,就是我们不需要实现各个时序的具体逻辑,我们实现具体的物理层接线,Stm32内部会自动实现功能和时序。
8086
物理层: FSMC 的A 地址线根据不同的情况产生对应的电平,那么就完全可以使用FSMC 来产生8080 接口需要的时序了 协议层 该8086时序和FSMC基本保持一致。
485
物理层 相比于串口通信而言,添加了485收发器,这个是明显的物理层区别,同时有如下的变化:抗干扰能力强、传输距离远。 MAX485 芯片中有“RE”和“DE”两个引脚,用于控制485 芯片的收发工作状态的,当RE 引脚为低电平时,485 芯片处于接收状态,当DE 引脚为高电平时芯片处于发送状态。 协议层 和串口协议类似。
CAN
物理层: 只有两根线:CAN_High 和CAN_Low 两条信号线 同时需要一个CAN收发器 寻址机制: 不同于其它类型的总线,CAN总线不设定节点的地址,而是通过消息的标识符(Identifier)来区别消息。这种机制虽然会增加消息的复杂度(增加标识符),但是节点在此情况下可以无需了解其他节点的状况,而相互间独立工作。在总线上增加节点时仅需关注消息类型,而非系统上其他节点的状况。这种以消息标识符寻址的方式,让总线上增加节点变得更加灵活。 CAN总线具有两种接线方式: 协议层:
数据帧以一个显性位(逻辑0)开始,以7 个连续的隐性位(逻辑1)结束,在它们之间, 分别有仲裁段、控制段、数据段、CRC 段和ACK 段。 . 帧起始 SOF 段(Start Of Frame),译为帧起始,帧起始信号只有一个数据位,是一个显性电平, 它用于通知各个节点将有数据传输,其它节点通过帧起始信号的电平跳变沿来进行硬同步。 . 仲裁段 当同时有两个报文被发送时,总线会根据仲裁段的内容决定哪个数据包能被传输,这也是它名称的由来。 仲裁段的内容主要为本数据帧的ID 信息(标识符),数据帧具有标准格式和扩展格式两 种,区别就在于ID 信息的长度,标准格式的ID 为11 位,扩展格式的ID 为29 位,它在标 准ID 的基础上多出18 位。在CAN 协议中,ID 起着重要的作用,它决定着数据帧发送的 优先级,也决定着其它节点是否会接收这个数据帧。CAN 协议不对挂载在它之上的节点分 配优先级和地址,对总线的占有权是由信息的重要性决定的,即对于重要的信息,我们会 给它打包上一个优先级高的ID,使它能够及时地发送出去。也正因为它这样的优先级分配 原则,使得CAN 的扩展性大大加强,在总线上增加或减少节点并不影响其它设备。 报文的优先级,是通过对ID 的仲裁来确定的。根据前面对物理层的分析我们知道如果 总线上同时出现显性电平和隐性电平,总线的状态会被置为显性电平,CAN 正是利用这个 特性进行仲裁。 若两个节点同时竞争CAN 总线的占有权,当它们发送报文时,若首先出现隐性电平, 则会失去对总线的占有权,进入接收状态。见图 44-10,在开始阶段,两个设备发送的电 平一样,所以它们一直继续发送数据。到了图中箭头所指的时序处,节点单元1 发送的为 RTR 位(Remote Transmission Request Bit),译作远程传输请求位,它是用于区分数据帧 和遥控帧的,当它为显性电平时表示数据帧,隐性电平时表示遥控帧。 IDE 位(Identifier Extension Bit),译作标识符扩展位,它是用于区分标准格式与扩展格 式,当它为显性电平时表示标准格式,隐性电平时表示扩展格式。 SRR 位(Substitute Remote Request Bit),只存在于扩展格式,它用于替代标准格式中的 RTR 位。由于扩展帧中的SRR 位为隐性位,RTR 在数据帧为显性位,所以在两个ID 相同的标准格式报文与扩展格式报文中,标准格式的优先级较高。 . 控制段 在控制段中的r1 和r0 为保留位,默认设置为显性位。它最主要的是DLC 段(Data Length Code),译为数据长度码,它由4 个数据位组成,用于表示本报文中的数据段含有多 少个字节,DLC 段表示的数字为0~8。 . 数据段 数据段为数据帧的核心内容,它是节点要发送的原始信息,由0~8 个字节组成,MSB 先行。 . CRC 段 为了保证报文的正确传输,CAN 的报文包含了一段15 位的CRC 校验码,一旦接收节 点算出的CRC 码跟接收到的CRC 码不同,则它会向发送节点反馈出错信息,利用错误帧 请求它重新发送。CRC 部分的计算一般由CAN 控制器硬件完成,出错时的处理则由软件 控制最大重发数。 在CRC 校验码之后,有一个CRC 界定符,它为隐性位,主要作用是把CRC 校验码与 后面的ACK 段间隔起来。 ACK 段 ACK 段包括一个ACK 槽位,和ACK 界定符位。类似I2C 总线,在ACK 槽位中,发 送节点发送的是隐性位,而接收节点则在这一位中发送显性位以示应答。在ACK 槽和帧 结束之间由ACK 界定符间隔开。 帧结束 EOF 段(End Of Frame),译为帧结束,帧结束段由发送节点发送的7 个隐性位表示结束。
I2S
用处:作为常见的通信协议,常用于音频 物理层: I2S有3个主要信号: I2S 总线接口有3 个主要信号,但只能实现数据半双工传输,后来为实现全双工传输有 些设备增加了扩展数据引脚。STM32f4xx 系列控制器支持扩展的I2S 总线接口。 (1) SD(Serial Data):串行数据线,用于发送或接收两个时分复用的数据通道上的数据(仅 半双工模式),如果是全双工模式,该信号仅用于发送数据。 (2) WS(Word Select):字段选择线,也称帧时钟(LRC)线,表明当前传输数据的声道,不 同标准有不同的定义。WS 线的频率等于采样频率(FS)。 (3) CK(Serial Clock):串行时钟线,也称位时钟(BCLK),数字音频的每一位数据都对应有 一个CK 脉冲,它的频率为:2采样频率量化位数,2 代表左右两个通道数据。 (4) ext_SD(extend Serial Data):扩展串行数据线,用于全双工传输的数据接收。 另外,有时为使系统间更好地同步,还要传输一个主时钟(MCK),STM32F4xx 系列控 制器固定输出为256* FS。 协议层:
|