使用機器:SPI4Wモジュール内蔵マスターコントロール、SPI Falsh、ロジックアナライザ。
何?SPI4W とは何ですか?
そうですね...誰もが SPI プロトコルに精通しています。シリアル ペリフェラル インターフェイス、シリアル ペリフェラル デバイス インターフェイス、4 線式システムを使用し、インターフェイスには CLK、CS、MISO、MOSI があり、入力と出力が同時に存在できます。の1セットと言えます。
まず誤解を解いてみましょう。SPI は必ず 4 線式システムなのでしょうか?
SPI バージョンは非常に混乱しており、絶対的な標準プロトコルはありません。本質的に違いはありませんが、複数のバージョンがあり、そのうちの 1 つは CLK、CS、および SDA インターフェイスを備えた 3 線システムであり、この SDA ラインは同時に MISO または MOSI としてのみ使用できます。
何?この例は十分説得力がありませんか?
次に、珍しいものであるSPI4Wを見てみましょう。
これは SPI とは大きく異なる機能モジュールです。明らかに、私が話していることは大きく異なります。こいつはゲーム開始設定でCS, CLK, D0, D1, D2, D3の6本の信号線を持っていますが、CS, CLK, MOSI, MISOに絶対的な制限はなく、実際には各線D1, D2, D3, D4 は MISO または MOSI に多重化できます。
最初にランダムなカードが与えられますが、SPI であっても SPI4W であっても、必要な CLK と CS は 1 つだけなので、開発者がこのように設定するのは何の役に立つでしょうか。
確かにそうです。
SPI4W の主な目的は、送信データの幅を自由に拡張することであり、ビット幅の違いにより、1 ビット モード、2 ビット モード、4 ビット モードが派生します。
1bit モード: 1bit である理由は、入力と出力の両方が 1 つの信号線のみを占有し、データ幅が 1bit であるためです。
(1)CS、CLK、SDA(入力、出力)
(2)CS、CLK、SDI、SDO
2bit モード: 2bit である理由は、入力と出力の両方が 2 つの信号線のみを占有し、データ幅が 2bit であるためです。
CS、CLK、SDA0、SDA1
4bit モード: 4bit である理由は、入力でも出力でも 4 本の信号線を占有し、データ幅が 4bit であるためです。
CS、CLK、SDA0、SDA1、SDA2、SDA3
ねえ、なぜ 3 ビットモードがないのですか? ハードウェアがサポートしていない限り、SPI4W モジュールに 3 ビットが含まれることはほとんどありません。
ではなぜ 1bit モードで 2 つの配線方法があるのかというと、このモードでは
(1) 1 つの SDA を入力と出力の両方として使用できます。
(2) 1 ビット幅の設定を変更せずに、一方の SDA0 を入力、もう一方の SDA1 を出力として使用できます。
この2つの方式も有名で、(1) 2 線式モードと呼ばれます。(2) 3 線式モードと呼ばれます。
私たちの大学で見たSPIは、実際にはSPI4Wの1ビットモードの3線式モードです。
二人の関係性が分かりました。もう一度見てみましょう。
兄貴分の SPI4W であっても、弟分の SPI であっても、実装するには次の 2 つの方法しかありません。
1 つは、SPI モジュールがハードウェア内に準備されているため、対応する SPI 波形を送信するために対応するレジスタを設定するだけでよいということです。
1 つは、ハードウェアには何もなく、IO ポートを使用して対応する SPI 波形を素直にシミュレートすることしかできないことです。
私が使用したマスターコントロールには既に SPI4W モジュール機能が備わっていたので、最初のものを使用することにしました。
イネーブル レジスタ、データ レジスタ、アドレス レジスタ設定、その他の初期化設定など、似たような設定がインターネット上にたくさんあるため、ここでは説明せず、インターネット上の珍しい設定についていくつか説明します。
次のコマンドとフラッシュのパフォーマンスはすべて、例として使用している P25Q80H に基づいています。
常に最初の一歩。
SPI 波形において、データがどのタイミングで有効であるか、どのタイミングでサンプリングされるかはすべてタイミング モードの設定に関係しており、これは SPI4W プロトコルを設定する最初のステップでもあります。
タイミング モード設定には、モード 0、モード 1、モード 2、モード 3 の 4 つのモードがあります。
どちらがサポートされるかは、マザーボード モジュールの面と SPI プロトコル チップによって異なります。
マスター コントロールが 4 つのタイプすべてをサポートしているが、SPI フラッシュがモード 0 とモード 3 のみをサポートしている場合、これら 2 つのタイプしか使用できません。パーティ A が父親であるため、方法はありません。
これら 4 つのモードのタイミングはどのようなものですか?
ドアを閉めて画像を表示します。以下はモード 0 とモード 3 の波形です。
アイドル状態の初期状態とサンプリング時点の 2 点に注意してください。
モード 0 を例に挙げます。
(1) アイドル状態では、SCLK は Low です。
(2) 立ち上がりエッジでサンプリングされたデータは有効なデータです
SPI4W プロトコル モジュールのレジスタを設定する場合、これらの 2 点を設定するだけで済みます。その後、タイミング シーケンスの動作モードが決定され、SPI の内部モジュールでは内部がアイドル状態で自動的に Low になります。この状態で立ち上がりエッジサンプリングが行われます。
モード 3 を使用したい場合は、次のことも可能です。
(1) アイドル状態では、SCLK はハイレベル状態です。
(2) 立ち上がりエッジでのサンプリング
データの受信にはCLKも必要です
手持ちの CPU があるかどうかに関係なく、SPI4W 送信プロセス中、クロック生成は常に生成されるわけではなく、コマンドまたはデータを送信するときにのみ生成されます。SPI4W モジュールが構成されている限り、アプリケーション開発者は必要な CLK を送信するだけで済みます。同時に内部でも自動的に送信されますが、この点は開発ボードでもFPGAでも変わりません。
異常がある可能性があるのは受信です。クロック CLK が存在する場合にのみデータ送信が行われるため、この時点では受信状態にあるため、一部の SPI4W モジュールはデータを受信する直前に自動的に CLK を送信しません。
では、これをどのように判断するかというと、簡単です。ロジック アナライザーで取得することでわかります。データ受信フェーズ中に CLK 信号がキャプチャされたかどうかによって決まります。
キャッチできない場合は、自分で手動で CLK を送信する必要があります。方法は非常に簡単です。受信状態では、1 つのデータ (1 バイトでも 2 バイトでも構いません) を自由に送信できます。関係ないよ。この時は受信状態なので実際には送信データは送出されずCLKのみが送出されるので、これをロジックアナライザでキャッチすると送出された信号を一切キャッチすることができません。この状況では、受信したデータのみがキャプチャされます。
送信されたコマンドの整合性
私が使用する 25AAxxx フラッシュを例として、いくつかのコマンドを示します。
1ビットモードに対応したシングルチャネル書き込み動作コマンド——Page Program(0x02);
2ビットモードに対応したデュアルチャネル書き込み動作コマンド—デュアルページプログラム(0xA2)。
4ビットモードに対応した4チャネル書き込み動作コマンド - Qual Page Program (0x32);
false マニュアルには、これらのコマンドを送信する前に Write Enable (0x06) コマンドを送信する必要があると明確に記載されています。
次に、次のようにします。
CS をプルダウンする—0x06 コマンドを送信—CS をプルアップする—CS をプルダウンする—0x02/0xA2/0x32 を送信—
上記コマンド送信手順を1つ省略するとデータが不正になります。
CS を引き下げた瞬間からフラッシュが動作し始め、有効になります。
これは注意が必要な点につながります。CS を有効にする前に、必ずすべての SPI4W モジュールを設定してください。そうしないと、SPI4W レジスタ設定によって引き起こされるすべてのピン レベルの遷移がフラッシュによって入力信号として使用され、考えられるエラー波形が生成されます。
状況の問い合わせの必要性。
Page Program (0x02)、Dual Page Program (0xA2)、および Qual Page Program (0x32)コマンドを使用して書き込み操作を行う場合、各処理には一定の実行時間が必要です。
注意: プログラムタイプのコマンドの場合は、書き込む前に必ず消去してください。
ページプログラムの動作時間は一般的に 2ms、最大でも 3ms です。
さまざまなコマンドの処理にどれくらいの時間がかかるかは、使用するフラッシュのマニュアルによって異なります。
通常の状況では、ある程度の遅延が追加され、生き残るのに必要な時間が経過した後に次のステップを実行できます。
各コマンドの実行にかかる時間を統一することは不可能なので、遅延可能関数は結局のところ最も安全な方法ではありません。最も安全な方法は、ステータス レジスタ RDSR をクエリすることです。
そうです。ページプログラム処理が実行されると、ステータスレジスタの一部のビットの値が変化します。最も正確な基準は、そのビットの値が変化したかどうかです。
正確にどのビットが変更されるのでしょうか?
コマンドのタイミングと、次の 2 つのステータス レジスタの関連ステータス ビットを見てみましょう。
(S1) WEL と (S0) WIP は 2 ビットであり、ページ プログラムの実行中に、フラッシュがライト イネーブルを認識すると、WEL は 1 に設定され、プログラム コマンドが認識されると、WIp は 1 に設定されます。 1に設定します。
プログラム動作が完全に完了した場合にのみ、これらの 2 ビットはクリアされます。
したがって、一定の遅延の後、これら 2 ビットがクリアされているかどうかを確認できます。クリアされている場合は、プログラム プロセスが実行されたことを意味します。
このように遅延機能が全く不要な場合もありますが、この場合はこの 2 ビットの状態を 0 になるまで問い合わせ続ける必要があります。
ページプログラム以外にもデュアルプログラム、クアルプログラム、イレーズなどのコマンドがあり、レジスタを問い合わせて処理が実行されたかどうかを確認するのも良いでしょう。
ちょっと寒い知識もありますが、一部のフラッシュの WEL ビットのデフォルト状態は 1 であり、コマンド操作が完了しても状態は 1 のままなので、手間を省くためにはステータス レジスタだけで十分ですWIPビットを判定します。
ビット幅の表現
冒頭でも述べたように、SPI4Wはデータ伝送のビット幅を任意に変更できるのですが、具体的にはどのような表現になるのでしょうか?
1 ビット モードでは、8 つの CLK で 8 ビット データ (1 バイト) を伝送できます。
2 ビット モードでは、8CLK で 2 バイトのデータを伝送でき、1 バイトのデータを受信するのに必要な CLK は 4 つだけです。
4 ビット モードでは、8 つの CLK で 4 バイトのデータを伝送でき、1 バイトのデータを受信するのに必要な CLK は 2 つだけです。
ほとんどの CPU が設計されるとき、 1 ビットでも問題ありませんが、2 ビットでは少なくとも 2 バイト、4 ビットでは少なくとも 4 バイトのデータを送信する必要があるため、1 回の送信に8 CLk を構成する必要があります。
保護機構
フラッシュの保護メカニズムは 2 つの側面にすぎません。
外部保護メカニズムは、WP ピンに対応するレベルが与えられている限り、書き込み保護メカニズムをアクティブにすることができ、一度アクティブになると、すべての設定とコマンドが正しい場合でも書き込みできなくなります。ただし、アクティブハイレベルかローレベルかは、特定のフラッシュスタイルによって異なります。
内部保護メカニズム。BP4、BP3、BP2、BP1、BP0 が 1 に設定されると、内部保護メカニズムがアクティブになります。
これらは見覚えがあるでしょうか。
ステータス レジスタの S2 ~ S6 ビットであり、保護メカニズムを解決する鍵は、これらのビットをゼロにクリアすることです。
これらの値をクリアするには、ステータス レジスタ書き込みコマンド (WRSR) を直接使用します。
作業頻度が成功の鍵です
フラッシュが正常に動作するかどうかをテストするだけの場合は、通常、より低い動作周波数を使用しますが、まったく問題ありません。
アプリケーションが動作すると、メインコントロールとペリフェラルが耐えられる最大動作周波数を把握するために、動作周波数の増加が必要なプロセスになります。
低周波テストが正しければ、低周波では完全に無視されていた多くの詳細が高周波では露出し、あらゆることが起こります。
周波数のデバッグは頭の痛い問題ですが、構成が正しく、プログラムが正しいことを確認したら、周波数の観点から問題を探すことができます。
高周波下で最初に露出されるのは順序です。
各コマンドは、サポートされている周波数で有効である必要があります。私が使用するフラッシュを例に取ると、最終的にサポートされる周波数は 104M です。高周波数モードで使用できるコマンドには、FAST READ、RDSFDP、PP、SE、BE32K、CE が含まれます、WREN、RDSRなど
低周波数コマンドは低周波数のみを実行できますが、高周波数コマンドは高周波数と低周波数の両方を実行できます。
怒らないでください。消費電力を低く抑えるために、高頻度のコマンドを使用して低頻度で実行してください。
高周波での 2 番目の露出は SPI 波形です。
以下はモード 0 でロジック アナライザーによってキャプチャされた波形です。
一見すると波形がおかしいことがわかりますが、モード0では立ち上がりエッジをサンプリングしており、本来サンプリングすべきDI信号が立ち上がり瞬間を「完全に」避けた波形となっています。 、おそらくボールです。
後で、DI 信号が少し前にシフトできる限り、波形は正しいことがわかりました。
そうすると、その理由は明らかで、フラッシュの応答が高周波のリズムに追いつかないためです。このような状況に直面して、多くの場合、SPI モジュールには高周波修復機能が組み込まれています。オフセット ビット補正の場合、このレジスタを見つけて 2 番目のビット修復機能を有効にするだけで済みます。
この修復モジュールを実際には持っていないのに、まだエラーが発生しています。どうすればこれを解決できますか?
あはは、SPI モジュールの製造時には、高周波状況がその適用範囲内にない可能性があります。
「では、キャプチャした波形は確かにシフトしていますが、Flash は正常に動作します。何が起こっているのですか?」と疑問に思う人もいるでしょう。
申し訳ありませんが、おめでとうございます。信号のキャプチャに使用したロジック アナライザーに問題があります。高周波信号のキャプチャをサポートできない可能性があります。高周波キャプチャをサポートするロジック アナライザーに変更できます。 。
次に、高周波をサポートできるものに変更しますが、キャプチャされた波形は依然として間違っています。別の方法を試すこともできます。
ロジックアナライザーのトリガー電圧を下げるだけです。
なぜこれを試す必要があるのか、その理由は次のとおりです。
チップの信号取得は、CLK の立ち下がりエッジから次の立ち上がりエッジまでの時間であり、tCLQV として記録されます。
それはサンプリング時間として理解できます。
これは重要な時間パラメータであり、この間にデータが書き込まれ、立ち上がりエッジが来るとデータを読み出すことができます。
この期間の具体的な時間は、最新のマニュアルに明確に記載されており、コンデンサの違いによると、その時間値は約 6 ~ 7ns です。
したがって、実際にキャプチャされた tCLQV を測定できますが、今回測定できない場合は問題があります。
ナナ…どうやって測るの?
えー、この金額ですね。
ロジック アナライザでキャプチャされた波形は実際には電圧ですが、それを Low から High に引き上げる過程で、高周波の周波数が速すぎるため、High に引き上げられる前に tCLQV 時間が経過してしまいます。
ここで誤解があります。周波数が速いということではなく、周波数を引き上げるプロセスが速いのです。たとえば、ハイレベルは 3.3V ですが、周波数がどんなに速くても、0 から引き上げるのに必要な時間はかかります。ハードウェア上の 3.3V への変更はまだその時点であり、周波数の最も迅速な変更は、tCLQV 時間の短い範囲を短縮することです。
この範囲では、ハードウェアレベルがプルアップされるまでの時間が経過します。
そのため、3.3V トリガーを 2.0 または 1.6V トリガーに変更するなど、トリガー レベルを変更する必要があります。その目的は、ハードウェアがレベルをプルアップするのに必要な時間を短縮し、プルアップのプロセスが完了するようにすることです。 cCLQV 時間内に。