引き続きLCDボード上のNANDフラッシュへのアクセスに挑戦です。
前回は、回路図を確認して、DB0~DB7がフラッシュにはつながっていなかったという事実を知ってガクゼンとしました。配線直すとLCDアクセスがいやらしくなるので、やりたくありません。フラッシュにはDB8~DB15の8ビットはつながっているのですから、16ビットアクセスで使ってみればどうだろうかと思いつきました。
実際のNANDフラッシュは8bitデバイスですが、SAM7SE256上の設定では16ビットデバイスとしてSMC (Static Memory Controller)を設定してやります。そうすれば、マイコンが書き込むデータの上位8ビットだけが実際にNANDフラッシュに伝わります。つまり書き込み時には、本来書き込みたいデータを8ビット左シフトして16ビットでの書き込みをすれば良いことになります。同様に読みだした16ビットデータは、上位8ビットしか意味を持たないことになるので、8ビット右シフトして扱ってやればいいはずです。この方針でソフトを変更して実験してみると、めでたくデバイスIDが正しく読み取れるようになりました。
続いて、ページデータの読み込みの実験です。本来は8ビット幅で、1ページ512バイト+スペア16バイトのデバイスなのですが、あたかも16ビット幅で、1ページ512ワード+スペア16ワードのデバイスであるかのようにアクセスしてやります。そして、読み取った16ビットデータのうち上位8ビットだけを集めてやります。すると、0ページ目のデータとして0x54が512バイト書き込まれている様子が読み出せました。どうやら他のページは全部イレーズされた状態のようで、0xffとなっているようです。0ページ目の0x54はTechToysのQAで書き込まれたデータではないかと思われます。
HY27US08561Aは、32ページ/ブロックで、全2048ブロックのNANDフラッシュです。Bad blockを確認するために、いちおう全ページのスペア領域を読み出してみましたが、すべて0xffになっていました。どうやらBad blockは登録されていないようです。
試しに1ページ(メイン領域にだけ)書き込み(プログラム)してみて、読み出してみると正しく書き込んだデータパターンが読み出せます。16ビットデバイスとしてアクセスしてやることで、読み書きは問題なくおこなえるようです。
AT91SAM7SE256には、NANDフラッシュ用の機能としてECCコントローラを持っており、2ビットのエラー検出と1ビットの訂正を行える4バイトのECCを計算/検算することができます。しかしながら、上述のようにだまして16ビットでアクセスしているので、このECC機能はさすがに正しく動作させることはできません。
LCDボードのパターンも確認してみましたが、フラッシュのデータ線を入れ替えるのは無理そうでした。残念ですが、ECC機能の利用はあきらめて、16ビットアクセスで使うしかなさそうです。現状は、ページの読み書きができただけの、最も低レベルでの操作ではありますが、NANDの使い方の理解の勉強にはなりました。
前回は、回路図を確認して、DB0~DB7がフラッシュにはつながっていなかったという事実を知ってガクゼンとしました。配線直すとLCDアクセスがいやらしくなるので、やりたくありません。フラッシュにはDB8~DB15の8ビットはつながっているのですから、16ビットアクセスで使ってみればどうだろうかと思いつきました。
実際のNANDフラッシュは8bitデバイスですが、SAM7SE256上の設定では16ビットデバイスとしてSMC (Static Memory Controller)を設定してやります。そうすれば、マイコンが書き込むデータの上位8ビットだけが実際にNANDフラッシュに伝わります。つまり書き込み時には、本来書き込みたいデータを8ビット左シフトして16ビットでの書き込みをすれば良いことになります。同様に読みだした16ビットデータは、上位8ビットしか意味を持たないことになるので、8ビット右シフトして扱ってやればいいはずです。この方針でソフトを変更して実験してみると、めでたくデバイスIDが正しく読み取れるようになりました。
続いて、ページデータの読み込みの実験です。本来は8ビット幅で、1ページ512バイト+スペア16バイトのデバイスなのですが、あたかも16ビット幅で、1ページ512ワード+スペア16ワードのデバイスであるかのようにアクセスしてやります。そして、読み取った16ビットデータのうち上位8ビットだけを集めてやります。すると、0ページ目のデータとして0x54が512バイト書き込まれている様子が読み出せました。どうやら他のページは全部イレーズされた状態のようで、0xffとなっているようです。0ページ目の0x54はTechToysのQAで書き込まれたデータではないかと思われます。
HY27US08561Aは、32ページ/ブロックで、全2048ブロックのNANDフラッシュです。Bad blockを確認するために、いちおう全ページのスペア領域を読み出してみましたが、すべて0xffになっていました。どうやらBad blockは登録されていないようです。
試しに1ページ(メイン領域にだけ)書き込み(プログラム)してみて、読み出してみると正しく書き込んだデータパターンが読み出せます。16ビットデバイスとしてアクセスしてやることで、読み書きは問題なくおこなえるようです。
AT91SAM7SE256には、NANDフラッシュ用の機能としてECCコントローラを持っており、2ビットのエラー検出と1ビットの訂正を行える4バイトのECCを計算/検算することができます。しかしながら、上述のようにだまして16ビットでアクセスしているので、このECC機能はさすがに正しく動作させることはできません。
LCDボードのパターンも確認してみましたが、フラッシュのデータ線を入れ替えるのは無理そうでした。残念ですが、ECC機能の利用はあきらめて、16ビットアクセスで使うしかなさそうです。現状は、ページの読み書きができただけの、最も低レベルでの操作ではありますが、NANDの使い方の理解の勉強にはなりました。
色々なことをされててすごいです!
私もマイコンに興味を持ち始めたのですが、まったくの素人で何から手をつけていいかがよく分かりません。
そこで、どうしていけば良いか、アドバイスをしていただけませんでしょうか?
目標は、内蔵のフラッシュメモリを直接ケーブル接続してパソコンで読み込み(吸出し)たいと思っています。
私の技術力は、MSのVC2005でVC++を書いてアプリを作成しています。
しかし、純粋C言語はあまり得意ではありません。
でも、仮想CPUみたいなものをC言語で作ったことがあり、アセンブラもそれなりにできます。
電子工作は、ほとんどやったことがありませんが、半田付けは普通にできます。
DWMの付録のSTM32基板で基本的な勉強をしています。
このSTM32を使って、フラッシュメモリを読み込むことは可能でしょうか?
また、そのためにはどのようなことから初めていけば良いでしょうか?
詳細な情報がなく、困っています。
どうぞよろしくお願いします。
これまでにマイコンを全く使ったことがないのであれば、DWMのSTM32はちょっと敷居が高いかもしれません。比較的新しいMCUなので参考書籍も少ないと思います。PICとかAVRとかの方が書籍は多いでしょう。ただし、STのサイトにはSTM32関連のデータシートとアプリケーションノートはそれなりに揃っていると思います。雑誌とか書籍はとっかかりやすいので、ざっと概要を把握するのには重宝しますが、正確に内容を理解するためにもデータシートを読む習慣はつけておいた方がいいと思います。
フラッシュメモリにもいろいろな種類/容量のものがありますので、目的や使いやすさ、あるいは入手性に応じて選択するのがいいのではないでしょうか? STM32のもつSPIでつなげられるものもあります。
DWMのSTM32基板であれば、SDカードが使えるように設計されていますが、SDカードは選択肢のひとつにはならないのですか? SDカードも中身はフラッシュなのですが。
HY27US08561AのようなNANDフラッシュをSTM32基板につなげることも可能です。GPIOを使って必要な信号を作ってやればいいでしょう。
わたしもハードウェアはシロウトなので、いつも勉強しながらやっています。データシートと回路図、そしてサンプルプログラムを繰り返し読んでいると、だんだんわかってくるような気がします。
言葉足らずですいません。
目標は、
PDAや家電製品一般(HDDレコーダ等)に内蔵されているフラッシュメモリの
中身のデータを、マイコンを使用して、メモリの足から直接プローブ
ケーブル(?)を接続して、マイコンとパソコンをUSBケーブル経由で
接続してパソコンに読み込み(吸い出し)たいと思っています。
STM32の基盤にSDカードスロットを貼り付けて、そこに対象の内蔵フラッシュメモリの足と
カードスロットの接続端子をプローブ等で接続して上記目標ができたらいいなぁと
考えました。
こういうことって可能でしょうか?
自分では、
・まずそもそもフラッシュメモリを外さなくてもメモリの足にプローブを付けられるのか?
・データシートを見ながら接続すれば可能なのか?フラッシュメモリとマイコンの間に他の基盤を介在させる必要はないのか?
・フラッシュメモリにコマンドのようなものを送信すれば、データが出力されるのか?
・そのコマンドをどうやって送信するのか?
・吸い出すデータをどうやってパソコン側で受信するのか?
などなど、課題が目白押しだと思っています。
何か間違っている、勘違いしている部分があれば是非ともご指摘下さいませ。
よろしくお願いします。
DWM付録のSTM32は外部メモリインタフェースはありませんが、ピン数が多いのでGPIOで16ビット幅のフラッシュをつなぐのにも不自由はしないでしょう。対象となるフラッシュメモリの動作電圧によっては直接つなぐことはできず、レベル変換が必要となるかもしれません。
フラッシュの読み書きのコマンドバイトは、どのチップでもほぼ同じはずですが、容量によってアドレスの指定の仕方や送出アドレスデータバイト数が変わりますので、これもデータシートで確認する必要があります。ページサイズやページ数もチップ依存のパラメータですので、これもデータシートで確認しないといけません。
まずは対象物のチップの型番を調べ、データシートを見てみようと思います。
現在の大きな課題は、
・フラッシュメモリの足が表面上からは見えず、プリント基板に埋め込まれているように貼り付けられている場合にどうするのか
・コマンドを送信し、フラッシュメモリからの受信データをどうやって取得するようなプログラムを書くのか
だと思います。
これからがんばってみます。