2009年09月18日

A25L080 の使い方

ボチボチ ソフトの方も検討していこうと思う。まずは、シリアル FLASH の A25L080 から。

互換品について


こいつは、KDPDK15 などを分解したときに LCD モジュール と共に外して使う。壊してしまったり 単独で使うときのために互換品を探したところ、AT26DF081A が見つかった。

これの系列には、AT25DF041A (4Mbit) , AT26DF161A (16Mbit) , AT25DF321(32Mbit) などがある。AT26DF161 (16Mbit) , AT26DF321 などは、3.3V で使えないので注意。

ちなみに 、よく似た名前の AT25080 とかがあるが、1/1024 の 8K bit の EEPROM 。これともピン配置は同じで、コマンド体系も似ている(というかこちらがオリジナル)。

ここでは、A25L080 と AT26DF081A を見比べて共通に使える機能のみを対象に使い方を検討していく。

基本的な通信手順


通信は SPI mode 0 を使う。ソフトで行うときは、

    SCK 正論理 (初期状態 L )
    1bit send : データを SI にセットして SCK を↑
    1bit recv :↑後、データを SO から取り込み SCK を ↓

こんな手順。

通信は 8bit 単位。送受信順は MSB first 。

通信フォーマット

A25L080 のデータシートでは、

  • コマンド 1 バイト
  • アドレス 0 〜 3 バイト
  • ダミー 0 〜 3 バイト
  • データ 0 〜無制限

という風に説明されている。1つのコマンドシーケンスの前に CS ↓ 終わったら CS ↑するのが基本らしい。

データ長 は 0 でなければ、1〜無制限というのが多い。無制限ということは、CS ↑しなければ終わらないということ。

コマンド



  • シグネチャの読み込み (9Fh : RDID)


      send recv
      1 9Fh xx
      2 xx ベンダーID
      3 xx デバイスID 1
      4 xx デバイスID 2


      Vend ID1 ID2
      A25L080 37h 30h 14h
      AT25DF041A 1Fh 44h 01h
      AT26DF081A 1Fh 45h 01h
      AT26DF161A 1Fh 46h 01h

      M25P20 20h 20h 12h (追記参照)
      M25P40 20h 20h 13h (〃)
      M25P80 20h 20h 14h (〃)

      SST25VF016B bfh 25h 41h (〃)
      SST25VF016B bfh 25h 4Ah (〃)
      SST25VF016B bfh 25h 4Bh (〃)

      MX25L1605D C2h 20h 15h (〃)
      MX25L3205D C2h 20h 16h (〃)
      MX25L6405D C2h 20h 17h (〃)


    まずは、シグネチャーを読んで使えることを確認。容量の認識やブロック消去方法も この情報を元にする。

  • リード (03h : READ)


      send recv
      1 03h xx
      2 AA xx アドレス2 (上位 8bit)
      3 AA xx アドレス1
      4 AA xx アドレス0 (下位 8bit)
      5 xx DD データ0
      : : :


    この READ コマンドは、古いコマンドで、A25L080 では 50Mhz , A26DF081A では 33MHz が最大周波数。アドレス後1バイトのダミーを入れることで、最大周波数が 2倍の 0Bh: FAST_READ コマンドが両者にある。(今回は使わない)

    さらに、SI/SO を出力に使う FAST_READ_DUAL_OUTPUT なんてものが A25L080 にはあり 100Mhz で動くので、なにか面白い使い方ができるかも知れない。(今回は使わない)

    SRT162 では、PD の USART に接続しているので、同じく PD を使う LCD と同時には使えない。通常はバッファリング して使うことになる。

    ただ、SPI とは、同時に使えるので、A25L080 から読み込みつつ、SPI に出力するという使い方ができる。

    たぶん API 的には、open と close があって、1 バイトづつ読み込む getch みたいなのを inline で定義するのが基本で、それを使って バッファへの read 関数を作ることになりそう。

    ちなみに、USART は、最大 1/2 CPU_CLK のビットレート。1 バイト転送するのに 16 クロック。USART なら 2 バイトづつの転送も可能で、うまく作れば CPU_CLOCK 8MHz で READ 512KB/sec 出せる。

  • ページプログラム (02h : PAGE_PROGRAM)


      send recv
      1 02h xx
      2 AA xx アドレス2 (上位 8bit)
      3 AA xx アドレス1
      4 AA xx アドレス0 (下位 8bit)
      5 DD xx データ0
      : : :
      260 DD xx データ255


    かならず 256 バイト境界で、256 バイト のデータを書かないといけない。

    それぞれの ページプログラムの前に、05h: RDSR コマンドで、Write 可能かどうかのチェックが必要。さらに、06h: WREN コマンドで Write Enable Latch (後述) を set しなければならない。Write が完了すれば、Write Enable Latch は reset される。

    ちなみに ページプログラムの時間は Typ で A25L080 は 1.5ms 、AT26DF081A は 1.2 ms 。Max はどちらも 5ms 。

    データ転送の時間を 0 としても Typ で 17KB/sec 相当と遅い。だから 普通は書き込みをせず リードオンリーのデータを置くような使い方になるはず。

  • ライト許可 (06h: WREN)

      send recv
      1 06h xx


    WREN コマンドを発行すると、 Write Enable Latch がセットされる。消去やページプログラムをするには、Write Enable Latch がセットされていなければならない。

    それらの処理が終わると自動的に reset されるようだ。

    ただこのビットはただのラッチであり、実際に プログラム や消去ができるのかどうかを示すものではないようだ。

  • リードステータス (05h: RDSR)


      send recv
      1 05h xx
      2 xx DD ステータス
      : : : :

      ステータス情報
      共通:
      bit7 : SRWD -- Status Register Write Disable
      bit1 : WEL -- Write Enable Latch
      bit0 : WIP -- Write in Progress

      A25L080 :
      bit4 : BP2 -- block protect
      bit3 : BP1
      bit2 : BP0

      BP2-0 プロテクトされる 消去ブロック番号
      0 なし
      1    15
      2 14,15
      3 12-15
      4 8-15
      5 0-15 (all)
      6  0-15 (all)
      7  0-15 (all)

      AT26DF081A :
      bit5 : EPE -- ERASE/Program Error
      bit4 : WPP -- Write Protect Pin
      bit3 : SWP1 -- Software Protect Status
      bit2 : SWP0


    WEL、WIP は上述した。これに加えて、SRWD というのがある。WP ピン が セット(L) されている状態では無条件に 1 だが、そうでない場合、ライトステータスコマンド(01h: WRSR) で、0 にできる。(ソフトウェアプロテクト)。

    AT26DF081A の場合、 Erase/Program Error という便利そうな情報があるのだが、A25L080 のほうはない。これに頼らない違う方法を使わなくてはならない。

  • ライトステータス (01h: WRSR)


      send recv
      1 05h xx
      2 DD xx ステータス

      ステータス情報

      共通:
      bit7 : SRWD -- Status Register Write Disable

      A25L080 :
      bit4 : BP2 -- block Protect 2
      bit3 : BP1
      bit2 : BP0




消去系コマンド




  • セクタ消去 (20h : SECTOR_ERASE)

    send recv
    1 20h xx
    2 AA xx アドレス2 (上位 8bit)
    3 AA xx アドレス1
    4 AA xx アドレス0 (下位 8bit)

  • ブロック消去 (D8h : BLOCK_ERASE)

    send recv
    1 D8h xx
    2 AA xx アドレス2 (上位 8bit)
    3 AA xx アドレス1
    4 AA xx アドレス0 (下位 8bit)

  • チップ消去 (C7h : CHIP_ERASE)

    send recv
    1 C7h xx



A25L080 と AT26DF081A の共通機能は、4KB 単位のセクタ消去、64KB 単位の ブロック消去、チップ全体の チップ消去の 3 種類。

コマンドは簡単だが、これにかかる時間がすごい。


    A25L080 AT26DF081A
             Typ Max Typ Max
    セクタ消去 0.3 0.5 0.05 0.2
    ブロック消去 0.8 1.0 0.40 0.95
    チップ消去 8 20 6 16 (単位 秒)


まぁ、ブロック消去が効率よくて、チップ消去はそれを順番にやっている感じ。セクタ消去は 一応できるというレベル。

データ配置は、できるだけ 64KB 単位がよい。小さなデータでも 4KB 単位に配置しなければならない。

プロテクトできる範囲は、A25L080 では、64KB 単位のブロックで 15, 14-15, 12-15 の 3 種類だけ。AT26DF081 は、0-14 の 64KB 単位と 最後の 64K を 16K,8K,8K,32 に分けた合計 19 のエリアそれぞれにプロテクトできる。

A25L080 の方が機能が低いから、これに合わせて 上位の いくつかのブロックをプロテクトできると考えたら良さそうだ。

でも、たぶん使わない。

こいつに置くデータは?


まず、フォントデータ。ぞろよしさん作の k12x10 を使おうと考えている。これを使った場合 128x128 のエリアに 全角で 10桁 12行が表示できる。

フォントの形式は、FONTX2形式 が普通らしいが... なやみ中。
どのフォント形式を選ぶにせよ 64KB 単位にするなら 192KB のエリアを使用することになる。

つぎに 置きたいのは ロードするファームウェア。

せっかく、画面とボタンがついているのだから、インタラクティブに プログラムをロードできても良さそうなものだ。

ブートローダを入れ替えることによって、シリアル FLASH からロードするようにすればよいはず。ただ、USB からのロードが出来ないと 最初に シリアル FLASH に書き込むことができない。両方の機能を入れると ブートローダのサイズが問題になりそう。

ところで、エリアの割り付けの話。AT90USB162 を使うのだから 最大 16KB なわけだが .. ATmega32U2 なんてのもあるそうだし、プログラムによってはデータを沢山置きたいかも知れない。

64KB 単位で配置するけれども、簡単な管理情報を 各エリアの先頭とかに置いて管理したほうがよいかも知れない。

追記:M25Pxx

M25Pxx 系も おなじコマンド体系だった。ただし、4KB 単位の ERASE は使えない。あと古いものでは、RDID をサポートしていないようだ。RDID がないタイプでは、RES(0xab) コマンドを使う。

RES コマンドには Deep-Sleep からの復帰という機能もあるが、そのケース以外では次のシーケンスで、 デバイスType が得られる。

    send recv
    1 ABh xx
    2 xx xx
    3 xx xx
    4 xx xx
    5 xx デバイスType

    デバイスType:
    11h 2Mbit
    12h 4Mbit
    13h 8Mbit


追記:23K256

SPI RAM の 23K256もピンアサインが同じ。コマンド体系も似ている。

追記: SST25VF016B

    16Mbit の SST25VF016B が安いらしい。
    シグネチャは、bfh, 25h, 41h
    0Bh: FAST_READ コマンドあり。
    セクタ消去 (20h : SECTOR_ERASE 4K) あり。
    ブロック消去 (D8h : BLOCK_ERASE 64K) あり。

    SST25VF032B bfh, 25h, 4ah
    SST25VF064Cbfh, 25h, 4bh

    買えるのは、SST25VF032B のみか。


追記: MX25L1605AM2

2.4 inch の フォトフレームを分解したら MX25L1605AM2 と刻印がよめるチップが載っていた。調べると MX25L1605D のデータシートが見つかった。

0Bh: FAST_READ コマンドあり。
セクタ消去 (20h : SECTOR_ERASE 4K) あり。
ブロック消去 (D8h : BLOCK_ERASE 64K) あり。

MX25L1605D C2h 20h 15h
MX25L3205D C2h 20h 16h
MX25L6405D C2h 20h 17h
posted by すz at 20:02| Comment(0) | TrackBack(0) | SRT162
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/32216419
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック