electronics,前回作ったArduinoUNOのSPIインタフェースでSPIフラッシュを読みだしてみました。これを何に使うかと言いますと,壊れた某W社のポータブルHDDのデータを救出するため,新しく同型の基板をC国から購入したので,このサーボ情報の入ったFlashを書き換えるために今回はこれを読みだして見ようと思います。某W社のポータブルHDDのデータ救出の話はまた別の機会に書こうと思います。HDDの基板を交換するのになんでそんな面倒な話になるかと言いますと,HDDにはファームとメディア固有の情報を出荷時に書き込んでいるので,メディア(円盤)と基板はその個体専用になっています。このため,単に基板交換しても運が悪いと正常に読めません。(ヘッドの位置情報とかも入っているので)普通はFlashチップを新しい基板に移植したりするんですが,基板から剥がすのはそれなりにリスクがあるので,今回は書き換える方法で対応したいと思います。そのため,まずはデータを読み出せるようにしなければなりません。そこで,まず対象のFlashを調べます。新しく入手したほうの基板を読みだしてみます。(最悪失敗してもデータロストにならないので。Pm25LD020なのでコレですね。データシートによると,2MbitのSPIFlashだそうです。大事なのは信号電圧です。このチップも3.3VですがArduinoの出力は5V(TTL)なため,そのままやるとレベルが合わないので読めません。いうわけで,実際接続するときはブレッドボード経由で抵抗分圧した出力をチップに接続します。あと,flashromのほうがこのチップに対応しているかを確認する必要があります。ここによるとPm25LD020はリストに載ってるので多分読めると思います。ステータスが?なのが気になるけど。ArduinoUNOのSPIインタフェースの出力は以下のようになってます。In/Outとなっておりました。データシート読むと,CSはプルアップでWp/Holdはhighにしとけば読めるっぽいので,そこで,チップの足にジュンフロン線でハンダ付けして,ブレッドボード上にレベル合わせの回路を作ります。苦労してとりあえず回路作りました。#チップの足にハンダ付けしてあります。4.7Kの抵抗があったので3本つないで分圧。hogehoge.imgとかすれば読めるはずなんですが。なんか読めないっすね。(汗よくよく読むと,frser-duinoはチップによっては3.3Vなチップが5V動作じゃないと読めないとか書いてありますね。なんつうかArduino側の問題じゃないのかなと思うんですが。するとそういう原因かもしれないけど,真面目に壊してしまうとシャレにならんのでちょっと今日は諦めます。Arduinoのインタフェースは不安定要素が多すぎて何が原因がわからんので,素直に秋月のFTD2232インタフェースでも買ってくることにします。Flashからの出力はなんか出てるっぽい。ワンショットで採ってみた。明らかになんかシリアルっぽいただ,CMOSの出力なんで5Vで動いてるAVR側が受け取れるのかは疑問。一応2.5V超えてるんで論理的にはHなハズではあるけどね。レベルシフタ回路作らないとダメかな。追記:AVRのAC特性によると0.7Vcc(Vcc=5Vだと3.5V)が論理Hレベルらしいです。Flashの出力が3.1V近辺なので厳しい感じがします。Flashからの出力。3.1V近辺がHっぽい。追記:結果的には読めました。FlashのPin2の出力をそのへんに転がってた2SC9451個でレベルシフタを作って,そいつをArduinoUNOのPin12に出力するようにしてます。あとこの辺見ながらSPIプロトコルも勉強しつつ,RDIDの化け方から推測して信号レベルを調整してたら最終的に読めました。flashromのオプションも大事で,ArduinoUNOを使ったI/Fでは以下のオプションでしか読めませんでした。素直にFT2232なボードを買ったほうが楽ですね。読めたんで,HDDのフラッシュを書き換えるという目的は達したんですが,リカバリーという意味では入り口に立った感じです。