总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束, 按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。
很多总线都支持不同的协议。
TTL电平:全双工(逻辑1: 2.4V–5V 逻辑0: 0V–0.5V);
RS-232电平:全双工(逻辑1:-15V~-5V ;逻辑0:+3V~+15V);
RS-485:半双工、(逻辑1:+2V~+6V 逻辑0: -6V~-2V)这里的电平指AB 两线间的电压差;
RS-422:全双工、电器特性与 RS-485一致。
除此之外,还有:
CMOS:3~15V
I2C总线
CAN总线
SPI总线
UART总线
I2C总线
I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上,每个从设备需要接一个上拉电阻。
CAN总线
CAN总线有两根信号线,总线网络主要挂在CAN_H和CAN_L,各个节点通过这两条线实现信号的串行差分传输,为了避免信号的反射和干扰,还需要在CAN_H和CAN_L之间接上120欧姆的终端电阻。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线。CAN总线上任意节点可在任意时刻主动地向网络上其它节点发送信息而不分主次,因此可在各节点之间实现自由通信。
SPI总线是全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,分别是:是MISO(主设备数据输入)、MOSI(主设备数据输出)、SCLK(时钟,由主设备产生)、CS(片选,由主设备控制)。其传输速度可达几Mb/s。
SPI的四根线分别为
①SDI(MISO) :主器件数据输入,从器件数据输出
②SDO(MOSI) :主器件数据输出,从器件数据输入
③SCLK:时钟信号,由主器件产生。
④CS:从器件使能信号,由主器件控制选择实能哪个器件
SPI接口主要应用在 EEPROM,FLASH,RTC,实时时钟,ADC,还有数字信号处理器和数字信号解码器之间。
RS-422 的电气性能与RS-485完全一样。主要的区别在于:RS-422 有4 根信号线:两根发送、两根接收。由于RS-422 的收与发是分开的所以可以同时收和发(全双工),也正因为全双工要求收发要有单独的信道,所以RS-422适用于两个站之间通信,星型网、环网,不可用于总线网;RS-485 只有2 根信号线,所以只能工作在半双工模式,常用于总线网。
UART串行数据总线
RS232、RS485/RS422
I2C总线协议(软硬件结合)
SPI(软硬件结合)
CAN(软硬件结合)
ModBus协议(软件协议)
USB协议
以太网通信
MODBUS协议是一种软件协议,而RS232,RS485是一种电平标准,
关系是在一种电平关系下应用一种MODBUS协议。
MODBUS协议是一种人为约定的协议,他和SPI,IIC,CAN总线协议还是有些不同的,
SPI,IIC,CAN总线这些协议必须是设备在硬件上支持的(但是也是可以通过软件模拟的,
我们常常来用软件来模拟IIC的时序,达到IIC通信的目的),
可以是SPI,IIC,CAN总线是一种软硬件的结合体,也就是常分为两层物理层和协议层,
MODBUS本身就是类似于协议层的东西,
而RS232和RS485就是一种物理层电平的东西。
RS232是一种船型数据通信的标准,优点是传输线少,配线简单,发送距离可以比较远。波特率和距离成反比,高波特率常用于放置很近的仪器之间的通信。
RS232和TTL的区别:其实就是电平上的区别,RS232的电平通常为+12V和-12V,通过MAX232一类的电平转换芯片,就能转换为0-5V的TTL电平,本质上通信协议标准都是一样的。
| 1 | 载波检测 |
| 2 | 接收数据Rxd |
| 3 | 发送数据Txd |
| 4 | 数据终端准备好 |
| 5 | 信号地线 |
| 6 | 数据设备准备好 |
| 7 | 请求发送 |
| 8 | 允许发送 |
| 8 | 振铃提示 |
RS-232 接口标准的缺点:
① 接口的信号电平值较高,易损坏接口电路芯片,又因为232电平与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接;
②传输速率较低;
③传输距离有限,实际使用时也就15M左右;
④接口使用一根发射线和一根接收线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱;
⑤RS-232 只容许一对一的通信,没有考虑构成串行总线。
RS232的电气特性:
1)RS-232串口通信最远距离是50英尺=15m
2)RS232可做到双向传输,全双工通讯,最高传输速率20kbps
3)RS-232C上传送的数字量采用负逻辑,且与地对称
逻辑1:-3 ~-15V
逻辑0:+3~+15V
与单片机连接时需要加入电平转换芯片
通信传输格式:
串行通信中,线路空闲时,线路的TTL电平总是高,经反向RS232的电平总是低。一个数据的开始RS232线路为高电平,结束时Rs232为低电平。数据总是从低位向高位一位一位的传输。
开始通信时,信号线为空闲(逻辑1),当检测到由1到0的跳变时,开始对“接收时钟”计数。 当计到8个时钟时,对输入信号进行检测,若仍为低电平,则确认这是“起始位”,而不是干扰信号。接收端检测到起始位后,隔16个接收时钟,对输入信号检测一次,把对应的值作为D0位数据。再隔16个接收时钟,对输入信号检测一次,直到全部数据接收完成。
(5)检测校验位P(如果有的话)。
(6)接收到规定的数据位个数和校验位后,通信接口电路希望收到停止位S(逻辑1),若此时未收到逻辑1,说明出现了错误,在状态寄存器中置“帧错误”标志。若没有错误,对全部数据位进行奇偶校验,无校验错时,把数据位从移位寄存器中送数据输入寄存器。若校验错,在状态寄存器中置奇偶错标志。
(7)本幀信息全部接收完,把线路上出现的高电平作为空闲位。
(8)当信号再次变为低时,开始进入下一幀的检测。
在工业应用中,RS232因为传输距离的问题,通常使用传输距离更远的RS485或者RS422,RS-485的数据信号采用差分传输方式,抗共模干扰能力增强,即抗噪声干扰性好。
它的电气特性和RS232不一样。用缆线两端的电压差值来表示传递信号,逻辑“1“以两线间的电压差为+(2-6)V表示;逻辑”0“以两线间的电压差为-(2-6)V表示。两端的电压差最小为0.2V以上时有效,任何不大于12V或者不小于-7V的差值都被接收端认为时正确的。另外在RS-485中还有一“使能”端,而在RS-422中这是可用可不用的。
RS-485最大的通信距离约为1219m,最大传输速率为10Mb/S,传输速率与传输距离成反比,在100Kb/S的传输速率下,才可以达到最大的通信距离,如果需传输更长的距离,需要加485中继器。
RS485 的优点:
①RS485 接口是采用平衡驱动器和差分接收器的组合,抗噪声干扰性好;
②RS485 接口的最大传输距离标准值为 1200 米(9600bps 时),实际上可达 3000 米;
③RS-485 接口在总线上是允许连接多个收发器,用户可以利用单一的 RS-485 接口方便地建立起设备网络;
④RS-485 的数据最高传输速率为 ***10Mbps***;
⑤RS485 接口组成的半双工网络,一般只需二根信号线。
RS-485与RS-422的区别:
RS-422 的电气性能与RS-485完全一样。主要的区别在于:RS-422 有4 根信号线:两根发送、两根接收。由于RS-422 的收与发是分开的所以可以同时收和发(全双工),也正因为全双工要求收发要有单独的信道,所以RS-422适用于两个站之间通信,星型网、环网,不可用于总线网;RS-485 只有2 根信号线,所以只能工作在半双工模式,常用于总线网。
具体参考:https://blog.csdn.net/weixin_39622150/article/details/111115543
2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
串行的8位双向数据传输位速率在标准模式下可达100Kbit/s,快速模式下可达400Kbit/s,高速模式下可达3.4Mbit/s。I2C总线的最大长度是:小于200mm~300mm。
总线上扩展的器件数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容。欲驱动多个负载时需用中继器。
①开始:当SCL保持“高”时,SDA由“高”变为“低”为开始条件;
②停止:当SCL保持“高”且SDA由“低”变为“高”时为停止条件。
③数据传输:SDA线上的数据在时钟SCL“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变。
④响应信号:输出到SDA线上的每个字节必须是8位,每次传输的字节不受限制,但每个字节必须要有一个应答ACK。处理器发完8bit数据后就不再驱动总线了(SDA引脚变输入),而SDA和SDL硬件设计时都有上拉电阻,所以这时候SDA变成高电平。那么在第8个数据位,如果外接IIC设备能收到信号的话接着在第9个周期把SDA拉低,那么处理器检测到SDA拉低就能知道外接IIC设备数据已经收到。如果一接收器件在完成其他功能(如一内部中断)前不能接收另一数据的完整字节时,它可以保持时钟线SCL为低,以促使发送器进入等待状态;当接收器准备好接受数据的其它字节并释放时钟SCL后,数据传输继续进行。I2C数据总线传送时序。
处理器想写的话:先发送起始位,再发一个8bit数据:前7bit表示从地址,第8bit表示读或者写。0write是处理器往IIC从设备发,1read是IIC从设备往处理器发。第9个时钟周期回复响应信号。
在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps,
参考:https://blog.csdn.net/qq_38410730/article/details/80312357
如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。
当SPI主设备想读/写[从设备]时,它首先拉低[从设备]对应的SS线(SS是低电平有效),接着开始发送工作脉冲到时钟线上,在相应的脉冲时间上,[主设备]把信号发到MOSI实现“写”,同时可对MISO采样而实现“读”。
SPI接口的缺点:SPI不规定传输速率,没有地址方案;没有指定的流控制,没有应答机制确认是否接收到数据;SPI仅适用于短距离传输。
SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。
CAN的特点是允许网络上的设备直接互相通信,网络上不需要主机控制通信。
CAN总线网络主要挂在CAN_H和CAN_L,各个节点通过这两条线实现信号的串行差分传输,为了避免信号的反射和干扰,还需要在CAN_H和CAN_L之间接上120欧姆的终端电阻。为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线。CAN总线上任意节点可在任意时刻主动地向网络上其它节点发送信息而不分主次,因此可在各节点之间实现自由通信。
CAN优点:
(1)数据通信没有主从之分,任意一个节点可以向任何其他(一个或多个)节点发起数据通信,靠各个节点信息优先级先后顺序来决定通信次序,高优先级节点信息在134μs通信;
(2)多个节点同时发起通信时,优先级低的避让优先级高的,不会对通信线路造成拥塞;
(3)通信距离最远可达10KM(速率低于5Kbps)速率可达到1Mbps(通信距离小于40M);
(4)CAN总线传输介质可以是双绞线,同轴电缆。
CAN总线适用于大数据量短距离通信或者长距离小数据量,实时性要求比较高,多主多从或者各个节点平等的现场中使用。
CAN的数据帧格式参看:https://blog.csdn.net/huan447882949/article/details/80042417
ModBus特点
(1)免费
(2)Modbus可以支持多种电气接口,如RS2321485等(串口),还可以在各种介质上传输,如双绞线、光纤、无线等。
(3) Modbus的帧格式简单,通俗易懂好开发。
(4)可靠性好。Modbust协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP 模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机), Master端可以诊断出来,而当故障修复后,网络又可自动接通。
ModBus通信协议
每个Modbus信息都有相同的结构,每个信息都有四个基本元素组成。
ADU: 应用数据单元
PDU: 协议数据单元
数据传输始终由Modbus网络中的主站启动。Modbus主站发送消息,并根据消息的内容,从站解释消息并回应主站。消息的头部是从站的地址用于定义哪个从设备应响应消息。当所有子站与收到的地址码不匹配,则忽略该消息。
Modbus数据模型是具有四种基本数据类型:
1.包括离散输入;
2.线圈输出;
3.输入寄存器(输入数据);
4.并保存寄存器(输出数据)
详情查询Modbus应用协议规范:https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf
USB协议采用主从工作模式,即只有主机与从机之间才能进行数据通信,也正是这样引发一个缺陷,就是主机与主机、从机与从机之间不能通信。
USB协议采用的是差分传输模式,因而有两条数据线D+和D-,在低速和全速模式下,采用电压传输模式,在高速下,采用电流传输模式。
主机端的D-和D+数据线各自被串联15KR电阻下拉到地,当没有USB设备插入的时候,这两条数据线就一直呈现低电平状态。
设备端的D-或者D+数据线,串联一个1.5KR的电阻上拉到3.3V,一旦设备插入主机,那么当主机捕捉到自身的D-或者D+被拉到高电平时,就知道有USB设备连接进来了,这样就检测到有外来USB设备接入了。
对于从机设备中到底是D-还是D+串联1.5KR电阻,这个就要有传输协议的模式来决定了,当配置成全速或高速时,就由D+串联电阻;当配置成低速时,就是D-串联电阻了。
USB采用的是NRZI编码方式,数据为0的时候电平翻转,数据为1的时候电平不反转。
当出现连续6位为1的时候,自动填充进一个0(位填充),这样做的目的是防止长时间的电平不变化,不利于时钟的提取。而在接收端则完全相反,自动去掉填充的0,还原出原本的数据。
USB协议中有四种传输方式:批量传输、中断传输,同步传输,控制传输。
1)控制传输
控制传输是一种可靠的双向传输,一次控制传输可分为三个阶段。第一阶段为从HOST到Device的SETUP事务传输,这个阶段指定了此次控制传输的请求类型;第二阶段为数据阶段,也有些请求没有数据阶段;第三阶段为状态阶段,通过一次IN/OUT传输表明请求是否成功完成。
控制传输对于最大包长度有固定的要求。对于高速设备该值为64Byte;对于低速设备该值为8;全速设备可以是8或16或32或64。
2)中断传输
中断传输是一种轮询的传输方式,是一种单向的传输,HOST通过固定的间隔对中断端点进行查询,若有数据传输或可以接收数据则返回数据或发送数据,否则返回NAK,表示尚未准备好。
中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支持错误重传。
对于高速/全速/低速端点,最大包长度分别可以达到1024/64/8Bytes。中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1255mS,低速端点为10255mS,高速端点为(2interval-1)*125uS,其中interval取1到16之间的值。
3)批量传输
批量传输是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传输,适合数据量比较大的传输。
低速USB设备不支持批量传输,高速批量端点的最大包长度为512,全速批量端点的最大包长度可以为8、16、32、64。
批量传输在访问USB总线时,相对其他传输类型具有最低的优先级,USBHOST总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。
高速的批量端点必须支持PING操作,向主机报告端点的状态,NYET表示否定应答,没有准备好接收下一个数据包,ACK表示肯定应答,已经准备好接收下一个数据包。
4)同步传输
同步传输是一种实时的、不可靠的传输,不支持错误重发机制。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为1024,低速的为1023。
四种传输方式上传输的都是包,包的种类也多样化,有令牌包、数据包、握手包、特殊包。
1)令牌包
令牌包有四种:OUT输出数据包、IN输出数据包、SETUP建立数据包、SOF帧起始数据包。
①OUT输出:用来通知从机,主机要给你发送一个数据包;
② IN输入:用来通知从机,向主机发送一个数据包;
③SETUP建立:这个令牌包只存在于控制传输的建立过程中,也是用来告诉从机,主机要给你发送一个数据了,接好咯。功能跟OUT输出是一样的,唯一不同的是,SETUP建立数据包只能传输DATD0数据包,而且从机还必须要接收;而OUT输出数据包则没有那么多规则。
④SOF帧起始:这个令牌包是在每帧开始的时候开始发送的,而且由于是广播形式发送,所以所有的全速和高速设备都可以收到;全速设备是1ms产生一帧,高速设备是125us产生一帧;每一帧开始的时候主机开始计数帧号,然后将11位的帧号发送出去。
2)数据包
3)握手包
握手包是一个应答信号,表示一次传输有没有成功。
握手包有四种:ACK,NAK,STALL,NYET;
① ACK:表示本次能正确接收数据,并且本设备有足够的空间来接收数据,这个握手包,主机和从机都可以使用。
②NAK:表示本设备没有数据返回或者本设备没有足够的空间来接收数据,此握手包主机不能用,只能是从机使用; 当主机接收到NAK应答后,这并不是错误,只是设备还没有准备好,主机会在下次找机会重新试着传输。
③ STALL:表示本设备由于某种原因无法执行接收数据这个请求,或者接收端点被挂起了不能接收数据,这个握手包只能是从机使用; 这是一种错误的情况,出现这种情况需要主机来进行干预才能解除这种错误。
④ NYET:表示本次能正确接收数据,并且有空间来接收本次数据,但是没有足够的空间来接收下一次数据,这个握手包只能是从机使用;因此主机在进行下一次数据传输之前,会先发送一个PING令牌包,用来检测设备是否有足够的空间来接收本次的数据,避免浪费表情。
除了STALL这个错误之外,还有其他情况检测到数据传输错误,比如PID包标识校验出错,CRC检验出错,位填充出错等,这些情况下,设备将什么都不返回,主机就这样一直等着,产生超时等待。
4)特殊包
特殊包是在一些特殊场合使的包,这并不是一个类型,是由一些令牌包和握手包组成的。
特殊包一共有四种:PRE,SPLIT,ERR,PING,其中PRE,SPLIT,PING是令牌包,ERR是握手包。
PRE:这是一种通知集线器打开低速端口的一种包,它虽然是令牌包,但是却只有同步域,PID包标识和结束符标志,而且只用在全速模式中。在平时的全速设备中,为了防止其低速状态产生误操作,所以一般全速模式中不会把信号传给低速设备,只有当接收到了PRE令牌包,才会将低速端口给打开。
在全速模式下,假如需要处理低速事务,主机会发送一个PRE包,全速端口接收到此包会直接忽略,但当集线器接收到时,会打开其低速端口,然后主机就以低速模式给低速设备发送一系列令牌包、数据包等。
PING:PING令牌包跟OUT输出令牌包一样,都是通知设备说主机将要发送数据了,但是PING令牌包后面是不接数据包的,只有当收到了设备发回来的ACK或者NAK应答才会开始发数据包,这就是为什么在将握手包的时候,NYET情况下主机会先发一个PING令牌包,确定设备有足够空间了才发送数据包,这就避免了浪费资源。接入直接只用OUT令牌包的话,后面直接跟一个数据包,一旦设备空间不够,数据包将会被丢弃,这就产生了一个现象,就是在下位机跑程序的时候发现程序漫了一下,虽然是一下,实际上是丢弃了一整个数据包。
SPILT:这是高速事务分裂令牌包,可以将只有在高速模式下才能处理的数据包转化为低速或者全速数据包发送给相应的端口。
原文链接:https://blog.csdn.net/weixin_41904238/article/details/98368647
以太网帧中各个字段含义如下:
(1)前同步信号字段。包括七个字节的同步符和一个的起始符。同步字符是由7个0和1交替的字节组成,而起始符是三对交替的0和1加上一对连续的l组成的一个字节。这个字段其实是物理层的内容,其长度并不计算在以太网长度里面。前同步信号用于在网络中通知其他站点的网卡建立位同步,同时告知网络中将有一个数据帧要发送。
(2)目的站点地址。目的站点的MAC地址,用于通知网络中的接收站点。目的占地MAC地址的左数第一位如果是0,表明目标对象是一个单一的站点,如果是1表明接收对象是一组站点,左数第二位为0表示该MAC地址是由IEEE组织统一分配的,为1表明该地址是自行分配的。
(3)源站地址。帧中包含的发送帧的站点的MAC地址,这是一个6字节的全球唯一的二进制序列,并且最左的一位永远是0。
(4)协议类型字段。以太网帧中的16位的协议类型的字段用于标识数据字段中包含的高级网络协议的类型,如TCP、IP、ARP、IPX等。
(5)数据字段。数据字段包含了来自上层协议的数据,是以太帧的有效载荷部分。为了达到最小帧长,数据字段的长度至少应该为46字节,等于最小帧长减去源地址和目的地址帧校验序列以及协议类型字段等的长度。同时以太网规定了数据字段的最大长度为1500字节。
(6)帧校验字段。帧校验字段是一个32位的循环冗余校验码,校验的范围不包括前同步字段。
比较通用的以太网通信协议是TCP/IP协议,TCP/IP通讯协议采用了四层结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。这四层分别为:
(1)应用层:应用程序间沟通的层,如简单电子邮件传输协议(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。
(2)传输层:在此层中,它提供了节点间的数据传送服务,如传输控制协议(TCP)、用户数据包协议(UDP)等,TCP和UDP给数据包加入传输数据并把它传输到下一层中,这一层负责传送数据,并且确定数据已被送达并接收。
(3)网络层:负责提供基本的数据包传送功能,让每一块数据包都能够到达目的主机(但不检查是否被正确接收),如网际协议(IP)。
(4)接口层:对实际的网络媒体的管理,定义如何使用实际网络(如Ethernet、Serial Line等)来传送数据。