ちょっと議論に遅れましたが、検索後にそれを読んでいる人にとっては……。
SPIフラッシュチップのプログラミングで絶対に重要なのは、チップセレクト(CS_)ピンの制御です。チップセレクトピンは、SPIフラッシュへのコマンドを区切るために使用されます。特に、CS_highからCS_lowへの遷移は、書き込み操作オペコード(WREN、BE、SE、PP)の発行の直前に行う必要があります。CS_遷移の間に(つまり、CS_がLowになった後)、書き込みオペコードが送信される前にアクティビティがある場合、通常、書き込みオペコードは無視されます。
また、SPIフラッシュデータシートで一般的に説明されていないのは、これもSPIプロトコルの固有の部分であり、これも重要なことですが、SPIバスで送信するバイトごとに、代わりにバイトを受信するということです。また、バイトを送信しない限り、バイトを受信することはできません。
通常、ユーザーがコマンドを発行するSPIマスターには、SPIバスのMOSIラインでバイトを送信する送信バッファーと、SPIバスのMISOラインからバイトを受信する受信バッファーがあります。
受信バッファーにデータを表示するには、一部のデータが送信バッファーから送信されている必要があります。同様に、送信バッファーからデータを送信すると、データは受信バッファーに表示されます。
送信書き込みと受信読み取りのバランスに注意しないと、受信バッファで何が期待できるかわかりません。受信バッファがオーバーフローすると、データは通常、流出して失われます。
したがって、1バイトのオペコードと3つのアドレスバイトである読み取りコマンドを送信すると、最初に4バイトの「ガベージ」がSPIマスター受信バッファに受信されます。これらの4バイトのゴミは、オペコードと3つのアドレスバイトに対応しています。それらが送信されている間、フラッシュはまだ何を読むべきかわからないため、4ワードのゴミを返します。
これらの4ワードのガベージが返された後、受信バッファーで他のものを取得するには、読み取りたい量と等しい量のデータを送信する必要があります。オペコードとアドレスの後は、何を送信するかは関係ありません。SPIフラッシュから受信バッファーに読み取りデータをプッシュするのは単なるフィラーです。
最初に返された4つのガベージワードを注意深く追跡しなかった場合、それらの1つ以上が返された読み取りデータの一部であると考えるかもしれません。
したがって、実際に受信バッファーから何を取得しているのかを知るためには、バッファーのサイズを知っていること、バッファーが空であるかいっぱいであるかを知る方法(通常、これを報告するためのステータスビットが登録されている)を把握し、その方法を追跡することが重要です送信したものと受信した量。
SPIフラッシュ操作を開始する前に、受信FIFOを「ドレイン」することをお勧めします。つまり、受信バッファのステータスを確認し、まだ空でない場合は空にします(通常、受信バッファの「読み取り」を実行して行われます)。通常、すでに空の受信バッファを空にする(読み取る)ことで害はありません。
次の情報は、SPIフラッシュのデータシートのタイミング図から入手できますが、ビットを見落とす場合があります。すべてのコマンドとデータは、SPIバスを使用してSPIフラッシュに発行されます。SPIフラッシュを読み取るシーケンスは次のとおりです。
1) Start with CS_ high.
2) Bring CS_ low.
3) Issue "Read" op code to SPI Flash.
4) Issue three address bytes to SPI Flash.
5) "Receive" four garbage words in Receive Buffer.
6) Transmit as many arbitrary bytes (don't cares) as you wish to receive.
Number of transmitted bytes after address equals size of desired read.
7) Receive read data in the Receive Buffer.
8) When you've read the desired amount of data, set CS_ high to end the Read command.
If you skip this step, any additional transmissions will be interpreted as
request for more data from (a continuation of) this Read.
ステップ6と7は、読み取りのサイズと受信バッファーと送信バッファーのサイズに応じて、インターリーブして繰り返す必要があることに注意してください。一度に多数のワードを送信すると、受信バッファーが保持できない場合、データが流出します。
ページプログラムまたは書き込みコマンドを実行するには、次の手順を実行します。ページサイズ(通常256バイト)およびセクターサイズ(通常64K)および関連する境界は、使用しているSPIフラッシュのプロパティです。この情報は、フラッシュのデータシートにあるはずです。送信バッファと受信バッファのバランスの詳細については省略します。
1) Start with CS_ high.
2) Change CS_ to low.
3) Transmit the Write Enable (WREN) op code.
4) Switch CS_ to high for at least one SPI Bus clock cycle. This may be tens or
hundreds of host clock cycles. All write operations do not start until CS_ goes high.
The preceding two notes apply to all the following 'CS_ to high' steps.
5) Switch CS_ to low.
6) Gadfly loop: Transmit the 'Read from Status Register' (RDSR) op code and
one more byte. Receive two bytes. First byte is garbage. Second byte is status.
Check status byte. If 'Write in Progress' (WIP) bit is set, repeat loop.
(NOTE: May also check 'Write Enable Latch' bit is set (WEL) after WIP is clear.)
7) Switch CS_ to high.
8) Switch CS_ to low.
9) Transmit Sector Erase (SE) or Bulk Erase (BE) op code. If sending SE, then follow
it with three byte address.
10) Switch CS_ to high.
11) Switch CS_ to low.
12) Gadfly loop: Spin on WIP in Status Register as above in step 6. WEL will
be unset at end.
13) Switch CS_ to high.
14) Switch CS_ to low.
15) Transmit Write Enable op code (again).
16) Switch CS_ to high.
17) Switch CS_ to low.
18) Gadfly loop: Wait on WIP bit in Status Register to clear. (WEL will be set.)
19) Transmit Page Program (PP = Write) op code followed by three address bytes.
20) Transmit up to Page Size (typically 256 bytes) of data to write. (You may allow
Receive data to simply spill over during this operation, unless your host hardware
has a problem with that.)
21) Switch CS_ to high.
22) SWitch CS_ to low.
23) Gadfly loop: Spin on WIP in the Status Register.
24) Drain Receive FIFO so that it's ready for the next user.
25) Optional: Repeat steps 13 to 24 as needed to write additional pages or
page segments.
最後に、書き込みアドレスがページ境界(通常は256バイトの倍数)になく、次のページ境界を越えるのに十分なデータを書き込んだ場合、境界を越えるはずのデータがページの先頭に書き込まれます。プログラムのアドレスが低下します。したがって、アドレス0x0FEに3バイトを書き込もうとすると、最初の2バイトは0x0feと0x0ffに書き込まれます。3番目のバイトはアドレス0x000に書き込まれます。
ページサイズより大きい数のデータバイトを送信する場合、最初のバイトは破棄され、最後の256(またはページサイズ)バイトのみがページのプログラミングに使用されます。
いつものように、上記のエラー、タイプミス、見落とし、または混乱の結果、またはそれをどのように使用するかについては責任を負いません。