Raspberry Pi 2 和 3 引脚映射

Raspberry Pi 2 & 3 Pin Header

Raspberry Pi 2 和 Raspberry Pi 3 的硬件接口通过板上的 40 引脚标头 J8 公开。 功能包括:

  • 24x - GPIO 引脚
  • 1x - 串行 UART(RPi3 仅包含微型 UART)
  • 2x - SPI 总线
  • 1x - I2C 总线
  • 2x - 5V 电源引脚
  • 2x - 3.3V 电源引脚
  • 8x - 地面引脚

GPIO 引脚

让我们看看此设备上提供的 GPIO。

GPIO 引脚概述

可通过 API 访问以下 GPIO 引脚:

GPIO# 开机拉取 交替功能 标头引脚
2 PullUp I2C1 SDA 3
3 PullUp I2C1 SCL 5
4 PullUp 7
5 PullUp 29
6 PullUp 31
7 PullUp SPI0 CS1 26
8 PullUp SPI0 CS0 24
9 下拉 SPI0 MISO 21
10 下拉 SPI0 MOSI 19
11 下拉 SPI0 SCLK 23
12 下拉 32
13 下拉 33
16 下拉 SPI1 CS0 36
17 下拉 11
18 下拉 12
19 下拉 SPI1 MISO 35
20 下拉 SPI1 MOSI 38
21 下拉 SPI1 SCLK 40
22 下拉 15
23 下拉 16
24 下拉 18
25 下拉 22
26 下拉 37
27 下拉 13
35* PullUp 红色电源 LED
47* PullUp 绿色活动 LED

* = 仅 Raspberry Pi 2。 Raspberry Pi 3 上不提供 GPIO 35 和 47。

GPIO 示例

例如,以下代码将打开 GPIO 5 作为输出,并将数字“1写在引脚上:

using Windows.Devices.Gpio;

public void GPIO()
{
    // Get the default GPIO controller on the system
    GpioController gpio = GpioController.GetDefault();
    if (gpio == null)
        return; // GPIO not available on this system

    // Open GPIO 5
    using (GpioPin pin = gpio.OpenPin(5))
    {
        // Latch HIGH value first. This ensures a default value when the pin is set as output
        pin.Write(GpioPinValue.High);

        // Set the IO direction as output
        pin.SetDriveMode(GpioPinDriveMode.Output);

    } // Close pin - will revert to its power-on state
}

打开引脚时,它将处于其通电状态,可能包括上拉电阻。 若要断开拉取阀的连接并获取高电压输入,请将驱动器模式设置为 GpioPinDriveMode.Input:

    pin.SetDriveMode(GpioPinDriveMode.Input);

当引脚关闭时,它还原其开机状态。

引脚复用

某些 GPIO 引脚可以执行多个功能。 默认情况下,引脚配置为 GPIO 输入。 通过调用 I2cDevice.FromIdAsync()SpiDevice.FromIdAsync() 打开交替功能,该功能所需的引脚会自动切换(“复用”)为正确的功能。 通过调用 I2cDevice.Dispose()SpiDevice.Dispose() 关闭设备时,引脚会还原为其默认功能。 如果尝试同时对两个不同的功能使用一个引脚,则在尝试打开冲突功能时会引发异常。 例如,

var controller = GpioController.GetDefault();
var gpio2 = controller.OpenPin(2);      // open GPIO2, shared with I2C1 SDA

var dis = await DeviceInformation.FindAllAsync(I2cDevice.GetDeviceSelector());
var i2cDevice = await I2cDevice.FromIdAsync(dis[0].Id, new I2cConnectionSettings(0x55)); // exception thrown because GPIO2 is open

gpio2.Dispose(); // close GPIO2
var i2cDevice = await I2cDevice.FromIdAsync(dis[0].Id, new I2cConnectionSettings(0x55)); // succeeds because gpio2 is now available

var gpio2 = controller.OpenPin(2); // throws exception because GPIO2 is in use as SDA1

i2cDevice.Dispose(); // release I2C device
var gpio2 = controller.OpenPin(2); // succeeds now that GPIO2 is available

串行 UART

RPi2/3 上提供了一个串行 UART: UART0

  • 引脚 8 - UART0 TX
  • 引脚 10 - UART0 RX

以下示例初始化 UART0 并执行后跟读取的写入:

using Windows.Storage.Streams;
using Windows.Devices.Enumeration;
using Windows.Devices.SerialCommunication;

public async void Serial()
{
    string aqs = SerialDevice.GetDeviceSelector("UART0");                   /* Find the selector string for the serial device   */
    var dis = await DeviceInformation.FindAllAsync(aqs);                    /* Find the serial device with our selector string  */
    SerialDevice SerialPort = await SerialDevice.FromIdAsync(dis[0].Id);    /* Create an serial device with our selected device */

    /* Configure serial settings */
    SerialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
    SerialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);
    SerialPort.BaudRate = 9600;                                             /* mini UART: only standard baud rates */
    SerialPort.Parity = SerialParity.None;                                  /* mini UART: no parities */  
    SerialPort.StopBits = SerialStopBitCount.One;                           /* mini UART: 1 stop bit */
    SerialPort.DataBits = 8;

    /* Write a string out over serial */
    string txBuffer = "Hello Serial";
    DataWriter dataWriter = new DataWriter();
    dataWriter.WriteString(txBuffer);
    uint bytesWritten = await SerialPort.OutputStream.WriteAsync(dataWriter.DetachBuffer());

    /* Read data in from the serial port */
    const uint maxReadLength = 1024;
    DataReader dataReader = new DataReader(SerialPort.InputStream);
    uint bytesToRead = await dataReader.LoadAsync(maxReadLength);
    string rxBuffer = dataReader.ReadString(bytesToRead);
}

请注意,必须将以下功能添加到 UWP 项目中的 Package.appxmanifest 文件以运行串行 UART 代码:

Visual Studio 2017 的清单设计器(用于 appxmanifest 文件的可视化编辑器)中存在影响 serialcommunication 功能的已知 bug。 如果 appxmanifest 添加了 serialcommunication 功能,则使用设计器修改 appxmanifest 将损坏 appxmanifest(设备 xml 子级将丢失)。 可以通过右键单击 appxmanifest 并从上下文菜单中选择“查看代码”来手动编辑 appxmanifest 以解决此问题。

  <Capabilities>
    <DeviceCapability Name="serialcommunication">
      <Device Id="any">
        <Function Type="name:serialPort" />
      </Device>
    </DeviceCapability>
  </Capabilities>

I2C 总线

让我们看看此设备上提供的 I2C 总线。

I2C 概述

在引脚标头上公开了一个 I2C 控制器 I2C1 ,其中包含两行 SDASCL。 用于此总线的 1.8KΩ 内部上拉电阻已安装在开发板上。

信号名称 标头引脚号 Gpio 编号
SDA 3 2
SCL 5 3

以下示例初始化 I2C1 并将数据写入地址 0x40的 I2C 设备:

using Windows.Devices.Enumeration;
using Windows.Devices.I2c;

public async void I2C()
{
    // 0x40 is the I2C device address
    var settings = new I2cConnectionSettings(0x40);
    // FastMode = 400KHz
    settings.BusSpeed = I2cBusSpeed.FastMode;

    // Create an I2cDevice with the specified I2C settings
    var controller = await I2cController.GetDefaultAsync();

    using (I2cDevice device = controller.GetDevice(settings))
    {
        byte[] writeBuf = { 0x01, 0x02, 0x03, 0x04 };
        device.Write(writeBuf);
    }
}

SPI 总线

RPi2/3 提供了两个 SPI 总线控制器。

SPI0

信号名称 标头引脚号 Gpio 编号
MOSI 19 10
MISO 21 9
SCLK 23 11
CS0 24 8
CS1 26 7

SPI1

信号名称 标头引脚号 Gpio 编号
MOSI 38 20
MISO 35 19
SCLK 40 21
CS0 36 16

SPI 示例

有关如何使用芯片选择 0 在总线 SPI0 上执行 SPI 写入的示例如下所示:

using Windows.Devices.Enumeration;
using Windows.Devices.Spi;

public async void SPI()
{
    // Use chip select line CS0
    var settings = new SpiConnectionSettings(0);
    // Set clock to 10MHz
    settings.ClockFrequency = 10000000;

    // Get a selector string that will return our wanted SPI controller
    string aqs = SpiDevice.GetDeviceSelector("SPI0");

    // Find the SPI bus controller devices with our selector string
    var dis = await DeviceInformation.FindAllAsync(aqs);

    // Create an SpiDevice with our selected bus controller and Spi settings
    using (SpiDevice device = await SpiDevice.FromIdAsync(dis[0].Id, settings))
    {
        byte[] writeBuf = { 0x01, 0x02, 0x03, 0x04 };
        device.Write(writeBuf);
    }
}