SPI Flashの読み書きを簡単に行うための一手

Raspberry Piを利用して、単体の、または機器に実装された状態のSPI Flashを読み書きする方法について解説します。
2023.07.28

ESP32をはじめとして、さまざまな組み込みデバイスの開発でよく使われる、25から始まる型番のSPI Flashですが、開発途中で内容をバックアップしたり大容量品に交換したくなることや、デバッグのために内容を書き換えたいといった場面に直面することは、わりとありがちではないでしょうか。
この記事では、Raspberry Piを利用して、ソケットや基板上から取り外したSPI Flash単体を読み書きする方法に加えて、ターゲット機器の基板上に実装されているSPI Flashを直接書き換える方法も解説します。

それでは、はじめていきましょう。

Raspberry PiとSPI Flashを配線する

まずは、RaspberryPiとSPI Flashが通信できるように、電気的に配線することを考えます。
基本的には、SCLK(クロック)、MOSI(送信)、MISO(受信)、CS(チップセレクト)の信号4本とGNDが配線されており、電源が供給されていればSPI Flashとの通信が成立します。

Raspberry Piで使用するピン

SPI Flashとの接続に使用するピンは下記の通りです。

3.3V--(17) (18)
MOSI--(19) (20)--GND
MISO--(21) (22)
SCLK--(23) (24)--CS0

Raspberry Piの40ピンヘッダーの配置は下記を参照してください。 https://www.raspberrypi.com/documentation/computers/raspberry-pi.html

SPI Flash単体への配線

目的のSPI Flashのピン配置を確認しながら、対応するピンを接続していきましょう。使用しないピンはプルアップしておくのが理想的ですが、VCCに繋いでしまっても問題ないでしょう。
代表的な8ピンパッケージものでは、このような接続になります。

丸ピンソケットとピンヘッダを配線し、こういった治具ケーブルを作っておくといざというときに便利です。 ICソケットに配線したケーブル

ピッチ変換基板に丸ピンヘッダをつけたものを用意しておけば、同一ピン配置のSOPタイプ、TSOPタイプのパッケージにも対応できます。
ICの逆挿しには注意しましょう。

ターゲット機器の基板上にあるSPI Flashへの配線

必ずしもSPI Flashが容易に取り外せるとは限りません。量産後にROMデバッグが必要になったり、現在の状態のバックアップを取ったうえでアップデートを行いたいなど、実装されたままの状態で外部からアクセスしたいケースもあるでしょう。また、この方法は、アップデート失敗などでBIOS ROMを飛ばしてしまったPCのマザーボードを修復する方法としてもしばし行われる方法です。
一点だけ異なることは、SPI Flashの電源はターゲット機器から供給されているので、電源ピンについては配線しないことです。電源ピンを配線して、ターゲット機器の電源が入っていない状態で書き換えようとは考えないでください。ターゲット機器側に電源が逆流し、ターゲット機器やRaspberry Piが故障する原因になります。
さて、問題は基板上のSPI Flashにどうやって配線するかですが、いくつかの方法があります。

  • 近くにSPI Flashに配線されているピンヘッダがないか探す
    • ピン配置が不明なら、ICの足とピンヘッダをテスターで総当たりして対応するピンを調べます
  • ICクリップを使用する
  • ICの足に直接ワイヤーをはんだ付けしてしまう
    • コネクタを付けておくと便利です
    • あまり長く引き出すと、スタブ配線となり通常使用時に支障が出てしまうことがあります

場面に応じて最適な方法を選んで下さい。
外部からSPI Flashにアクセスしている間は、ターゲット機器の電源が入った状態でリセット状態に保持する等して、SPI Flashへのアクセスを抑止しておく必要があります。
(マザーボードの修復の場合は、主電源オン、電源オフの状態から作業すると成功するケースが多いです。)

Raspberry PiでFlashromを実行する

まず、raspi-config を実行し、SPIを有効に設定した後、再起動しておきましょう。
Flashromをインストールします。

sudo apt update
sudo apt install flashrom

読み込みを行うときは

sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=8000 -r foo.bin

書き込みを行うときは

sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=8000 -w bar.bin

spispeedの指定は、配線の状況により上限が変わりますので、配線が短ければ上げてみる、失敗するようだったら下げてみる等、通信エラーが起きない範囲で調整してください。
型番は自動認識されますが、非対応の型のSPI Flashでも、同一容量の近い型番を指定することで読み込みのみ行える場合もあります。

SPI Flashの書き換えが気軽に行えると便利

SPI Flashの読み書きが簡単に行えると、設計中のデバイスの開発・デバッグが容易になることはもちろん、得体のしれない機器の挙動を調べたりするのにも役立ちます。
たとえばこのように、おもちゃの液晶ゲーム機に、ふるさと納税の返礼品のゲームソフトを書き込んで遊ぶ、といったこともできてしまうかもしれません。

困った時に、この記事がお役に立てば幸いです。