2018年3月19日月曜日

超低価格大容量SPI Flash(ただし遅い)

【写真】予備を作ると壊れもせず一発で動く…私はそういう星の下に生まれた男だ。

W25Q32FVSSIGっていうチップを入手しました。SPI接続のフラッシュメモリです。

結論として、消去がやたら遅い(6秒程度)ので別タスクで消す等の処理は必要ですが、4MBのストレージが約50円しかも1.27mmピッチのSOICパッケージというのは扱いやすくて良いんじゃないでしょうか。

digi-keyなどでは生産中止品扱いなのですが、中国でセカンドかサードソースかコピー品が生産されているのでしょう。

■準備■

とりあえず使ってみる場合、「Arduino チップ名」か「ESP32 チップ名」でググってみると何かライブラリが出てきます。安心して配線しましょう。

SOIC、手元に変換基板がなかったので秋月のSOP8用で代用します。パターンが足の下に隠れてしまうので手ハンダではなくリフローしました。最近0.2mm間隔のチップを相手にしていたので、1.27mmなんて鼻歌です(表面張力のおかげですが)。

何度でも書きますが、自宅リフローにつかうクリームハンダはサンハヤトに限ります(笑)。これはハンダの粒子もきめ細かいですしパターン乗りもよく本当に扱いやすいです。フラックス活性が高いのかなんだか知りませんがボールなどが発生しにくいです。価格はわりと高いんですが、どうせ有効期限内に使い切れないので丁度いいのです(笑)。

Arduino IDEでESP32を選び、Library Managerで「SPIFlash」と入力するといくつかヒットしますが、とりあえずPrajwal Bhattaram氏作のSPIFlashを選びます。接続する前にESP32にFlashDiagnosticsを書き込んで起きましょう。ESP32への電源を切ってから以下の配線をします。

接続はESP32としては標準的なSPIの接続です。SOとSIはプルアップしていません。

ESP32W25Q32
IO051 CS
IO192 SO
3V33 WP
GND4 GND
IO235 SI
IO186 SCK
3V37 HLD
3V38 Vdd

■動かしてみて■

消去がものすごく遅いです。4MB消すのに6秒かかります。
Erase Chip: Data I/O test PASS Time: 5.967 s
Erase 64KB Block: Data I/O test PASS Time: 158.449 ms
Erase 32KB Block: Data I/O test PASS Time: 120.735 ms
Erase 4KB Sector: Data I/O test PASS Time: 91.357 ms

このチップ、こんなに安いんですが、100,000サイクルの消去が可能って書いてありますので、Wear Levelingは行われているみたいですね。小さい廉価品なのに大したもんだ。

【追記2018年9月5日】セクター(256bytes)で同一アドレスにひたすら消去・書き込み・読み出し…を繰り返す実験をしたら100万回越えてもエラー出ませんでした。約150万回で初めてエラーが出ました。テスト前にも相当使っていましたのでもうちょっと長いかもしれません。個体差もあるのでこの結果が保証されるというわけではありませんが、少なくとも仕様の10万回は問題ないと言えるでしょう【追記終わり】

読み書きはuSの単位なので普通に使えそうですが…Flashは消去してからでないと書き込みができない宿命なので、別タスクでメモリ消すとかリングバッファ的に管理して使う必要があります。あと、64KBずつ消すと10秒近くかかってしまいますが、一括消去だと6秒で終わるのも注目点ですね。まぁ「たかが二倍」とも言えますが。

アルゴリズムとしては1ブロック64KBとして状態を示すフラグを64個の配列にしておき、それぞれが使用中か消去済か消去要求か消去中か…を示すようにして、消去用タスクの中でループで状態を監視し、消去要求のブロックがあれば消去中に変更して消去を実行し、完了後消去済みに書き換えてから次のループ…という形でうまく動きました。タスクを使う場合は競合などに配慮する必要がありますが、この場合はタスクごとに変更可能な状態を制限しておくことで回避することができます。

使用したいブロックが消去済より少ない場合にはランダムにスキップしてやればある程度消耗度を分散させることもできます。使用中フラグは正の整数ということにして次のブロック番号を指すようにすれば簡単なシーケンシャルファイルを実装できます。

なお、Prajwal Bhattaram氏のライブラリはGNUなので、実際の装置に組み込む場合には注意が必要です。

私は例によって書き終わってからこれに気づいたので、自分で書き直しました。SPI Flashを扱うことのできるライブラリはいくつかあるんですが、みんなGNUなんですよね。幸い処理は比較的簡単です。

私が書いたやつは、そのうちお掃除したらApacheかなにかで公開します。

0 件のコメント:

コメントを投稿