ATmega32u4との二重SPI主装置

私の設計では、2つのスレーブSPIデバイスを同時に制御するという予期しないニーズが発生しました。最初はもちろん、SPIバスを通常通りに使用し、両方のデバイスを/ CSピンを使用して制御することを計画していました。

今日のデバイスAのデータシートを確認すると、すべてのデータが一度に必要になることがわかりました。つまり、当初計画していた手順を実行することはできません。

1)機器Bを選択 2)Bからデータを読み込む 3)装置Bの選択を解除します 4)機器Aを選択 5)Bからデータを書き込む 6)装置Aの選択を解除します 7)Bからの全てのデータがA(約1.1Mビット)に行くまで繰り返す。

デバイスAは、その/ CSがハイになったときにデータストリームの終わりであると見なします。もちろん、データが大きくなってしまうので、Bからすべてを一度に読み込んでMCU RAMに格納することはできません。

当然のことながら、次に思いついたのは、2つの別々のマスターSPIを同時に使用することです。両方のチップを選択し、Bからバイトを読み取り、すぐにAに送ります。

だから私の質問は:

a)ATmega32u4を使用してそれは可能ですか?それは全体的な設計において重要な役割を持ち、他のMCUへの変更は後退するでしょう。

b)USARTが2番目のSPIマスタとして機能できることを私は読みました。それは実行可能で信頼性がありますか?実装するのはどのくらい難しいですか?

c)残念ながら不可能で、MCUを変更しなければならない場合、どれをお勧めしますか。 ATmega32U4のUSB機能は重要です。

d)新しいプロセス(Bからの読み込み、Aへのフィード)は予期しない動作を引き起こす可能性がありますか?私の見解では見えません、私は私が新しいエンジニアであるので念のために尋ねています。

他のアイデアや方向性は大歓迎です。前もって感謝します。

UPDATE In case it plays a significant role, Device A is an FPGA while B is an flash memory. The MCU has a dual role: Download the bitstream from the PC via USB and store it on the flash ROM/use the stored bitstream to configure the FPGA upon reset/power on. Both FPGA and flash use SPI. According to the datasheet of the FPGA (ice40 family, Lattice, "iCE40 Programming and Configuration" p.26), the image has to be programmed without interruption.

1
nl ru de
2つのSPIペリフェラルがありますか?
追加された 著者 icecream,
SPIマスタは、GPIOだけを使用して、純粋なソフトウェアに実装するのがかなり簡単です。
追加された 著者 markpasc,
@ LongPhamはい、ATmega32u4は2つのSPI周辺機器を接続していて、MCUは一方からのデータを取り、それを他方に渡します。
追加された 著者 oneloop,
はい、確かにそれはFPGAです。 MCUには2つの役割があります。PCからUSB経由でビットストリームをダウンロードしてフラッシュROMに保存するか、保存されたビットストリームを使用してリセット/電源投入時にFPGAをコンフィギュレーションします。 FPGAもフラッシュもSPIを使用しています。 FPGAのデータシート(ice40ファミリー、ラティス、 "iCE40プログラミングと設定" p.26)によると、画像は中断することなくプログラムされなければなりません。
追加された 著者 oneloop,
残念ながら、図面はすぐには利用できません。
追加された 著者 oneloop,
はい、あなたは正しく理解しています。現在の回路図ではバスは実際に共有されていますが、私はそれらのラインを再配線することができます。
追加された 著者 oneloop,
SPIを「読み取りA」から「書き込みB」に切り替える前に、MCUをデータの一時記憶域として使用して、AからBへのすべてのデータを取得するためにいくつかの転送が必要になります。フル転送の観点からMCU。さらに、残りのデータを取得するためにSPI読み取りトランザクションを再発行すると、外部デバイスのスレーブは、前回の転送で停止したメモリ内の場所からデータにアクセスすることを認識しません(?)。 「? FPGAの場合はこれを簡単に修正できます。適切な詳細を含む図面を追加できますか?
追加された 著者 CapnJJ,
私はあなたがハイレベルの何かを描くことができることを意味しました、しかし私は理解していると思います。私はこれを理解しているかどうかを確認してください... MCU - USB経由でPC - > FLASH、問題はありません。 FPGAを中断することなくプログラムするためにMCUにローカルに保存するのに十分なメモリ? SPI以外のバスを持つ十分に大きいMCU接続メモリがPCB上にありますか?もしそうなら、多分あなたは2つのステップでFLASH - > FPGAをすることができます。 SPIバスがFPGAとFLASHの間でPCB上で共有されている場合は、独立したマスタでは不十分です。
追加された 著者 CapnJJ,

4 答え

You might want to take a different approach altogether. Instead of attaching both the PROM and the FPGA to the µC as slave devices, attach the PROM directly to the FPGA, and allow the FPGA to boot in SPI master mode instead of SPI slave mode. Bonus: the booting will happen more quickly.

You'll still be able to access the PROM from the µC after the FPGA has booted for firmware updates or data storage, by passing the µC's SPI interface signals through the FPGA logic.

3
追加された
はい、それはうまくいきます。パススルーを提案した主な理由は、必要に応じて、FPGA上のアプリケーションロジックも制御するために、uC上で同じSPIインターフェイスを使用する機会があることです。
追加された 著者 GSerg,
直接接続とは、FPGAにコンフィギュレーションがロードされていないときにMCUがフラッシュをプログラムできることを意味します。また、FPGAに独立したチップセレクトラインを指定した場合、FPGAとSPIフラッシュは2つの独立したSPIスレーブとして動作します。つまり、MCUがFPGAをリセットしてリセット状態に保ち、競合なしにSPIフラッシュにアクセスし、FPGAに新しいコンフィギュレーションをロードさせることができるようにする必要がありますそして、MCUはいつFPGAがコンフィギュレーションをロードし終えたか知ることができるはずです。
追加された 著者 trankvilezator,
ザイリンクスの場合、これらの信号はPROGRAM_BおよびDONEです。ラティス部品上の同等の信号はCRESET_BとCDONEのように見えます。
追加された 著者 trankvilezator,
これは非常に洗練された解決策であり、私はそれを慎重に検討し、そしてついに私はあなたの "修正"バージョンを思い付きました。 FPGAとMCUのデータシートを調べると、明らかに両方のデバイスがHiZのI/Oで起動します。これは、同時にではないにしても、PROMのマスターになり、同じ行を共有できることを意味します。そのため、FPGAとMCUはどちらもHiZの共通ピンで起動し、FPGAはそれ自体をコンフィギュレーションしてそれらのピンを再度非アクティブにします。この後、MCUは自由に更新を実行できます。SPIを有効にし、更新を実行し、そしてSPIを無効にしてそれらのPINをHiZに返します。 (まだテストされていません)
追加された 著者 oneloop,

a)AtmegaにはSPIバスが1つしかありません。

b)経験がない(しかし私は初心者です)

c)私はSTM#2をほとんど使っています。これらは2つのSPIバスを持っています、そしてあなたがより多くを必要とするならば、3つ(またはさらにもっと)を持っているバージョンがあります。最も安い(Arduinoよりも安い)STM32F103C8T6には2本のSPIバスがあります。

d)STM32上のSPIバス(そしておそらく他のucのもの)は独立しているのでプロセスに問題はないはずです。ただし、STM32にはDMAがあるため、「直接」、つまり着信SPIデータを発信SPIに直ちに送信することができます。

2
追加された
頑張ってください(ところで、いくつかのSTM32をArduinoのコードでも使うことができます)。ただし、STM32は原則として複雑さも段階的に向上しています(私はまだ学習中で、初心者です)。
追加された 著者 Spike,
あなたの答えをありがとう、彼らは面白そうに見えます。
追加された 著者 oneloop,

CSがディアサートされると、FPGAはコンフィギュレーションデータの終わりと見なします。タイムアウトもありますか?つまり、CSをアクティブにしたまま無期限に遅延させることができる場合、デバイスは正しく動作しますか?

FPGAデバイスがトランザクションをクローズしないようにする必要があるだけの場合は、フラッシュへのコマンドがゴミデータとして読み込まれないようにしながらCSを選択したままにすることで問題を単純化できます。このため、2番目のSPIマスタが過剰になる可能性があります。

MCUとFPGAの間に MISOMOSI 、および SCLK の各行にバッファデバイスを使用して、SPI信号を無効にすることをお勧めバッファデバイスのリセット/イネーブルピンを使用して。

トランザクションは次のようになります

  1. FPGA用のCSを非同期にアサート
  2. バッファデバイスを無効にする
  3. 通常どおりFLASH端末を読む
  4. バッファデバイスを有効にする
  5. FPGAトランザクション(CSは既にアサートされています)
  6. GOTO 2が完了するまで
  7. FPGAのCSを非同期にアサート解除
1
追加された
提供されている設定に関する文書によると、タイムアウト(p.25)がありますが、マスターモードのみを参照するのか、マスターモードとスレーブモードの両方を参照するのかは完全には明らかではありません。また、データシート全体を見ましたが、実際の時間を見つけることができませんでした。それにもかかわらず、私はこの特定の設計で追加のハードウェアをインストールしない方法を好むでしょう、しかし私は将来の設計のためにそれを心に留めておくでしょう、ありがとう!
追加された 著者 oneloop,

SPIマスタとしてのUSART

データシート第19章で言う、

ユニバーサル同期および非同期シリアル送受信機(USART)は、マスタSPI準拠の動作モードに設定できます。

そのため、スレーブ間でデータを転送するために2つの独立したSPI(マスター)ポートを持つことができます。

I 2 C外部EEPROMを使用する

SPIフラッシュの代わりに、I 2 C EEPROMをMCUのTWIポート(PD0、PD1)に接続することができます。 I 2 CはAtmelではTWIまたは2線式シリアルインタフェースと呼ばれていますが、本質的には同じものです。欠点:EEPROMは一般にフラッシュメモリよりも高価です。

0
追加された
私はFRAM部品を提案するでしょう。それは似たような部品で、通常同じI2Cプロトコルを共有していますが、アクセス時間はEEPROMの典型的な5〜10msではなく100us未満です。
追加された 著者 MaryBeth,