准备工作

工具

  • 树莓派 4B(OS:Raspberry Pi OS)

    • flashrom
  • 双母头杜邦线

  • 测试钩

开启树莓派SPI(串行外设接口)

默认情况下禁用 SPI ,需要手动开启:

1
sudo raspi-config

打开树莓派设置 -> Interface Options -> SPI -> enable 。配置完整后 /boot/config.txt 会取消注释 dtparam=spi=on ,代表是启用 SPI0 ,默认情况下使用 2 条芯片选择线(片选通道)。

如果正常开启会在 /dev 下会有两个驱动对应两个片选:

1
2
ls /dev/spi*
#/dev/spidev0.0 /dev/spidev0.1

Rapsberry Pi Zero、1、2 和 3 具有三个 SPI 控制器:

  • SPI0 具有两个芯片片选,在 Pi 都可用;还有一个仅在计算模块上的备用替代映射。
  • SPI1 具有三个芯片片选,除 Pi 1 以外的都能用。
  • SPI2 具有三个芯片片选,仅在 Pi 1、3 和 3+ 上可用。

在 Pi 4 上,有额外四个的 SPI 总线:SPI3-SPI6,每个都有 2 个芯片片选。额外的 SPI 总线通过特定 GPIO 引脚上的备用映射分配。关于 SPI 更详细信息查阅官方文档SPI硬件官方文档开启其他SPI配置

内核也会加载对应 mod ,默认的 Linux 驱动程序是spi-bcm2835 。这个驱动文件与上面开启 SPI3-SPI6 总线有关,开启这部分总线需要更换驱动程序为 spi-bcm2711,具体查阅官方文档

1
2
3
lsmod | grep spi
#spidev 24576 0
#spi_bcm2835 24576 0

树莓派引脚定义

GPIO-Pinout-Diagram-2

代号含义

1
2
3
4
5
SCLK - Serial CLocK | 时钟
CE - Chip Enable (often called Chip Select) | 片选
MOSI - Master Out Slave In |
MISO - Master In Slave Out
MOMI - Master Out Master In

SPI功能引脚定义

主要使用 SPI0、SPI1 ,其他 SPI 总线引脚映射

SPI0

SPI Function Header Pin Broadcom Pin Name Broadcom Pin Function
MOSI 19 GPIO10 SPI0_MOSI
MISO 21 GPIO09 SPI0_MISO
SCLK 23 GPIO11 SPI0_SCLK
CE0 24 GPIO08 SPI0_CE0_N
CE1 26 GPIO07 SPI0_CE1_N

SPI1

SPI Function Header Pin Broadcom Pin Name Broadcom Pin Function
MOSI 38 GPIO20 SPI1_MOSI
MISO 35 GPIO19 SPI1_MISO
SCLK 40 GPIO21 SPI1_SCLK
CE0 12 GPIO18 SPI1_CE0_N
CE1 11 GPIO17 SPI1_CE1_N
CE2 36 GPIO16 SPI1_CE2_N

从Flash中提取

寻找

针对 SOP8/16 封装的 SPI Flash 芯片。寻找到主板上 flash 后到**半导小芯**查询芯片手册,描述会有说明芯片通信协议。

SOP 8/16 封装引脚定义图:

SOP8/SOP16

接线

flashrom document 接线说明:https://www.flashrom.org/RaspberryPi

用的是 Pi 4B 文档提及 3.3V 不能大于 50mA 问题不存在,就不用管

SPI0 片选0 接线方式,片选 1 区别就是将 24 脚换成 26 脚

RPi header Broadcom Pin Function SPI flash
25 GND GND
24 SPI0_CE0_N /CS
23 SPI0_SCLK CLK
21 SPI0_MISO DO
19 SPI0_MOSI DI
17 3v3 Power VCC 3.3V (/HOLD, /WP)

In general the other pins (usually pin 3 is /WP and pin 7 is /HOLD) should be connected to Vcc unless they are required to be floating or connected to GND (both extremely uncommon for SPI flash chips).

一般 /WP 和 /HOLD 应该接 3.3V,除非是需要这两引脚需要悬空或者接地,具体查一下芯片手册

对于 SOP8 封装芯片就按照上面引脚接线,如果是 SOP16 封装芯片忽略 NC 引脚,剩余 8 个引脚和 SOP8 一样接线方法。

WechatIMG89-min

提取

1
flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=1000 -r rasp.bin
  • -p :指定 SPI 总线,注意片选接要对应,SPI0 接 24 脚对应是片选 0
  • spispeed :读写速率
  • -r :输出文件名
  • -c :选择芯片型号。自动识别可能会识别出多个型号,需要根据提示选择合适型号

参考文章