ラベル M25P16 の投稿を表示しています。 すべての投稿を表示
ラベル M25P16 の投稿を表示しています。 すべての投稿を表示

2013年12月30日月曜日

M25PX16をフルコントロール! (M25P16とM25PX16を比較してみる)

あらまし

2012年の10月にM25P16をフルコントロール!と題してM25P16の制御コードを公開しました。
今年に入ってM25PX16を使用する機会があり、それじゃあM25P16と何が違うの?というのを簡単に調べた結果をまとめてみました。一番下にはソースコードも示しましたのでご覧下さい。

M25P16とM25PX16

ブロック・ダイアグラムを見る限り、基本的な構成は変わりませんが、「64 OTP bytes」という何かが追加されています。ここで言うOTPとは、one-time programmableの略で、64バイトのワンタイム・ロムが存在するという事がわかります。なるほど、これは装置物に仕立てる時のアレコレに使えます。


次にメモリ・マップを確認してみると、M25PX16ではサブ・セクタが導入されている事がわかります。


M25PX16のコマンドがどうなっているのかというと、M25P16のコマンド・セットに加えて、幾つかの新しいコマンドが追加された形になっています。


M25PX16では、ロックレジスタが新設され、不用意なライトからメモリを保護できるように機能強化されています。また、DQ0とDQ1の二線を使って入出力ができる機能が追加されており、M25P16よりも高速にR/W可能なコマンドも用意されました。消去コマンドも、M25PX16ではサブ・セクタ単位での消去も可能となっています。

ざっと見た結果、M25P16を機能強化したのがM25PX16という感じで、M25P16を使用していた基板にM25PX16を使用する事もソフトウェアの変更のみで可能という事がわかりました。READ IDENTIFICATIONコマンドを発行すれば基板にどちらのフラッシュ・ロムが搭載されているのか検知可能ですから、下層でうまく実装する事で自動的に切り替える事も可能です。


ということで、M25P16とM25PX16に対する制御コードを記述し、実機動作確認済みのソースコード公開します。

ソースコード

  • 実機で動作確認済みのソースコードからターゲット依存箇所を取り除いたソースコードです。
  • 無保証です。一切の責任を負いません。
https://github.com/shinta-main-jp/M25PX16

2012年10月8日月曜日

M25P16をフルコントロール!

M25P16は、SPIバス互換シリアルインターフェースを持つ、16Mビットのフラッシュロムです。
8ピンの小さなパッケージから選択可能で、気軽にフラッシュロムを搭載する事ができます。


内部ブロックは以下のようになっています。
ページサイズ(Xアドレス)は256バイトで、256ページで1セクタです。
M25P16で消去可能な最小単位はセクタですので、256ページをまとめて消去(実際にはビットを全て1に)する事になります。


ちなみに、M25P16の場合、32セクタあって、総計8192ページ存在します。
なかなか広大な敷地が広がっています。嬉しい。

コマンド群は以下のようになっています。
データライト系のコマンドは「PAGE PROGRAM」、「SECTOR ERASE」、「BULK ERASE」です。


何か別の開発を中心に考えている場合、「一応ちゃんと実装したいなぁ」とか考えて上記の対応を始めると意外に時間がかかります。

今日は意外に時間がかかった(わけでもない気がするけど・・・)M25P16の実装を公開します。

ダウンロードはこちらから。

ソースコードとヘッダから構成されています。
ソースコードのSPIマクロに実装詳細を提供すれば、すぐに使えます。
SPIのキャラクタについてはデータシートを参照して下さい。


以下の検証を実施済みです。
  1. セクタ消去を実行する。
  2. M系列信号発生器から系列信号を取り出して「PAGE WRITE」操作用データを生成する。
  3. ページライトを実行する。
  4. M系列信号発生器を再度同じシード(種)で初期化する。
  5. 「READ DATA BYTES」操作でデータを読み込んで系列信号と比較。
  6. 上記を全セクタに対して実行する。

M25P16の全バイトをくまなくI/Oできる事を確認して満足満足・・・。
ですが、「本当にやりたい事」はこの先にあります。