嵌入式软件必备知识--通讯协议(UART、I2C、SPI、CAN)

一些基本的概念:

串行通信: 这指的是在通信线路上一次只能传输一个位(或字节)的数据。每个位依次传输,因此通信是按顺序进行的。这可以用于较简单的系统或长距离通信,但可能导致较低的传输速度。
并行通信: 这指的是在通信线路上同时传输多个位(或字节)的数据。并行通信通常可以提高传输速度,但需要更多的物理线路,并且对于较长的距离可能存在一些问题。


同步通信: 这要求通信的发送和接收方在某个时间基准上保持一致。数据传输的时序是协调的,通常需要等待响应或在特定时刻发送数据。这可以确保数据的可靠性,但可能引入一些等待时间。
异步通信: 这表示发送和接收方不需要保持一致的时钟。数据可以根据需要发送,而不必等待对方的即时响应。异步通信通常更加灵活,但可能需要处理潜在的延迟或数据丢失。


单工通信: 在单工通信中,数据只能在一个方向上流动。一方负责发送,另一方负责接收,但二者不能同时进行通信。这类似于单行道,只允许数据在一个方向上移动。
半双工通信: 半双工通信允许数据在两个方向上流动,但不同方向上的数据流不能同时进行。在某一时刻,通信的一方是发送方,另一方是接收方。这类似于对讲机,其中只有一个方向的通信能够发生。
全双工通信: 全双工通信允许数据在两个方向上同时进行。两个通信方均可同时发送和接收数据,实现了双向通信。典型的例子是电话通信,其中通话双方都可以同时说话和听对方说话。

关系:

  • 串行、并行通信可以是同步的或异步的,这取决于数据传输的时序和通信协议。
  • 在某些情况下,串行通信更容易实现同步,而并行通信可能更容易实现异步,但这并不是绝对的规则。
  • 串行、并行通信可能是单工、半双工或全双工的,具体取决于通信协议和硬件实现。
  • 同步通信要求通信方在时间上保持一致,而异步通信允许通信方在时间上不保持一致。
  • 通信中的同步和异步概念与通信方向的单工、半双工和全双工之间并没有直接关联,而是描述了数据的时序关系。


在实际应用中,这些概念可能会相互组合,例如串行半双工通信、并行全双工通信等,以满足特定的通信需求。

CAN与RX485异同
他俩都是串行半双工,且基于差分信号和多设备,但有较大差异:

  1. CAN总线使用唯一标识符(ID)为每条消息指定优先级,具有自动仲裁功能。RS485总线是一种常规的通信总线,它不能够做总线的自动仲裁,也就是不能够同时发送数据以避免总线竞争。
  2. CAN支持复杂的网络拓扑,如星型、树型和总线型结构。RS485主要支持总线型拓扑,所有设备通过两条信号线相连。
  3. CAN内置复杂的错误检测、报告和恢复机制,包括位级错误检测、重传和错误限制等功能。RS485作为一种电气标准,本身不提供错误处理机制。需要通过高层协议来实现错误控制
  4. 数据传输时同步方式不同。

I2C与SPI异同
 
相同点:

  1. 串行、同步
  2. TTL电平,传输距离不长
  3. 主从方式


不同点:

  1. I2C为半双工,SPI全双工
  2. I2C有应答,SPI无应答
  3. 寻址方式:I2C通过向总线广播从机地址寻址,SPI通过使能不同CS引脚寻址
  4. I2C时钟极性和相位固定,SPI有4种模式


因为SPI无应答、快速寻址等优势,所以SPI速率比I2C快很多,几M到几十Mbps。
I2C一般几百kbps,超高速模式下能5Mbps。

一、通讯协议

熟悉至少一种通讯协议及应用方法,UART、SPI、CAN、Modbus、CANopen、 Profibus、 Profinet、 EtherCAT;

熟悉中断机制,I/0控制和常见外设 (UART、SPI、IIC、USB、SD/MMC等) ;

(一) UART通信协议

UART(通用异步收发器),这是用于全双工串行通信的最常见协议。它是设计用于执行异步通信的单个LSI(大规模集成)芯片。该设备将数据从一个系统发送到另一系统。

1. 什么是UART通信协议?

UART是异步,全双工串口总线。它比同步串口复杂很多。有两根线,一根TXD用于发送,一根RXD用于接收。UART的串行数据传输不需要使用时钟信号来同步传输,而是依赖于发送设备和接收设备之间预定义的配置。

UART全称是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),它通常称作UART,是一种异步收发传输器, 是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(RX 和TX)就可以完成通信过程,因此也称为异步串行通信

UART它可以实现全双工传输和接收。我们现在可以大概了解什么是UART协议了,那我们下面就应该来详细了解一下它,在这个之前我们先了解一下通信方式的分类,它们是怎样分类的。

2. 通信方式的分类

通信方式是指通信双方之间的工作方式或信号传输方式。

一、串行通信

串行通信我的理解就是它利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。也就是说串行通信它就是只有一个传输线,上面的数据是一个一个通过这个线来传输的。

根据通讯的数据同步方式,又分为同步和异步两种。可以根据通讯过程中是否有使用到时钟信号进行简单的区分。

(一) 同步通信和异步通信

同步通信:在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。

异步通信:在异步通讯中,不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据。例如规定由起始位、数据位、奇偶校验位、停止位等。某些通讯中还需要双方约定数据的传输速率,以便更好地同步 。波特率(bps)是衡量数据传送速率的指标。

(二) 单工和半双工以及全双工

串行通信又称为点对点通信,对于点对点之间的通信,根据数据的传输方向与时间关系,又可分为单工通信、半双工通信及全双工通信三种方式。单工方式:只允许数据按照一个固定的方向传送,在任何时刻都只能进行一个方向的通信,一个设备固定为发送设备,一个设备固定为接收设备。

半双工方式:两个设备之间可以收发数据,但是不能在同一时刻进行,每次只能有一个设备发送,另一个站接收。

全双工方式:在同一时刻,两个设备之间可以同时进行发送和接收数据。

打个比方,单工的这种模式就是,假如说有两个人,其中一个人A 和另一个人B要进行通信,A只能打电话找B,B只能接电话。而B他假如有事的话也只能等着A给他打电话,他不能打打电话给A;也就是说A只能发送数据,B只能接收数据。半双工就是说A他既可以打电话也可以接电话,B也是既可以打电话也可以接电话,但是呢;这两个过程不能同时进行,就是A打电话给B,B接A的电话,这个时间,B是不可以给A打电话的,必须得等到这个过程结束才可以。全双工模式那我们就很好理解了,就是A在打电话的同时还能接B的电话,B在接A电话时还能给A打电话,也就是说它们可以同时进行了;全双工和半双工的区别就是可不可以同时发送和接收数据。

二、并行通信

并行通信:利用多条传输线将一个数据的各位同时传送。

3. UART协议具体介绍

一、UART数据传输的格式

数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10×120=1200字符/秒=1200波特。

其中各位的意义如下:

起始位:先发出一个逻辑”0”信号,表示传输字符的开始;

数据位:可以是5~8位逻辑”0”或”1”;如ASCII码(7位),扩展BCD码(8位);小端传输,即LSB先发,MSB后发;

校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验);

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平(用于双方同步,停止位时间间隔越长,容错能力越强);

空闲位:处于逻辑“1”状态,表示当前线路上没有数据传送;

注意:异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)。

起始位:UART数据传输线在空闲状态时时保持高电平。当主机先发出一个逻辑”0”的信号时,表示传输数据的开始。

数据位:可以选择的值有5,6,7,8这四个值,可以传输这么多个值为0或者1的bit位。这个参数最好为8,因为如果此值为其他的值时当你传输的是ASCII值时一般解析肯定会出问题。理由很简单,一个ASCII字符值为8位,如果一帧的数据位为7,那么还有一位就是不确定的值,这样就会出错。

校验位:在串口通信中一种简单的检错方式。有下面四种检错方式:偶校验、奇校验、高校验和低校验。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用1bit确保传输的数据有偶个或者奇个逻辑高位。奇偶校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位其实是调整个数,串口校验分几种方式:

停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备之间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟的机会。停止位个数越多,数据传输越稳定,但是数据传输速度也越慢。

数据传输速率数据的传输速率用波特率表示,即每秒钟传输的的二进制位数。每秒传输的字符数乘以位数即为波特率。只要传输的信号是二进制的,波特率与比特率的概念就是相同的。

二、波特率和比特率的区别

1.1 波特率:波特率(Baud Rate)指的是每秒传送的信号变化次数。它表示了一个数字信号传输中的速度,通常以波特(baud)为单位来衡量。波特率决定了信息传输的速度和可靠性。

1.2 比特率:比特率(Bit Rate)指的是每秒传送的比特数。比特率是指数据信号的速度,也称为位速或传输速率。比特率通常以比特每秒(bps)为单位来衡量。比特率决定了信号传输的容量和速率。1、波特率就是每秒传输多少符号2、比特率就是每秒传输多少比特。二进制一个符号所含信息量为1比特,因此二进制下波特率=比特率。 计算机处理的都是二进制数,在这个环境下波特率和比特率都一样。

波特率和比特率的主要区别在于它们衡量的对象不同。波特率是衡量数字信号的变化速度,而比特率是衡量数据信号的传输速率。波特率关注的是信号变化的次数,比特率关注的是数据传输的速率。另外,波特率通常用于模拟通信中,而比特率通常用于数字通信中。

波特率和比特率是通信领域中重要的概念。波特率指的是每秒传送的信号变化次数,而比特率指的是每秒传送的比特数。尽管在理想情况下两者相等,但实际应用中,波特率可以大于比特率。了解波特率和比特率的定义、关系和区别,有助于我们更好地理解数字和模拟通信中的数据传输速度和效率。

三、UART电平标准

UART使用标准的TTL/CMOS逻辑电平(0-5v,0-3.3v,0-2.5v或0-1.8v)来表示数据,1表示高电平,0表示低电平。为了提高抗干扰能力、提高传输的距离,通常也会TTL/CMOS逻辑电平转换为RS-232逻辑电平,3-15表示0,-3~-15V表示1。

举个例子,对于传输数据0x55,即二进制的01010101,RS232和TTL的区别如下:

四、UART工作原理

发送数据过程:空闲状态,线路处于高电平;当收到发送指令后,拉低线路的一个数据位的时间T,接着数据按低位到高位依次发送,数据发送完毕后,接着发送奇偶校验位和停止位,一帧数据发送完成。

数据接收过程:空闲状态,线路处于高电平;当检测到线路的下降沿(高电平变为低电平)时说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后,接着接收并比较奇偶校验位是否正确,如果正确则通知后续设备接收数据或存入缓冲。

由于UART是异步传输,没有传输同步时钟,为了保证数据的正确性,UART采用16倍数据波特率的时钟进行采样。每个数据有16个时钟采样,取中间的采样值,以保证采样不会滑码或误吗。一般UART一帧的数据位数为8,这样即使每个数据有一个时钟的误差,接收端也能正确地采样到数据。

UART的接收数据时序为:当检测到数据的下降沿时,表明线路上有数据进行传输,这是计数器CNT开始计数,当计数器为24=16+8时,采样的值为第0位数据;当计数器的值为40时,采样的值为第一位数据,依次类推,进行后面6个数据的采样。如果需要进行奇偶校验,则当计数器的值为152时,采样的值即为奇偶位;当计数器的值为168时,采样的值为“1”表示停止位,数据接收完成。

一个标准的10位异步串行通信协议(1个起始位、1个停止位和8个数据位)收发时序,如下图所示:

4. UART的优缺点

优点:1、通信只需要两条数据线。2、无需时钟信号。3、有奇偶校验位,方便通信的差错检查。4、只需要接收端和发送端设置好数据包结构,即可稳定通信。缺点:1、传输速率较低。2、接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。3、传输距离有限,数据帧最大支持9位数据。

UART(通用异步收发器)是一种常见的设备间通信协议,它的工作原理是将传输数据的每个二进制位一位接一位地传输。然而,UART的效率可能会相对较低,主要原因如下:

  1. 串行传输:UART使用串行通信,即数据通过单条线路或导线逐位传输。这意味着数据必须一个接一个地发送,而不是像并行通信那样同时发送。这可能会降低数据传输的速度。
  2. 起始位和停止位:UART协议规定,每个字符的开始和结束都需要一个起始位和一个或多个停止位。这些额外的位会占用传输时间,从而降低了有效数据的传输速率。
  3. 奇偶校验:为了检测数据传输过程中可能出现的错误,UART通常会使用奇偶校验。这需要额外的校验位,进一步减少了有效数据的传输速率。
  4. 异步通信:UART是异步通信协议,这意味着发送器和接收器之间没有共享的时钟信号来同步数据。因此,两个设备必须事先约定好相同的波特率(即每秒钟传送的二进制位数)。如果两台设备的波特率有所不同,可能会导致接收错误。
  5. 长距离通信:在长距离通信中,电磁干扰和线路阻抗可能会导致数据错误,从而需要重发数据包,这也会降低UART的效率。

尽管UART在某些方面效率较低,但其优点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信。此外,由于其设计简单和易于实现,UART在嵌入式系统中仍然广泛使用。

UART的问题

1. 电气接口不统一

UART只是对信号的时序进行了定义,而未定义接口的电气特性;UART通信时一般直接使用处理器使用的电平,即TTL电平,但不同的处理器使用的电平存在差异, 高电平和低电平的具体定义不一样,所以不同的处理器使用UART通信时一般不能直接相连。

2. 抗干扰能力差,通信距离短

TTL信号表示0和1,数据传输的时候很容易出错,最多1、2m。
只能用于一个电路板上两个不同芯片之间的通信。

RS232


用于串行通讯的标准。
依赖UART串口协议,在电气层面做处理,统一了标准,能传得更远和更快。编程的话没有任何区别,就是串口通信。

采用一个标准的连接器:


且对9个引脚的作用和电平都做了规定。主要是用RX、TX和GND这三个引脚。
高电平:-3到-15v
低电平:+3到+15v
抗干扰能力增加,通信距离大致15m。
MCU通过TTL发出来的信号要接一个电平转换芯片去转成RS232的信号,比如MAX232芯片。类似usb-ttl芯片(ch340,cp2302)。

 
RS232的问题:

接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容,所以需要使用电平转换芯片才能与TTL电路连接。
通信速度较低,易产生共模干扰,抗噪声干扰性较弱,传输距离较短(15m)
 

RS485


与RS232类似,也是个基于串口的标准,但是是半双工。
与RS232相比最大特点:远距离(1500m),抗干扰强,速度更快(几百kbps到10 Mbps),允许接收多个收发器(可以组建设备网络)

使用差分信号进行数据传输,有效减少共模干扰,因为外部电磁干扰会同时影响到这两条线,而差分信号的接收方只关心两条线之间的电压差,从而有效抵消了干扰。(通信用双绞线,抗干扰强)
高电平(逻辑1):两线之间电压差为+2v到+6v
低电平(逻辑0):两线之间电压差为-2v到-6v

采用两线制,因为用的差分信号,所以两根线表示一个信号,只能半双工。是不是感觉和I2C很像?只是I2C规定好了主机怎么管理从机,在编程RS485时完全可以仿照I2C的主从逻辑,避免冲突。

一般也还是要在MCU后接一个TTL转485的芯片(单端传差分),比如MAX485

 

(二) I2C 通信协议

【总线】I2C 通信协议

1. 什么是I2C

IIC(Inter-Integrated Circuit)也称I2C,中文叫集成电路总线。是一个多主从串行总线,由飞利浦公司发明的通讯总线,属于半双工同步传输类总线,仅由两条线就能完成多机通讯,一条SCL时钟线,另外一条双向数据线SDA,IIC总线要求每个设备SCL/SDA线都是漏极开路模式,因此必须带上拉电阻才能正常工作。I2C协议占用引脚少,硬件实现简单,可扩展性强,I2C数据传输速率有标准模式(100kbps)、快速模式(400kbps)和高速模式(3.4Mbps)。

IIC使用两根信号线进行通信:一根时钟线SCL,一根数据线SDA。IIC将SCL处于高时SDA拉低的动作作为开始信号,SCL处于高时SDA拉高的动作作为结束信号传输数据时,SDA在SCL低电平时改变数据,在SCL高电平时保持数据,每个SCL脉冲的高电平传递1位数据。

一、I2C的特点和优势

总线上可以连接多个IIC通讯设备,支持多个通信主机及多个通信从机。

双线制:I2C使用两根信号线进行通信,包括时钟线(SCL)和数据线(SDA)

多从机:多个从机设备可以连接到同一条I2C总线上,每个从机都有唯一的地址。

每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。

多主机:多个主机设备可以通过I2C总线进行并行通信,通过仲裁机制实现多主机冲突的解决。

简单和灵活的连接:I2C协议使用统一的总线结构,可以方便地连接各种设备,减少硬件复杂性。

三种传输模式:标准模式为100kbit/s ,快速模式为400kbit/s ,高速模式下可达3.4Mbit/s,但目前大多I2C 设备尚不支持高速模式

总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。

二、缺点

  • 数据传输速率比 SPI 慢
  • 数据帧的大小限制为8位
  • 需要实现比SPI更复杂的硬件

三、总线结构

I2C总线由两根信号线组成:

  • 时钟线(SCL):由主机设备控制,用于同步数据传输的时钟信号。
  • 数据线(SDA):用于在主机和从机之间传输数据

四、时钟信号和数据信号

I2C通信是基于时钟信号和数据信号的同步传输。数据的传输和接收都在时钟信号的边沿进行。

在数据传输过程中,主机设备产生时钟脉冲,时钟信号决定了数据传输的速率。数据线上的数据信号(SDA)在时钟信号的上升沿和下降沿进行传输。

五、主机和从机角色

在I2C通信中,有两种主要角色:

  • 主机(Master):负责控制总线和启动通信的设备。
  • 从机(Slave):响应主机的命令和传输数据的设备。

主机设备是总线的控制者,它发起通信并控制时钟信号。从机设备接收主机的命令,并在合适的时机发送数据给主机。

六、I2C通信过程

I2C通信包括起始条件、地址传输、数据传输和停止条件等步骤。

在I2C 器件开始通信(传输数据)之前,串行时钟线 SCL 和串行数据线SDA 线由于上拉的原因处于高电平状态,此时I2C总线处于空闲状态

  • 主机发送起始信号启用总线,开始通信
  • 主机发送一个字节数据指明从机地址与后续字节的传送方向
  • 对应的从机应答
  • 发送器发送一个字节的数据
  • 接收器应答

七、地址传输和应答

在起始条件之后,主机发送从机的地址和读写位。地址包括7位或10位,取决于设备的寻址模式。最高位是读/写位,用于指示主机的读写操作。

主机发送地址后,从机设备通过SDA线发送应答信号。应答信号是一个低电平,表示从机接收到地址并准备好进行数据传输。

八、数据传输和应答

在地址传输和应答之后,主机和从机之间进行数据传输。

  • 主机向从机写入数据:主机发送数据字节到SDA线,然后等待从机发送应答信号。
  • 主机从从机读取数据:主机接收从机发送的数据字节,并发送应答信号。

每个数据字节的传输后都需要接收方发送应答信号。应答信号是一个低电平,表示接收方已成功接收数据。

我们在起始信号之后,主机开始发送传输的数据;在串行时钟线 SCL 为低电平状态时,SDA 允许改变传输的数据位(1 为高电平,0 为低电平),在SCL 为高电平状态时,SDA 要求保持稳定,相当于一个时钟周期传输 1bit 数据,经过8 个时钟周期后,传输了 8bit 数据,即一个字节。第8 个时钟周期末,主机释放SDA 以使从机应答,在第 9 个时钟周期,从机将 SDA 拉低以应答;如果第 9 个时钟周期,SCL 为高电平时,SDA 未被检测到为低电,视为非应答,表明此次数据传输失败。第 9 个时钟周期末,从机释放 SDA 以使主机继续传输数据,如果主机发送停止信号,此次传输结束。我们要注意的是数据以8bit 即一个字节为单位串行发出,其最先发送的是字节的最高位。

2. I2C协议详解

使用I2C,数据在消息中传输。 消息被分解为数据帧。每条消息都有一个地址帧,其中包含从机的二进制地址,以及一个或多个包含正在传输的数据的数据帧。该消息还包括每个数据帧之间的开始和停止条件、读/写位和 ACK/NACK 位:

启动条件:SCL线路从高电平切换到低电平之前,SDA线路从高电平切换到低电平。

停止条件:SCL线路从低电平切换到高电平后,SDA线路从低电平切换到高电平。

地址帧:每个从机唯一的 7 位或 10 位序列,当主机想要与其通信时,该序列标识从机。

读/写位: 指定主机是向从机(低电平)发送数据还是从中请求数据(高电平)的单个位。

ACK/NACK 位:消息中的每个帧后跟一个确认/不确认位。如果成功接收地址帧或数据帧,则从接收方向发送方返回 ACK 位。

一、帧结构

I2C协议中的数据传输是按字节为单位进行的。每个字节由8个位组成,包括7位数据和1位应答位

  • 主机发送字节时,从高位到低位逐位传输数据。
  • 从机接收字节时,从高位到低位接收数据。

二、传输速率和时钟频率

I2C协议支持不同的传输速率,通常称为时钟频率。常见的时钟频率有100 kHz、400 kHz和1 MHz等。

时钟频率由主机设备控制,它决定了数据传输的速率。时钟频率越高,数据传输速度越快,但也会增加总线负载和干扰的风险。

三、寻址

I2C没有像SPI那样的从属选择线,因此它需要另一种方式让从机知道数据正在发送给它,而不是另一个从机站。它通过寻址来做到这一点。地址帧始终是新消息中起始位之后的第一个帧。

主机将它想要与之通信的从机的地址发送给连接到它的每个从机。然后,每个从机将从主机发送的地址与其自己的地址进行比较。如果地址匹配,则将低电平ACK位发送回主机。如果地址不匹配,则从机不执行任何操作,并且 SDA 线路保持高电平。

四、7位地址和10位地址模式

I2C协议中使用7位或10位地址来寻址从机设备。

  • 7位地址模式:主机和从机使用7位地址来寻址,可以支持最多128个从机设备。
  • 10位地址模式:主机和从机使用10位地址来寻址,可以支持最多1024个从机设备。

五、读操作和写操作

地址帧在末尾包含一个位,通知从机是要向其写入数据还是从中读出数据。如果主机要向从机写数据,读/写位为低电平。如果主站从从站读数据,则该位为高电平。

主机设备可以向从机设备发送写操作或读操作。

  • 写操作:主机向从机发送数据。
  • 读操作:主机从从机读取数据。

在地址传输中,读/写位指示主机的读写操作。

3. IIC协议番外篇

IIC总线的SDA和SCL两根总线需要上拉,使总线处于空闲状态。IIC总线一共有两种状态、四种信号。除此之外还需要了解IIC总线的数据有效性。

一、IIC总线物理接线

SDA 和SCL 都是双向线路,都通过一个电流源或上拉电阻连接到正的电源电压。当总线空闲时,这两条线路都是高电平。连接到总线的器件输出级必须是漏极开路或集电极开路才能执行线与的功能。

总线器件数目:由于每一个IIC器件在IIC总线上都有一个确切的7位地址码,这也意味着一条IIC总线上最多可链接127(0X00位地址不使用)个地址互不相同的IIC器件。但在单条IIC总线上链接不多与127个器件的同时,必须要满足总线电容不能超过400pF(协议规定),总线之所以规定电容大小是因为,IIC的OD要求外部有电阻上拉,电阻和总线电容产生了一个RC延时效应,电容越大信号的边沿就越缓,有可能带来信号质量风险。传输速度越快,信号的窗口就越小,上升沿下降沿时间要求更短更陡峭,所以RC乘积必须更小。实际设计中经验值大概是8个器件左右。

二、IIC协议时序

IIC时序图:

(一) 数据有效性

IIC总线进行数据传送时,在SCL的每个时钟脉冲期间传输一个数据位,时钟信号SCL为高电平期间,数据线SDA上的数据必须保持稳定,只有在时钟线SCL上的信号为低电平期间,数据线SDA上的高电平或低电平状态才允许变化,因为当SCL是高电平时,数据线SDA的变化被规定为控制命令(START或STOP,也就是起始信号和停止信号)。

(二) 空闲状态(IDLE)

IDLE表示总线空闲状态。此状态下时钟信号SCL和数据信号SDL均为高电 平,此时无I2C设备工作。时钟线(SCL)和数据线(SDA)接上拉电阻,默认高电平,就是为了表示总线是空闲状态。

(三) 起始信号(START)

表示起始状态。在空闲状态下,时钟信号SCL继续保持高电平,数据信号SDL出现由高电平转换为低电平的下降沿,此时产生一个起始信号,与总线相连的I2C设备检测到起始信号之后,进入起始状态等待控制字节的输入。

(四) 停止信号(STOP)

I2C通信的停止信号由主设备发出,SCL保持高电平,SDA由低电平跳变到高电平。

(五) 应答(ACK)与非应答(NACK)

应答信号接收端收到有效数据后需要向对方响应的信号,发送端每发送一个字节(8位)数据,在第9个时钟周期释放数据线去接收对方的应答。在第9个时钟周期:当SDA是低电平为有效应答(ACK),表示对方接收成功;当SDA是高电平为无效应答(NACK),表示对方没有接收成功。注意:数据发射端需要在第9个时钟周期等待接收端的应答信号。

(六) 数据读写操作

IIC协议的读写操作都是一字节大小,从高到低收发数据。

4. IIC主设备与从设备的通信过程

一、主设备给从设备发送/写入数据:

  1. 主设备发送起始(START)信号
  2. 主设备发送设备地址到从设备
  3. 等待从设备响应(ACK)
  4. 主设备发送数据到从设备,一般发送的每个字节数据后会跟着等待接收来自从设备的响应(ACK)
  5. 数据发送完毕,主设备发送停止(STOP)信号终止传输

二、主设备从从设备接收/读取数据

  1. 设备发送起始(START)信号
  2. 主设备发送设备地址到从设备
  3. 等待从设备响应(ACK)
  4. 主设备接收来自从设备的数据,一般接收的每个字节数据后会跟着向从设备发送一个响应(ACK)
  5. 一般接收到最后一个数据后会发送一个无效响应(NACK),然后主设备发送停止(STOP)信号终止传输

注意:在使用IIC通讯的时候注意按照芯片通讯规则编写。

5. I2C的应用领域

I2C通信协议在各种应用领域都得到了广泛的应用,包括但不限于以下方面:

一、传感器接口

I2C通信协议常用于与各种传感器进行接口通信,例如温度传感器、湿度传感器、光传感器等。通过I2C总线,主机设备可以读取传感器的数据,并进行相应的控制和处理。

二、存储器接口

许多存储器设备(如EEPROM、Flash存储器)也采用了I2C通信协议作为数据传输的接口。主机设备可以通过I2C总线与存储器设备进行数据的读写操作。

三、显示设备接口

I2C通信协议也广泛用于与显示设备进行接口通信,如LCD显示屏、OLED显示屏等。通过I2C总线,主机设备可以向显示设备发送指令和图像数据,实现图形显示的功能。

四、扩展IO接口

除了传感器、存储器和显示设备接口外,I2C通信协议还被用作扩展IO接口的一种方案。通过连接扩展IO芯片,主机设备可以扩展更多的输入输出端口,实现与外部设备的连接和控制。

通过使用I2C协议,各种外设可以通过简单的两根线进行连接,减少了硬件复杂性和引脚数量,提供了更灵活和简洁的系统设计方案。

6. 常见的I2C设备和应用

I2C通信协议广泛应用于各种设备和领域。以下是一些常见的I2C设备和应用示例:

  • EEPROM和存储器芯片:用于数据存储和读写操作。
  • 温度传感器和湿度传感器:用于测量环境温度和湿度。
  • LCD显示屏和OLED显示屏:用于文本和图形显示。
  • 扩展IO和控制芯片:用于扩展输入输出端口和外设控制。

这些只是一些常见的应用示例,实际上,I2C通信协议可以用于更多不同类型的设备和应用,根据具体需求选择合适的I2C设备。

7. 总结

I2C(IIC)是一种常用的 ,用于在电子设备之间进行数据交换。它采用双线制、支持多主机和多从机的通信,并且具有简单灵活的连接特性。I2C通信包括起始条件、地址传输、数据传输和停止条件等步骤,通过时钟信号和数据信号进行同步传输。多主机通信通过仲裁机制解决主机冲突,并实现并行数据传输。I2C通信在各种领域都得到了广泛的应用,包括传感器接口、存储器接口、显示设备接口和扩展IO接口等。在设计和使用I2C通信时,需要考虑电源和电平要求、总线负载和电流限制、I2C设备的选择和配置、抗干扰和线长限制等因素。

(三)SPI


Serial Peripheral Interface(SPI),串行外设接口
高速、全双工、同步
一个主机,若干个从机

至少4根线:
MISO(master in server out)
MOSI(master out server in)
SCLK(时钟)
CS (片选,通过使能它来选中不同的从机,有n个从机,主机就需要n条CS线)

SPI具体通信过程
先发高位 (MSB:most significant bit,LSB:least significant bit)


SPI传完一个字节后,不需要应答!可以直接发下一个字节。
没有起始信号,也没有终止信号!

CLK下降沿发数据,上升沿收数据
或者
CLK上升沿发数据,下降沿收数据
(由极性和相位一起决定)

SPI极性和相位
SPI总线有四种不同的工作模式,取决于极性(CPOL) 和 相位(CPHL) 这两个因素。为了满足不同场合,不同芯片的需求。

CPOL表示SCLK空闲时的状态
CPOL=0,空闲时SCLK为低电平
CPOL=1,空闲时SCLK为高电平

CPHA表示采样时刻
CPHA=0,每个周期的第一个时钟沿采样
CPHA=1,每个周期的第二个时钟沿采样

I2C与SPI异同
 
相同点:

  1. 串行、同步
  2. TTL电平,传输距离不长
  3. 主从方式


不同点:

  1. I2C为半双工,SPI全双工
  2. I2C有应答,SPI无应答
  3. 寻址方式:I2C通过向总线广播从机地址寻址,SPI通过使能不同CS引脚寻址
  4. I2C时钟极性和相位固定,SPI有4种模式


因为SPI无应答、快速寻址等优势,所以SPI速率比I2C快很多,几M到几十Mbps。
I2C一般几百kbps,超高速模式下能5Mbps。

(四) CAN总线协议

CAN总线通信系统是串行通信的一种,要优于RS485总线,是目前比较常用的一种工业总线,如汽车的电气部分就采用CAN总线实现通信。

与I2C、SPI等具有时钟信号的同步通讯方式不同,CAN通讯并不是以时钟信号来进行同步的,它是一种异步半双工通讯。(同步即在同一个时钟驱动下数据通信,半双工即接受与发送不能同时进行)


CAN(Controller Area Network,控制器局域网)总线协议是一种高度可靠的、多主机的消息广播系统,广泛用于汽车和工业自动化领域进行设备之间的通信。

汽车中最小的控制模块叫ECU,

CAN总线大大促进了ECU之间的高效通讯

CAN像RS485一样采用差分信号通信,双线制(CAN_High,CAN_Low)物理上用双绞线,抗干扰强

 
MCU与外界需要一个TTL转CAN信号的芯片(单端转差分)

CAN总线数据帧

有11位识别码,区分多达2048个设备;
RTR为了区分数据帧或远程请求帧;
控制码有6位,第一位区分标准帧和拓展帧(识别位有29位),第二位是空闲位,接下来4为是DLC,控制数据码的长度,0001表示数据有8位,1000表示数据有64位;
CRC是循环冗余校验码,检测到错误时会自动重传;
CRC界定符为了把后面信息隔开;
后面2位分别是ACK(接收1则发送0)和ACK界定符;
最后7位是结束位;

优先级控制: CAN协议通过识别码实现优先级控制。ID较低的消息具有较高的优先级,能够在网络忙时优先传输。

CAN总线的数据传输速率可根据网络长度和节点数进行调整,一般情况下,速率可以从几kbps到1Mbps不等

位定时
数据在CAN总线上的传输和采样过程涉及到位定时(Bit Timing),这是确保数据准确同步和传输的关键因素。
位定时包括若干部分,如同步段、传播时间段、相位缓冲段1和相位缓冲段2,其中采样点(Sample Point)是位时间内的一个特定点,用于决定何时对传输的位进行采样。

在CAN协议中,数据位的采样通常发生在位时间的某个固定点上,这个点被配置为尽可能靠近位时间结束前,以允许信号在总线上传播并稳定。这意味着数据的采样不直接依赖于时钟信号的上升沿或下降沿,而是依赖于位时间内预先配置的采样点。


由于CAN总线使用非归零(Non-Return to Zero, NRZ)编码,连续的位之间没有自动的同步点(例如,没有时钟信号的显式传输),因此,CAN总线协议通过硬件和位定时配置来确保所有节点在位时间内正确地同步和采样数据。

详细位定时知识建议参考这篇博客 《CAN通信位定时与同步》

CAN与RX485异同
他俩都是串行半双工,且基于差分信号和多设备,但有较大差异:

CAN总线使用唯一标识符(ID)为每条消息指定优先级,具有自动仲裁功能。RS485总线是一种常规的通信总线,它不能够做总线的自动仲裁,也就是不能够同时发送数据以避免总线竞争。
CAN支持复杂的网络拓扑,如星型、树型和总线型结构。RS485主要支持总线型拓扑,所有设备通过两条信号线相连。
CAN内置复杂的错误检测、报告和恢复机制,包括位级错误检测、重传和错误限制等功能。RS485作为一种电气标准,本身不提供错误处理机制。需要通过高层协议来实现错误控制
数据传输时同步方式不同。
 

(五)协议对比介绍

① UART


UART(Universal Asynchronous Receiver/Transmitter)是一种串行通信协议,用于在计算机系统、嵌入式系统和外部设备之间传输数据。UART是一种异步通信协议,意味着数据传输不需要在发送和接收端保持精确的时钟同步。以下是UART协议的主要特点和工作原理:

异步通信:
UART使用异步通信,因此发送端和接收端不需要共享相同的时钟信号。相反,每个字节的开始和结束由特殊的起始位和停止位标志,这样接收端可以确定何时开始和结束每个字节的传输。
帧格式:
一个UART帧通常包括起始位、数据位、可选的校验位和停止位。典型的帧格式是8个数据位,一个起始位,一个或多个停止位。校验位用于增强数据的可靠性,但不是必需的。
波特率:
波特率是UART通信中非常重要的参数,表示每秒传输的比特数。通信双方必须使用相同的波特率设置,以确保正确的数据传输。常见的波特率包括9600、19200、115200等。
数据传输过程:
发送端将数据装入一个帧,包括起始位、数据位、校验位和停止位。这个帧按照设置的波特率被发送给接收端。
接收端根据波特率解析帧,找到起始位,并开始接收数据。根据帧格式,接收端提取数据位,并进行校验,最后检测停止位。
流控制:
UART通常采用硬件流控制(RTS/CTS)或软件流控制(XON/XOFF)来管理数据流。流控制可用于防止数据溢出,确保接收端准备好接收数据。
用途:
UART常用于短距离通信,例如连接微控制器、传感器、模块和外围设备。由于其简单性和可靠性,UART是许多嵌入式系统中常见的通信接口。


总体而言,UART是一种灵活、简单和广泛应用的串行通信协议,适用于许多不同类型的嵌入式和计算机系统。

② SPI


SPI(Serial Peripheral Interface)是一种同步的串行通信协议,通常用于在嵌入式系统中连接微控制器、传感器、存储器、显示器和其他外设。SPI协议具有高速传输、全双工通信和简单硬件接口等特点。以下是SPI的主要特征和工作原理:

总线架构:
SPI使用主从架构,其中一个设备充当主设备,其他设备充当从设备。主设备控制通信的时序和传输。通常,一个SPI总线可以连接多个从设备。
通信线:
SPI使用四根主要的通信线:
SCLK(Serial Clock): 主设备生成的时钟信号,用于同步数据传输。
MOSI(Master Out Slave In): 主设备向从设备发送数据的输出线。
MISO(Master In Slave Out): 从设备向主设备发送数据的输入线。
SS/CS(Slave Select/Chip Select): 用于选择要进行通信的从设备。
时序:
SPI是同步通信协议,数据的传输受到时钟信号的控制。传输时序通常由极性(CPOL)和相位(CPHA)两个参数定义,决定了数据采样的时机和极性。SPI通常支持多种模式,例如0、1、2、3四种模式。
全双工通信:
SPI支持全双工通信,允许主设备和从设备同时进行数据的发送和接收。这使得SPI在高速数据传输场景中非常有用。
帧格式:
SPI没有像UART那样的帧格式,数据是按字节传输的,没有起始位或停止位。通常,一个字节的数据在传输时同时包含了发送和接收的信息。
应用:
SPI广泛应用于各种嵌入式系统,如传感器接口、存储器扩展、显示器驱动、通信模块等。由于其高速、简单、全双工的特性,SPI在需要大量数据传输的场景中很受欢迎。


总的来说,SPI是一种灵活且高效的串行通信协议,适用于需要快速、可靠数据传输的嵌入式系统。

③ I2C


I2C(Inter-Integrated Circuit)是一种串行通信协议,通常用于连接微控制器、传感器、存储器和其他外设。I2C是一种同步的、半双工的通信协议,允许多个设备在同一总线上进行通信。以下是I2C的主要特点和工作原理:

总线架构:
I2C采用总线架构,其中多个设备可以连接到同一总线上。每个设备都有一个唯一的地址,用于在总线上识别和选择特定的设备。
通信线:
I2C通信使用两根主要的线路:
SDA(Serial Data Line): 用于传输数据的双向线路。
SCL(Serial Clock Line): 用于同步数据传输的时钟线路。
协议特点:
I2C是半双工通信协议,设备可以在同一总线上进行发送和接收操作。通信始于主设备生成的起始条件,结束于主设备生成的停止条件。
I2C支持多主机通信,允许多个主设备轮流控制总线。这使得多个微控制器可以协同工作。
地址帧:
I2C通信的开始包括一个起始条件,然后是设备地址和读/写位。每个设备都有一个唯一的7位或10位地址。接收设备在地址帧后发送应答位,以指示其准备好接收数据。
数据传输:
数据传输包括8位数据字节,每个字节后面跟着一个应答位。数据可以从主设备传输到从设备,也可以从从设备传输到主设备。
应用:
I2C广泛应用于连接各种外设,如传感器、存储器、显示器、实时时钟等。由于I2C总线上可以连接多个设备,它非常适用于系统中需要与多个设备进行通信的场景。


总的来说,I2C是一种灵活、简单的通信协议,适用于需要在多个设备之间进行短距离通信的嵌入式系统。

④ RS232、RS485


RS232(Recommended Standard 232)和RS485(Recommended Standard 485)是两种串行通信标准,通常用于在计算机系统、嵌入式系统和外部设备之间传输数据。尽管它们都是串行通信标准,但它们有一些关键的区别,适用于不同的应用场景。

RS232


单点通信:
RS232通常用于单点通信,即一对一的通信方式。一条RS232线路上只能连接两个设备,一个作为发送方,另一个作为接收方。
距离和速度:
RS232适用于相对短距离的通信,一般在数米内。通信速率可以达到数十kbps或更高,但随着距离的增加,信号质量可能下降。
电压级别:
RS232使用的电压级别是负逻辑,即逻辑“1”对应负电压,逻辑“0”对应正电压。
应用场景:
常见的RS232应用包括串口连接、调试连接、计算机和外部设备之间的连接,例如打印机、鼠标、调制解调器等。

RS485


多点通信:
RS485适用于多点通信,允许在同一总线上连接多个设备。每个设备都有唯一的地址,通过地址识别通信对象。
距离和速度:
RS485能够支持较长距离的通信,一般可达数千米。通信速率可以从几百bps到数Mbps,具有更大的灵活性。
电压级别:
RS485使用平衡电压级别,即逻辑“1”和逻辑“0”分别由两个相对电压表示,使得在长距离通信中更能抵抗电磁干扰。
差分信号:
RS485使用差分信号传输,即数据线和其反向线的电压变化表示逻辑信息。这种差分传输方式使其更适合在噪声环境中稳定工作。
应用场景:
RS485广泛应用于需要多设备协同工作的场景,例如工业自动化、建筑自动化、仪器仪表等。

总的来说,RS232适用于短距离、点对点的通信,而RS485适用于多点通信,特别是在长距离和噪声环境中。选择使用哪种标准通常取决于具体的应用需求。

⑤ CAN


CAN(Controller Area Network)是一种专为实时控制系统设计的串行通信协议。CAN协议最初是由德国的Bosch公司在1986年提出,后来逐渐发展成为国际标准。CAN协议主要应用于汽车领域,但也在工业控制、医疗设备和其他领域中得到广泛使用。以下是CAN协议的主要特点和工作原理:

总线架构:
CAN采用总线架构,允许多个节点通过共享相同的总线进行通信。每个节点都有一个唯一的标识符,用于在总线上识别发送和接收的消息。
通信线:
CAN通信使用两根主要的线路:
CAN_High: 高电平线,用于传输逻辑“0”。
CAN_Low: 低电平线,用于传输逻辑“1”。
CAN使用差分信号传输,能够更好地抵御电磁干扰。
帧格式:
CAN通信的基本单位是数据帧,包括标识符、控制位、数据和CRC(循环冗余校验)等字段。CAN帧分为两种类型:数据帧和远程帧。数据帧用于传输实际数据,而远程帧用于请求其他节点发送数据。
多主控制:
CAN支持多主控制,允许多个节点之间动态地决定总线的控制权。这使得CAN在实时系统中更具灵活性和实时性。
冲突解决:
CAN使用CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance)机制来解决冲突。节点在发送数据前会监听总线,确保总线上没有其他节点正在发送。
优先级和仲裁:
每个CAN消息的标识符包含优先级信息。在总线上发生冲突时,优先级较高的消息将胜出。这种机制称为仲裁,确保高优先级消息能够及时被发送。
应用场景:
CAN协议广泛应用于汽车领域,包括车辆内部的控制系统和车辆间的通信。此外,在工业控制、医疗设备、电力系统和航空航天等领域也有广泛的应用。

总体来说,CAN是一种适用于实时控制系统的可靠、高效的通信协议,特别适用于具有多个节点和实时性要求的场景。

3 对比


UART(Universal Asynchronous Receiver Transmitter)是一种异步串行通信协议,用于在两个设备之间传输数据。它使用一根数据线(TXD)发送数据,另一根数据线(RXD)接收数据。UART通信的每个字节都包含一个起始位、8个数据位和一个停止位。

RS232(Recommended Standard 232)是一种串行通信标准,用于在计算机和其他设备之间传输数据。它使用EIA-232电压标准来定义信号电平。RS232通信可以支持点对点或多点连接。

RS485是一种半双工差分串行通信协议,用于在多台设备之间传输数据。它使用两根数据线(A线和B线)来发送和接收数据。RS485通信可以支持多达32台设备连接到同一个总线。

I2C(Inter-Integrated Circuit)是一种串行通信协议,用于在集成电路之间传输数据。它使用两根数据线(SDA和SCL)来发送和接收数据。I2C通信可以支持多达127台设备连接到同一个总线。

SPI(Serial Peripheral Interface)是一种同步串行通信协议,用于在主设备和从设备之间传输数据。它使用四根数据线(SCLK、MOSI、MISO和SS)来发送和接收数据。SPI通信可以支持多台从设备连接到同一个主设备。

以下是UART、RS232、RS485、I2C和SPI的比较表:


应用场景:

UART:用于连接计算机和外围设备,如键盘、鼠标、打印机等。
RS232:用于连接计算机和工业设备,如PLC、仪表等。
RS485:用于连接多个工业设备,如楼宇自动化、安防监控等。
I2C:用于连接主板和外围设备,如EEPROM、传感器等。
SPI:用于连接主板和高速外围设备,如SD卡、LCD显示屏等。

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高亚奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值