引き続き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の使い方の理解の勉強にはなりました。