Dram(10) MCUとFPGAがSPIで通信


 FPGAのピン制限により、マイコンとFPGAの通信にSPIを使うことになりました。
 マイコンにはSPIは搭載されています。しかし、FPGA用の適切なSPI関数が見つからないので、作ることにしました。

●構成と概要

 ハードウエアの構成とマイコンのSPIインタフェースを次に示します。
 何となく、マイコン側がSPIのHostになっています。
 SPIインタフェースは、マイコンのSPIインタフェースに合わせて、クロックの立下りでデータの切替、クロックの立ち上がりでデータの取り込みです。

 







●マイコンSPIインタフェースの詳細

 SPIを説明した記事や、Webの説明、SPIインタフェースを使ったメモリー等のデバイスの説明を読んでもタイミングがイマイチ判りません。
 特に判らなかったのは、MOSI信号です。MOSI信号を、一旦レジスタで受ける必要が有るかです。 
 ある説明書では、ホスト側とデバイス側のシフトレジスタが一体で、同じシフトクロックでシフトするので、レジスタは不要と有ります。
 しかし、ホストとデバイスは、別々のICなのでシフトクロックに微妙なズレは発生するのではと、悩みました。

 時間を浪費したアホな悩みでした。データシートを見たら解が有りました。基本を忘れていました。

 データシートには、次の事が書かれています。
 ・クロックの立下りで、「データ出力遅延時間」後データが切替る。
 ・クロックの立ち上がる「セットアップ時間」以前から「ホールド時間」後の間データは確定してる必要がある。

 これで悩みは解消です。すなわち、一旦レジスタで受ける必要が有ります。
 これで、少し詳細なタイムチャートを作りました。回転させていますので見難いですが、細かい処まで見えると思います。










 次は、前半部分のタイミングです。Spiシフトデータレジスタは、下がLsbで上がMsbです。動きを追います。
 @チップセレクトが無効で、ビットカウンタをリセットします。
 Aビットカウンタがゼロで、クロックの立下りでMcuに送るデータSpiシフトデータレジスタに取り込みします。
 Bクロックの立ち上がりでデータを一旦レジスタで受けと、ビットカウンタを+1します。
 Cクロックの立下りで一旦レジスタで受けたデータを、Spiシフトデータレジスタにシフトインします。
 Dクロックの立ち上がりでビットカウンタを+1らカウント値が「8」になれば、Spiシフトデータレジスタに1バイトのデータが受信したので、
  そのデータを他のレジスタの格納します。







●動作結果

 マイコンをマスタにして動作させた動作を次に示します。タイムチャートを同じ波形が得られました。






ホームへ戻る