前言
最近学习Linux驱动,回想起这几年打各种比赛,做各种项目,用到了一堆接口与通信协议,乱七八糟的说多也不多,说少也不少,总之这里做一下总结。
IIC
介绍
I2C 全称 Inter-Integrated Circuit,是很常见的一种串行总线协议与接口,由 NXP 公司设计。
I2C 使用两条线在主控制器(主机)和从机之间进行数据通信:
- 一条 SCL(串行时钟线)
- 一条 SDA(串行数据线) 这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。
I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。
I2C总线协议
I2C 总线工作是按照一定的协议来运行的,接下来就看一下 I2C 协议。
连线结构图
I2C连线结构
I2C总线上有一个串行数据线 SDA 与一个串行时钟线 SCL(也有叫SCK的),这两根线(一般来说)必须会接一个4.7K的上拉电阻。
I2C总线上的所有设备都都要以**开漏输出(一个只能拉低到地,但不能主动拉高到电源的电子开关)**的方式分别接一根线到 SDA 与 SCL。
一个I2C总线下可以有一个主机和多个从机,原则上每个从机都必须在这条总线上有独一无二的器件地址,因为总线上的所有设备都共用SDA与SCL,主机只能以广播的方式呼叫指定的 I2C从机给予回应。
器件地址由NXP授权使用,一般为7位。由于地址空间有限,所以地址重复是工程师必须面对的现实问题。好在硬件上可以通过地址引脚(硬件配置不同电平)或总线复用器(物理隔离不同设备)来解决
时序图
起始位 START
在 SCL 为高电平的时候,SDA 出现下降沿就表示为起始位。
这是I2C 通信起始标志,通过这个起始位就可以告知所有 I2C 从机,“我”要开始进行 I2C 通信了。
I2C通信起始位
停止位 STOP
在 SCL 位高电平的时候,SDA出现上升沿就表示为停止位。
停止位就是停止 I2C 通信的标志位,和起始位的功能相反。
I2C通信停止位
数据传输 DATA
I2C 总线在数据传输的时候要保证在 SCL 高电平期间,SDA 上的数据稳定,因此 SDA 上的数据变化只能在 SCL 低电平期间发生(否则会被判断位起始位或者停止位)。
I2C通信数据传输
应答信号 ACK or NO ACK
将 SDA 拉低来表示发出应答信号,表示通信成功,否则表示通信失败。
单字节写时序
I2C通信写时序
- Master -> Slave : 1 bit START。
- Master -> Slave : 7 bit Salve Address,从机的地址。
- Master -> Slave : 1 bit W/R。0为写;1为读。这里为 0。
- Master <- Slave : 1 bit ACK。
- Master -> Slave : 1 bit START。
- Master -> Slave : 8 bit Register Address,从机上寄存器的地址。
- Master <- Slave : 1 bit ACK。
- Master -> Slave : 8 bit DATA。主机发送写入指定寄存器的数据。
- Master <- Slave : 1 bit ACK。
- Master -> Slave : 1 bit STOP。主机发送停止位,表示不再发送更多的数据。
单字节读时序
I2C通信读时序
- Master -> Slave : 1 bit START。
- Master -> Slave : 7 bit Salve Address,从机的地址。
- Master -> Slave : 1 bit W/R。0为写;1为读。这里为 0。
- Master <- Slave : 1 bit ACK。
- Master -> Slave : 1 bit START。
- Master -> Slave : 8 bit Register Address,从机上寄存器的地址。
- Master <- Slave : 1 bit ACK。
- Master -> Slave : 1 bit START。
- Master -> Slave : 7 bit Salve Address,从机的地址。
- Master -> Slave : 1 bit W/R。0为写;1为读。这里为 1。
- Master <- Slave : 1 bit ACK。
- Master <- Slave : 8 bit DATA。从机发送从指定寄存器读取的8位数据。
- Master -> Slave : NO ACL。主机发出 NO ACK 信号,表示不需要从机再发送额外的数据了。
- Master -> Slave : 1 bit STOP
多字节读写时序
和单字节时序基本上一致:
- 对于写时序,主机可以不在步骤 9 就发送停止位,而是继续发送数据,(一般来说会)从机会自动写入下一个寄存器并发送ACK,重复此过程,直到结束,主机再发送停止位。
- 对于读时序,主机步骤 13 可以不发出 NO ACK,而发送 ACK,(一般来说会)从机会自动读取下一个寄存器并发送DATA,然后主机要发送 ACK 表示还要读,或者发送NO ACK表示不需要再读取了。
SPI
介绍
SPI 全称是 Serial Perripheral Interface,是很常见的一种串行总线协议与接口,由 Motorola 公司设计。
SPI 是一种高速、全双工的同步通信总线,SPI 时钟频率相比 I2C总线 要高很多,最高可以工作在上百 MHz。
SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI需要 4 根线,但是也可以使用三根线(单向传输),这篇笔记是标准的 4 线 SPI,这四根线如下:
- CS/SS,Slave Select/Chip Select,片选信号线。
用于选择需要进行通信的从设备。SPI 主机不需要发送从机设备地址,直接将相应的从机设备片选信号拉低即可指定要访问的从机。 - SCK,Serial Clock,串行时钟。
和 I2C总线 的 SCL 一样,为 SPI 通信提供时钟。 - MOSI/SDO,Master Out Slave In/Serial Data Output,主出从入信号线。
这根数据线只能用于主机向从机发送数据,也就是主机输出,从机输入。 - MISO/SDI,Master In Slave Out/Serial Data Input,主入从出信号线。
这根数据线只能用户从机向主机发送数据,也就是主机输入,从机输出
SPI总线协议
连线结构图
SPI连线结构
一个SPI总线下可以有一个主机和多个从机,虽然主机是以广播的形式与从机交流,但是由于CS的存在,从机不需要设备地址,主机只需要拉低对应从机的CS地址即可选中从机。
工作模式
SPI 有四种工作模式,通过串行时钟极性(CPOL)和相位(CPHA)的搭配来得到四种工作模式:
- CPOL=0,串行时钟空闲状态为低电平。
- CPOL=1,串行时钟空闲状态为高电平。
- CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
- CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。
SPI通信的四种工作模式
时序图
以 CPOL=0,CPHA=0 这个工作模式为例,SPI 进行全双工通信的时序如下图。
SPI通信时序图
UART
介绍
UART 的全称是 Universal Asynchronous Receiver/Transmitter,即通用异步收发器。
UART 作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART 接口与外界相连最少只需要三条线:
- TXD(发送)
- RXD(接收)
- GND(地线)
时序
UART通信最常见的格式
- 空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,没有数据传输。
- 起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输。
- 数据位:数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。
- 奇偶校验位:这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。
- 停止位:数据传输完成标志位,停止位的位数可以选择 1 位、1.5 位或 2 位高电平,一般都选择 1 位停止位。
UART波特率
波特率本来指的是每秒传输的码元数,但是在二进制调制后,对于 UART 而言就是每秒传输的数据位数,一般选择 9600、19200、115200 等。
电平标准
一般的接口电平有 TTL 和 RS-232。
对于 TTL:
- TXD/RXD 低电平表示逻辑 0,高电平表示逻辑 1。
对于 RS-232:
- 采用差分线,-3 ~ -15V 表示逻辑 1,+3~+15V 表示逻辑 0。
CAN
直接参考江协科技(原江课大自化协)的CAN总线入门教程-全面细致 面包板教学 多机通信即可。
因为CAN总线的仲裁等机制很难用文档的格式进行描述,而江协科技的视频讲解的比较仔细,比啃文档入门效率高很多,作为入门教学资料挺好的。
USB
物理接口
#待补充
通信协议
#待补充
以太网
以太网说实话也不是一个博客能讲完的,要深入理解还是需要阅读《TCP/IP详解 卷1:协议》、《计算机网络》以及 IEEE 802 项目各个小组制定的标准(尤其是 802.3 )。