Linux开发学习记录(6):常见的设备接口与总线

成元 2026-03-21 { 教程, 笔记 } [ Linux ]

前言

最近学习Linux驱动,回想起这几年打各种比赛,做各种项目,用到了一堆接口与通信协议,乱七八糟的说多也不多,说少也不少,总之这里做一下总结。

IIC

介绍

I2C 全称 Inter-Integrated Circuit,是很常见的一种串行总线协议与接口,由 NXP 公司设计。

I2C 使用两条线在主控制器(主机)和从机之间进行数据通信:

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通信写时序

  1. Master -> Slave : 1 bit START。
  2. Master -> Slave : 7 bit Salve Address,从机的地址。
  3. Master -> Slave : 1 bit W/R。0为写;1为读。这里为 0。
  4. Master <- Slave : 1 bit ACK。
  5. Master -> Slave : 1 bit START。
  6. Master -> Slave : 8 bit Register Address,从机上寄存器的地址。
  7. Master <- Slave : 1 bit ACK。
  8. Master -> Slave : 8 bit DATA。主机发送写入指定寄存器的数据。
  9. Master <- Slave : 1 bit ACK。
  10. Master -> Slave : 1 bit STOP。主机发送停止位,表示不再发送更多的数据。
单字节读时序

I2C通信读时序

  1. Master -> Slave : 1 bit START。
  2. Master -> Slave : 7 bit Salve Address,从机的地址。
  3. Master -> Slave : 1 bit W/R。0为写;1为读。这里为 0。
  4. Master <- Slave : 1 bit ACK。
  5. Master -> Slave : 1 bit START。
  6. Master -> Slave : 8 bit Register Address,从机上寄存器的地址。
  7. Master <- Slave : 1 bit ACK。
  8. Master -> Slave : 1 bit START。
  9. Master -> Slave : 7 bit Salve Address,从机的地址。
  10. Master -> Slave : 1 bit W/R。0为写;1为读。这里为 1。
  11. Master <- Slave : 1 bit ACK。
  12. Master <- Slave : 8 bit DATA。从机发送从指定寄存器读取的8位数据。
  13. Master -> Slave : NO ACL。主机发出 NO ACK 信号,表示不需要从机再发送额外的数据了。
  14. Master -> Slave : 1 bit STOP
多字节读写时序

和单字节时序基本上一致:

SPI

介绍

SPI 全称是 Serial Perripheral Interface,是很常见的一种串行总线协议与接口,由 Motorola 公司设计。

SPI 是一种高速、全双工的同步通信总线,SPI 时钟频率相比 I2C总线 要高很多,最高可以工作在上百 MHz。

SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI需要 4 根线,但是也可以使用三根线(单向传输),这篇笔记是标准的 4 线 SPI,这四根线如下:

  1. CS/SS,Slave Select/Chip Select,片选信号线。
    用于选择需要进行通信的从设备。SPI 主机不需要发送从机设备地址,直接将相应的从机设备片选信号拉低即可指定要访问的从机。
  2. SCK,Serial Clock,串行时钟。
    I2C总线 的 SCL 一样,为 SPI 通信提供时钟。
  3. MOSI/SDO,Master Out Slave In/Serial Data Output,主出从入信号线。
    这根数据线只能用于主机向从机发送数据,也就是主机输出,从机输入。
  4. MISO/SDI,Master In Slave Out/Serial Data Input,主入从出信号线。
    这根数据线只能用户从机向主机发送数据,也就是主机输入,从机输出

SPI总线协议

连线结构图

SPI连线结构

一个SPI总线下可以有一个主机和多个从机,虽然主机是以广播的形式与从机交流,但是由于CS的存在,从机不需要设备地址,主机只需要拉低对应从机的CS地址即可选中从机。

工作模式

SPI 有四种工作模式,通过串行时钟极性(CPOL)和相位(CPHA)的搭配来得到四种工作模式:

  1. CPOL=0,串行时钟空闲状态为低电平。
  2. CPOL=1,串行时钟空闲状态为高电平。
  3. CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
  4. CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。 SPI通信的四种工作模式

时序图

以 CPOL=0,CPHA=0 这个工作模式为例,SPI 进行全双工通信的时序如下图。
SPI通信时序图

UART

介绍

UART 的全称是 Universal Asynchronous Receiver/Transmitter,即通用异步收发器

UART 作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART 接口与外界相连最少只需要三条线:

时序

UART通信最常见的格式

UART波特率

波特率本来指的是每秒传输的码元数,但是在二进制调制后,对于 UART 而言就是每秒传输的数据位数,一般选择 9600、19200、115200 等。

电平标准

一般的接口电平有 TTL 和 RS-232。

对于 TTL:

对于 RS-232:

CAN

直接参考江协科技(原江课大自化协)的CAN总线入门教程-全面细致 面包板教学 多机通信即可。

因为CAN总线的仲裁等机制很难用文档的格式进行描述,而江协科技的视频讲解的比较仔细,比啃文档入门效率高很多,作为入门教学资料挺好的。

USB

物理接口

#待补充

通信协议

#待补充

以太网

以太网说实话也不是一个博客能讲完的,要深入理解还是需要阅读《TCP/IP详解 卷1:协议》、《计算机网络》以及 IEEE 802 项目各个小组制定的标准(尤其是 802.3 )。