Spa3Eで扱えるSPI ROMのアクセス方法
Spartan3Eが扱えるSPIのROMは、ATMEL社のものと、STMicroelectronics社のものがあります。
これらのROMは、それぞれSPI方式なのですが、コマンドの形式が異なります。
制御信号で重要なものは、下の4本です。MISOとかMOSIとかややこしいのですが、
・MISO マスタ(FPGA)が入力する・・スレーブ→マスタへの通信
・MOSI マスタ(FPGA)が出力する・・マスタ→スレーブへの通信
・CLK クロック
・CS 通信をアクティブにする信号
このようになっています。
基本的には、マスタは、CSを下げて、8ビットの倍数の長さのコマンドを送信します。コマンドやデータの長さに制限はなく、デバイスの設計しだいでどんな長さにでもなります。

スレーブはコマンドを受け取ると、必要に応じてデータを出力したりします。

マスタがCS端子をHに上げると、一連のコマンドは終了となります。
たとえば、ST社のROMからデータを読み出すには、コマンド0x0Bを送信した後、24ビットのアドレス0x000000を送信します。その後、CS信号を上げずにクロックを入力しつづければ、コンフィグデータがROMから出力され、FPGAが起動します。
数メガbitにもなるコンフィグデータですが、最初に一度アドレスを与えれば、再度アドレスを与える必要はありません。
一方、ATMEL社のROMからデータを読み出すには、コマンド0xE8を送信した後、24ビットのアドレス0x000000を送信します。その後、CS信号を上げずにクロックを入力しつづければ、コンフィグデータがROMから出力され、FPGAが起動します。こちらも、最初に一度アドレスを与えれば、再度アドレスを与える必要はありません。
最初に無駄なデータが8ビットでるかとか、そういう些細な違いはありますが、基本的には読み出しの方法は同じで、最初にコマンドとアドレスを与えて後はクロックを与え続けるだけで、全データが読み出せます。
なお、最初に与えるコマンドはFPGAが作り出しますが、これをどのようにするかは、FPGAのVS2~VS0の端子で設定します。
このように、SPIのROMから読みだすのは非常に簡単です。
さて、書き込みはちょっと厄介です。
まずATMEL社のROMについて説明します。
Spartan3Eが扱えるのは、ATMEL社のAT45DBシリーズというFlashROMになります。
このROM、たとえばAT45DB041Bは、内部に264バイトのバッファを2つ持っています。このバッファはSRAMであって、フラッシュメモリアレイのデータを一時的に保存することができます。メモリアレイの「行」にかかわらず、フラッシュメモリのデータの一部分だけを書き換えたりすることができます。
コンフィグデータのように大きなデータを書き込む際には、264バイトごとに書き込みコマンドを発行して書き込みます。
このメモリの扱いにくい点は、バッファの長さが264バイトと中途半端なところにあります。
4Mbitのメモリであっても、総容量は4325376バイトになります。
AT45DB041Bでは読み書きバッファの長さは264バイトですが、新しいAT45DB041Dではバッファは264バイトと256バイトが選択できるようになっています。もう少し正確にいうと、工場出荷時は264バイトですが、ROMにあるコマンドを送信すると、256バイトモードになります。しかし、このモードはいったん設定したら元に戻すことができません。一方通行なのです。
書き込みプログラムは、与えられたデバイスが256バイトモードなのか264バイトモードなのかに注意しなければなりません。
さらに、AT45DB161Bと呼ばれる、大きな容量のデバイスは、バッファの長さが2倍の512/528バイトになっています。
ほかにも、AT45DB041Bはメモリの全消去コマンドがないとかIDCODEがないとか、容量や型番の末尾の英字によって若干の機能の違いがあります。
今まさに進化の最中にあるといえるデバイスでしょう。
| 固定リンク


コメント