SPIフラッシュメモリに書き込む方法を教えてください。


9

SDカード(ArduinoのWaveshield)にオーディオデータを保存する代わりに、SPIフラッシュメモリICに保存し、MCU、DAC、アンプを搭載した独自のボードをロールするオーディオアプリケーションに取り組んでいます。

Winbond W25Q80BVSSIGを使用しています。

私が使用してAVRをプログラミングするとかなりよく知っているAVRISP mkIIのUSBTinyを、同じプログラマで行わフラッシュにデータを書き込んでいますか?特にSPIフラッシュメモリプログラマーを探しているときには、何も見つかりませんでした。

この質問はのフォローアップで、この1


PCから何かを簡単に実行できるプログラマーがいるかどうかはわかりませんが、回路にCPLDが含まれている場合は、フラッシュメモリにデータを書き込むように構成できます。
deed02392

私は今、spiフラッシュモジュールは、CPUがほとんどのPCで使用するファームウェア/ BIOSを格納するように設計されていると思います。堅牢なストレージデバイス用ではありません。
マーシャルクラフト

回答:


12

マイクロコントローラーが実行中に使用するためにマイクロコントローラーが読み取る「プリロードされた」データでWinbond SPIフラッシュをプログラムする方法を単に探している場合、調べたいのはインサーキットプログラミングを実行できるプログラマーです。 SPIフラッシュチップの。これは、インシステムプログラミング(ISP)とも呼ばれます。

1つの選択肢は、DediProgプログラマーです。。ボードを正しく設計すれば、このUSB接続デバイスは回路内でプログラムできます。ボード上の別のプログラミングヘッダーで設計する必要なく、SOW-16パッケージに取り付けることができるアダプタークリップも販売しています。DediProgには、回路内で使用するための正しい設計に役立つアプリケーション情報速報があります。設計の主な戦略は、SPIプログラミングポッドのドライバーと干渉しないように、MCUシステムのSPIインターフェイスドライバーを分離する簡単な方法を見つけることです。これを行う最も簡単な方法は、MCUとSPIフラッシュの間のMCU駆動ラインに直列抵抗を配置することです。プログラマーは、直列抵抗のSPIフラッシュ側に接続します。代替方法には、駆動されるインターフェイスラインにMUXまたはアナログスイッチを追加することが含まれます。さらに賢いスキームは、「

ここに画像の説明を入力してください

考慮すべき2番目の選択肢は、ASIXのUSBプログラマーです。Prestoは、SPIフラッシュデバイスを含むさまざまなタイプのSPIおよびI 2 Cデバイスを実行できます。Atmel MCUおよびさまざまなタイプのSPIフラッシュデバイスをプログラミングするためのこれらのデバイスの1つがあります。これは、上記のユニットよりも費用対効果の高いソリューションですが、それほど柔軟ではありません。Forteと呼ばれるより高価なデバイスは、より多くのターゲットインターフェイスピンを備えているため、より多くのことができます。

ここに画像の説明を入力してください

場合によっては、プログラミングヘッダーを追加せずにプログラマをターゲットボードに接続できると便利なことがあります。これに対する1つの素晴らしい解決策は、TagConnectと呼ばれる会社によって定義され特別なフットプリントに小さなパッドのセットを配置することです。彼らは、ボード上の特別なフットプリントに接続するポゴピンを備えた一連のクイックコネクトプログラミングケーブルを製造および販売しています。さまざまなアプリケーションに適合するケーブルの6ピン、10ピン、および14ピンバージョンがあります。ケーブルのコストは非常に合理的です。

ここに画像の説明を入力してください


これはとても役に立ちます。最終的なPCBにはんだ付けする前に、フラッシュメモリをプログラミングすることを計画しています。これまでのところ、MCUでこれを実行してきました。PCBにISPピンを提供することが良いアイデアであるかどうかは未定です。完了すると再プログラムされることはないためです。
JYelton 2013年

1
@JYelton-私の経験では、いくつかの理由でISPを計画することは良い考えです。ECO(Engineering Change Orders)は、製品サイクルの現実です。本番環境に入ると、誰かまたは何かがFlashコンテンツの変更を要求します。フラッシュチップは、回路内の予期しないノイズ障害の影響を受けやすく、その内容が損なわれることがあります。ISPを提供するもう1つの理由。
マイケルカラス2013年

1
バンドルされたアダプタケーブルを介してこれらのプログラマのほとんどと互換性のある「標準」ヘッダーはありますか?2x4と2x5のピンヘッダーにさまざまなピン配置が表示されています。flashrom.org/ Supported_hardware
kert

誰もが合理的な自分の考えを持っています。タグ接続ケーブルは$ 35〜$ 40です。
2015年

1
@markrages-ただし、特定の開発ラボまたは工場のプログラミングステーションでは、ケーブルを1本購入するだけで済みます。すべての製品に必要なわけではありません。さらに、これらのケーブルは、コネクタなしでISPを使用できるように独自のポゴピン固定具を転がそうとするよりもはるかに安価です。
Michael Karas

8

MCUを経由せずにバス海賊でそれを行うことができるに違いない...それにより、SPI、I2C、またはUART通信を使用してチップに対して直接任意のシリアルインタラクションを実行できます。それを「スクリプト化」するには少し労力がかかるかもしれませんが、おそらくあなたはその仕事をすることができるでしょう。

I2Cを介してEEPROMを直接ロードするための専用のツールも見ましたが、フラッシュや特にSPIはありません。


どうやら(どうやら)メソッドが爆破されたものに書き込むのが不明瞭かを考えると、私のSPIフラッシュの選択が良いものかどうか疑問に思い始めています。
JYelton

1
それには、いくつかの深刻なスクリプトが必要になりますが、とにかく良いアイデアです。私の好みのために少し複雑に。たぶん、あなたはSDカードを検討する必要がありますか?次に、コンピューターで読み取り、書き込みを行うだけです
chwi

現在のプロトタイプは、ArduinoとWaveshield(SDカードリーダーを搭載)を使用しています。SDカードから離れたいのですが、コストが低く(リーダーとカードが不要)、改ざんの防止効果も高いと思います。
JYelton

7

他のツールがSPIを直接そのようなチップと通信することは聞いたことがありません。「すべての」チップは異なる操作に対して異なる呼び出しを必要とするため、不可能だと思います。

チップには、書き込み、読み取り、セクター、データサイズの変更などのSPI呼び出しが必要です。データシートの「7.2命令」の章で、送信できるすべてのSPIコマンドを確認できます。したがって、すべての外部フラッシュメモリには同じ命令セットがないため、このアプリケーション用にカスタマイズされたアプリケーションを作成する必要があります。

編集:フォローアップであるため、私は本当にAtmels独自のSPIフラッシュメモリの1つをお勧めします。なぜなら、それらのほとんどはすでにオープンで利用可能なコードを書いているからです。見てみると、このポストからAVRFreaksは Atmels AT45xxxxシリアルフラッシュチップのいくつかのコードを提供します。


私があなたを正しく理解していれば、私のMCU用のプログラムを書いて、データをフラッシュメモリに書き込む必要がありますか?問題は、MCUのメモリが外部フラッシュよりも少ないことです。そのため、いくらか途方に暮れています。
JYelton

はい。コンピューターのシリアルラインからUARTを使用してデータを送信し、フラッシュに書き込むことができます。また、MCU用のいくつかのプログラムを作成して、一度にいくつかのブロックをフラッシュにプログラミングすることもできます。これは、かかる少し時間がかかるかもしれないが、それはあなたが正しく変更セクタのトラックを保持などの外部フラッシュが長いように消去得ることはありませんので、動作します
chwiを

2
これが正解です。したがって、チャンクをMCUにダウンロードし、それをフラッシュに書き込むためのプログラムがPCに必要です。エラーチェックがあり、PCで新しいプログラムを作成する必要がない場合に役立ちます。XMODEMまたは同様のコードを見つけることをお勧めします。
pjc50

@ pjc50 ... '正解'の宣言はそれほど速くありません:)
vicatcu

実際、多くのプログラマはフラッシュメモリをプログラムできます。そして、atmelマイクロで使用される一般的なプログラミング方式の1つは、そもそもSPIにかなり近いです。
Chris Stratton、

4

組み込みコンピュータから約30ドルで「FlashCAT」プログラマを購入しました。USB経由でPCに接続し、Winbondフラッシュメモリにファイルを書き込むのは驚くほど簡単でした。他の答えのメソッドとプログラマーはおそらく同じくらい優れていて、いくつかはより高価であるかDIYですが、これは私が求めていたものに合う安価でシンプルな方法です。

これがセットアップの写真です:

FlashCATによるプログラミング

FlashCATプログラマは左側にあり、USBに接続されています。(JTAGではなく)SPIプログラミングファームウェアを実行し、フラッシュメモリに電力を供給しています。供給電力はジャンパーで選択可能(3.3Vまたは5V)。

複数のチップを簡単にプログラムできるように、ブレッドボードにSOIC-DIPソケットがあります。(ブレッドボード上にある別のフラッシュメモリICも確認できます。)

FlashCATソフトウェア

私はまだオーディオファイルを適切なバイナリ形式に変換していませんが、上の図のように、テストのためだけに211KBのWAVファイルをメモリに書き込みました。それを読み戻して新しいファイルとして保存し、名前を.wavに変更すると、PCで正しく再生されます。

次のステップは、ファイルを適切にエンコードし、データを読み取ってDAC経由で送信するAVRソフトウェアを作成することです。

免責事項:私は組み込みコンピュータとは関係がありません。私は安価なものを選び、製品の体験に関する情報を共有している顧客です。


4

ちょっと議論に遅れましたが、検索後にそれを読んでいる人にとっては……。

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(またはページサイズ)バイトのみがページのプログラミングに使用されます。

いつものように、上記のエラー、タイプミス、見落とし、または混乱の結果、またはそれをどのように使用するかについては責任を負いません。


「SPIフラッシュ操作を開始する前に、受信FIFOを「ドレイン」することをお勧めします。これは、受信バッファのステータスを確認し、受信バッファを空にすることを意味します(通常は、受信バッファの「読み取り」を実行して行われます)。すでに空です。通常、すでに空の受信バッファを空にする(読み取る)ことは害を及ぼしません。」受信バッファーのステータスを読み取り、受信バッファーを空にするために必要な手順は何ですか?

3

ここにあるいくつかのステートメントとは逆に、風変わりなSPI PROMがいくつか出回っていますが、選択したものを含め、さまざまなSPI PROMが使用するいくつかの標準的な命令もあります。

vicatcuがすでに述べたように、SPIを直接プログラムできる優れた「ビットバッシュ」ケーブルが利用可能です。信号に関しては、SPIはJTAGによく似ているので、インターフェイスがオープンソースであれば、どんなビットバッシュタイプのケーブルも使用できるはずです。フラッシュの内部プロトコルはかなり単純です。

私たちは、FPGAボード(256M-2G)を起動するために、お探しのパーツの兄貴を使用しています。アドレス指定には、ストレージボリュームを処理するための追加バイトがありますが、それ以外のコマンドは基本的に同じです。

使用しているPROMのタイプは、セクターごとに消去してから、ページごとにプログラムする必要があります。読み取りは書き込みよりも大幅に高速です(私たちが使用しているものの場合、プログラミングには30分かかりますが、PROM全体の読み取りには108MHzで1秒もかかりません)。

今のコマンドのために:がある方法より実際にそれらをプログラムするのに必要とされるよりも、これらのデバイスで使用可能なコマンド。実際に必要なのは次のものだけです。

  • RDID(IDの読み取り)-より複雑な処理を行う前に、PROMと信号を確認するだけです。
  • WREN(書き込み可能)-すべての書き込みの前に必要です。
  • PP(0x02-ページプログラム)-ページのプログラムに必要。
  • SE(0x20-セクター消去)-セクターのビットを「1」に戻します。
  • RDSR(0x05-ステータスレジスタの読み取り)-消去/書き込みサイクルを監視するために必要。
  • FREAD(0x0B-高速読み取り)-PROMデータを読み取り、書き込みを確認します。

詳細については、ザイリンクスFPGAのSPIプログラミングに関する回答をウェブサイト(http://www.xilinx.com)で参照してください。FPGAがこれらのデバイスから起動できるように、コマンドのサブセットが削減されています。

私は自分のプログラマーが私が利用できるものに基づいてこれを行うように設計し、Pythonでプログラマースクリプトを記述しましたが、ケーブルを使用して同じことを行うことができます。あなたの場合、Michael Karasが示唆するように、MCUを介して間接的にすべてを行うことを真剣に検討します。MCUからPROM全体を一度にプログラムする必要はありません。セクターごとにプログラムできます。


2

プログラミングの変更に慣れている場合は、ターゲットMCUの代わりにUSBtinyを再利用してフラッシュメモリをプログラミングできるはずです。ただし、MCUとフラッシュの両方をプログラムするのに十分な汎用性を持たせるのに十分なメモリがない場合があります。

ATTINYとSPIの両方のフラッシュを備え、すぐに利用できる「プログラマー」としてArduinoとして使用するプロジェクトのボードをどこかに持っています。ISPスケッチのわずかな変更を使用してavrdudeでMCUをプログラムし、カスタムユーティリティがスケッチを特別なモードにしてデータのブロックをSPIフラッシュに書き込むシーケンスを送信します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.