一 GPIO

GPIO全称是General Purpose Input Output (通用输入/输出)。广义上来说它并不是类似USB、DVI、HDMI这样一种特定协议的接口,而是通用接口的总称。

树莓派提供了40个PIN口,大致的定义如下。其中黄色的GPIO PIN口有26个。 其余的是供电接口和接地口。每个GPIO接口都可以用作输入和输出,可以根据需要进行使用。 每个GPIO针脚都有编号,但是编号不是线性的。

针脚电压

2个红色的针口提供了5V的输出电压,2个橘色的针口提供3.3V输出电压。 而8个黑色针口作为接地为0V。 其他的接口可以提供输入输出功能。所以作输出时可以提供3.3V电压,而作为输入时能承受3.3V电压。

输入/输出

对于GPIO接口来说,最重要的就是输入和输出功能。对于计算机来说能识别的只有0和1,而对于数字电路来说通过高低电平来表示输出的值是0还是1。 因为树莓派GPIO接口的电压是3.3V。所以用3.3V表示高电平,也就是1,而用0V表示低电平,也就是0。一般来说高低电平会是一个电压范围。

在买外设的时候发现,有些设备是5V高电平,有些是3.3V。了解到单片机分为3.3V和5V,就是指的是GPIO接口的电压。如果用GPIO口产生一个3.3V的高电平给一个5V的设备,可能会被认为是低电平,如果直接接上一个5V设备作为输入电平,可能会导致树莓派烧坏。所以使用外设是要注意这个外设的电压是5V还是3.3V。

当GPIO用做输入时,会有高电平、低电平、高阻态三个状态。高阻态,指的是电路的一种输出状态,既不是高电平也不是低电平,这个时候因为状态不确定,读取GPIO时可能会导致数据不正确。所以引入了上拉和下拉电阻的概念。

  • 上拉电阻:电阻一端接VCC,一端接逻辑电平接入引脚(如单片机引脚)
  • 下拉电阻:电阻一端接GND,一端接逻辑电平接入引脚(如单片机引脚)

A GPIO pin designated as an input pin can be read as high (3V3) or low (0V). This is made easier with the use of internal pull-up or pull-down resistors. Pins GPIO2 and GPIO3 have fixed pull-up resistors, but for other pins this can be configured in software.

从官网文档看,树莓派每个GPIO接口都有上拉和下拉电阻,大部分是可以通过软件的方式来设置。所以树莓派在连接外设时可以不需要外部的上拉或下拉电阻。而是初始化时设置一下就可以了。

更多上下拉电阻的概念可以参考:

Pull-up and pull-down Resistors

上拉电阻与下拉电阻有什么作用

GPIO电路图以及上拉电阻的作用

上拉电阻和下拉电阻

电阻(4)之上拉电阻与下拉电阻详解

GPIO数据传输

和外设之间进行通信主要通过GOIP接口进行输入和输出。GPIO接口提供了可编程的方式从外设读取或向外设发送状态数据。通过控制控制高低电平可以输出不同状态,所以用做开关控制是非常简单有效的。作为输入时可以读取数值或者是状态。虽然每次只能传递0和1这样的数据,但是多次连续传递0和1组合起来,就可以传递复杂的数据。 比如温度传感器就是用GPIO口通过单总线协议进行数据交换。 通过GPIO可以进行各种协议的通信。

PWM

脉冲宽度调制(PWM),是英文“Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。比如伺服电机使用输入PWM信号的脉冲宽度来确定它们的旋转角度,LCD显示器基于PWM信号的平均值来控制它们的亮度。PWM是根据频率占空比进行震荡的数字信号(方波)

  • 周期(Period):脉冲信号从一个上升沿到下一个上升沿的时间
  • 频率(Frequency):描述1秒钟内脉冲周期发生的次数
  • 占空比(Duty): 一个周期中高电平时间占整个周期时间的百分比

所以我们可以通过设置不同的占空比来控制脉冲宽度或者信号的平均值 ,从而达到控制外部设备的目的。下图是占空比为0,25%和100%。

PWM有硬件和软件两种输出方式:

  • 软件方法:将普通GPIO引脚作为PWM输出引脚,依据实际需求,配置好计时器,在指定计时周期翻转GPIO引脚电平,实现PWM功能。通过终端方式实现,占用CPU,精度差,控制复杂
  • 硬件方法:在原理图设计时,将支持硬件PWM的引脚作为PWM输出引脚,这样就可以直接通过配置寄存器,采用硬件实现PWM功能了。通过事件方式实现,不占用CPU。

在树莓派上,所有GPIO接口都支持软件方式输出PWMi信号,GPIO12、GPIO13、GPIO18、GPIO19支持硬件方式输出信号。

PWM (pulse-width modulation)

  • Software PWM available on all pins
  • Hardware PWM available on GPIO12, GPIO13, GPIO18, GPIO19

I2C

I2C (Inter-Integrated Circuit)是一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。主要用来和一些简单的外设进行小数据的传输。一般连接一些传感器或驱动器,比如速度传感器、温度传感器、LCD显示器或电动马达。

I2C是一个同步串行(synchronous serial )接口。使用3条总线进行连接。分为主从设备,主从设备可以进行通信。

  • Shared clock signal (SCL): 因为I2C是串行的,所以需要SCL时钟总线发出信号来同步主从设备间的数据传输,发出时钟信号的设备为Master,而连接的设备为Slave。
  • Shared data line (SDA):主从设备间通过SDA总线进行数据传输,因为只有一根数据线,所以I2C接口是半双工
  • Common ground reference (GND) : 接地

I2C接口支持多个设备连接在同一个总线上。每个设备都有自己的地址,但是这个地址是软件实现的,这个地址用7bit表示,所以理论上I2C最多可以连接128个设备。而因为通信协议中带上了设备地址, 所以同时只能和一个设备通信,设备只会响应传递给自己地址的数据。I2C接口传输速率有Master的时钟频率决定。树莓派上默认是100KHZ。这个需要根据外设来进行设置。

树莓派上提供了2组I2C接口,分别是GPIO2、GPIO3和GPIO0、GPIO1。但是GPIO0和GPIO1是作为EEPROM,这个主要是用来刷主板上的ROM,所以不用来和外设进行通信。

I2C

  • Data: (GPIO2); Clock (GPIO3)
  • EEPROM Data: (GPIO0); EEPROM Clock (GPIO1)

SPI

SPI是串行外设接口(Serial Peripheral Interface)的缩写。是一种高速的,全双工,同步的通信总线。SPI有比较高的传输速度,所以适合用看来进行带宽要求比较高的数据传输,比如图像的传输。很多传感器都支持SPI和I2C接口。

SPI是一个同步串行(synchronous serial )接口。使用5条总线进行连接。分为主从设备,主从设备可以进行通信。

  • Master Out Slave In (MOSI)  数据总线,用于master向slave发送数据
  • Master In Slave Out (MISO) 数据总线,用于master接收slave发来的数据
  • Shared clock signal (CLK) 时钟总线,因为SPI是一个同步接口,所以也需要时钟总线来同步传输
  • Common ground reference (GND) 接地
  • CS 片选信号线,如果只有一个设备不需要

因为SPI使用了两条数据线传输数据,所以是全双工模式。 SPI同样支持多个设别连接,但是和I2C不同的是,SPI Slave设备地址是用硬件方式实现的,所以每个设备有一个CS总线和Master设备想了。这样Master可以同时和多个Slave设备进行通信。 SPI的传输熟虑也是由Master是时钟触发频率决定的,一般为16MHz 到 25MHz, 相比I2C要快了很多。

树莓派提供了2组SPI接口,其中SPI0提供了2个片选接口,SPI1提供了3个片选接口,所以树莓派最多应该可以连接5个SPI设备

SPI

  • SPI0: MOSI (GPIO10); MISO (GPIO9); SCLK (GPIO11); CE0 (GPIO8), CE1 (GPIO7)
  • SPI1: MOSI (GPIO20); MISO (GPIO19); SCLK (GPIO21); CE0 (GPIO18); CE1 (GPIO17); CE2 (GPIO16)

UART

通用异步收发传输器( Universal Asynchronous Receiver Transmitter), 一般也简称为串口(serial ports)。我们在使用电脑时也经常通说串口,比如老的COM口、现在的USB口。所以大家说串口一般是一个总称,而单片机上一般书串口指的是UART,它使用TTL电平(2.6V-5V为1,0为0-0.4V),而电脑上的COM口使用RS232电平 (逻辑1=-3V~-15V逻辑0=+3~+15V) 。串口、COM口、TTL、RS–232、RS–485区别详解

UART接口是异步接口,所以不需要时钟总线。设备之间的传输速率是可以协商的,所以是通用接口。 设备直接通过RX和TX两个数据总线连接,所以是全双工模式。UART接收到的数据会放到一个FIFO队列中,直到设备读取。UART支持3线和5线两种连接方式:

  • 3-Wire ports include data receive (RX), data transmit (TX), and ground reference (GND) signals.
  • 5-Wire ports add request to send (RTS) and clear to send (CTS) signals used for hardware flow control. Flow control allows the receiving device to indicate that its FIFO buffer is temporarily full and the transmitting device should wait before sending any more data.

5线相比3线多了RTS和CTS两条控制总线。作用就是当FIFO队列满了的时候通知设备暂时不要传递数据。和I2C以及SPI不同的是,UART是点对点通信。速度比I2C块,但是可能要比SPI慢。

树莓派在GPIO14和GPIO15 接口提供了UART功能,但是没有提供RTS和CTS总线,所以只能以3线的方式连接。

  • Serial
    • TX (GPIO14); RX (GPIO15)

小结

之前对GPIO的理解有点偏差,认为普通GPIO口只能发送0,1作为开关,而其他I2C,SPI等接口可以发送负责的数据。 后来发现一些外设就是通过普通GPIO口来进行了单总线通信。 所以GPIO确实只能产生高低电平,但是如果连续产生,就可以连续的发送数据给设备。 而I2C, SPI这些总线本质也都是发送电平,不同的是他们是按指定的协议方式发送。 而实际外设中有很多是自定义协议,所以理论上无论是自定义协议,还是标准的I2C,SPI这些协议,都是可以用任意的GPIO口来通信的。

只是PI上定义了I2C, SPI这样的接口,如果不使用这些接口,而用普通GPIO接口就需要自己来实现这个协议,而不能使用已有的I2C,SPI的库来通信。对于自定义协议也是一样。其实设备的针脚是可以任意GPIO的、只是如果使用了已有的库文件,需要修改对应的针脚设置。所以GPIO功能是非常强大的,你可以使用GPIO来和任意协议的设备通信,可以用GPIO来模拟USB通信,设置你可以模拟硬盘IDE接口和硬盘通信。当然在速度上可能会有限制。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐