プログラミング理論 - SPI インターフェイス。 プログラミング理論 - SPIインターフェース spi受信

14.03.2024

SPI(シリアル ペリフェラル インターフェイス、シリアル ペリフェラル インターフェイス、バス SPI) - これは、モトローラによって開発された短距離データ インターフェイスです。 データは、マスター/スレーブ アーキテクチャを使用して全二重モード (両方向) で送信されます。 SPI 4 線式インターフェースとも呼ばれます。

図1 SPIによる標準通信

タイヤの中 SPI 4 つのデジタル信号が使用されます。
  • モシ: (Master Out Slave In) マスター出力、スレーブ入力。
  • 味噌:(マスターインスレーブアウト)マスター入力、スレーブ出力。
  • SCLK: (シリアルクロック) クロック信号。
  • CSまたは SS:(チップセレクト、スレーブセレクト)チップ選択、スレーブ選択。

他の名前も可能です:

  • モシ: SIMO、SDO、DO、DOUT、SI、MTSR;
  • 味噌: SOMI、SDI、DI、DIN、SO、MRST;
  • SCLK: SCK、CLK;
  • SS: nCS、CS、CSB、CSN、nSS、STE、SYNC。
タイヤ SPI 1 つのマスターデバイスと複数のスレーブデバイスで動作できます。 単一のスレーブ デバイスを使用する場合、その SS 入力を接地できますが、それは信号遮断時に動作しない場合に限られます。

複数のスレーブデバイスを使用する場合は、各ピンにプルアップ抵抗を接続する必要があります SS出力が 味噌各デバイスは、高インピーダンス状態のバッファを介して接続されます (実際には、出力は切断されていると見なされます)。これはマイクロ回路内に実装できます。特定のデバイスのドキュメントを調べる必要があります。

デバイス内にバッファが提供されていない場合、この行は 味噌常に log.0 または log.1 状態になります。 (燃える可能性もあります)。 デバイス内にバッファがあるかどうかを確認するには、ドキュメントを読むか、ライン上に分圧器を接続してください。 味噌電源電圧の半分であった場合は、実際の電圧を測定します。 測定した値が異なる場合(0 Vまたは電源電圧になる場合)、バッファは存在しないため、別のチップとしてインストールする必要があります。


図3 内部バッファの有無の確認

データ転送


マスターとスレーブは同時にデータを相互に送信します。 まず、入力を次のように設定してスレーブ デバイスを選択する必要があります。 SS低論理レベル (メーカーによって異なる場合があります)。 送信されるデータはシフト レジスタに配置されます。 次に、マスターは数 MHz 程度の周波数のクロック信号を生成し、マスターとスレーブはシフト レジスタに格納されている情報を最上位ビットから 1 ビットずつ相互に送信し始めます。

図4 SPIによるデータ転送
合計 2 つのシフト レジスタが使用され、1 つのデバイスの最上位ビットが別のデバイスの最下位ビットに転送され、その後レジスタに格納されている情報がシフトされます。 1 データ パケットのビット数は特定のデバイスによって異なりますが、メーカーによってはパケット長を変更する機能が追加されています。

さらにデータを転送する必要がある場合は、新しい情報がレジスタに書き込まれ、データ転送が終了するとプロセスが再開されます。通常、マスターはスレーブ デバイスの電源をオフにします。

インターフェイスの設定にはいくつかのレジスタが使用され、周波​​数、割り込み、ビット順序などを調整できます。詳細については、Motorola ee.nmt.edu のドキュメントを参照してください。このドキュメントは標準として採用されています。 SPI。 ただし、メーカーはそこに記載されているすべての設定を使用するとは限らず、ビットが Motorola の説明とは異なる順序で配置される場合があります。 いずれの場合も、特定のデバイスのドキュメントを読む必要があります。

送信周波数の設定とマスター/スレーブの選択が明確であれば、クロック信号の位相と極性の設定についてさらに詳しく説明できます。

基本的に、これらの設定はタイミング図から理解できます。

  • CPOL= 0: 同期信号は Low で開始します。
  • CPOL= 1: 同期信号は High で開始します。
  • CPHA= 0: データはクロック信号の立ち上がりエッジで書き込まれます。
  • CPHA= 1: データはクロック信号の立ち下がりエッジで記録されます。
立ち下がりエッジと立ち上がりエッジは、クロック信号の最初の変化、または 2 番目の変化を示します。 これは回線がどのような状態になるかには依存しません SCK、前線の下落または上昇のいずれかになる可能性があります。

ビットの状態にもよりますが、 CPHAそして CPOL、SPI インターフェイスには 4 つの動作モード (0、1、2、または 3) があります。 ただし、メーカーによっては、異なるビット状態に対応することがよくあります。たとえば、ARM コントローラーと PIC32MX コントローラーの場合、どのモードも一致しません。

複数の SPI を有効にする一般的な方法は 2 つあります。1 つ目はデイジー チェーン接続です。

この場合、マスターはどのスレーブ デバイスがデータを送信するかを選択します。

スレーブ デバイスは相互に互換性がなく、異なる設定 (たとえば、異なるパケット長) が必要な可能性があります。その場合、スレーブ デバイスは「リング」接続を使用します。

この場合、すべてのデバイスが同時にオンになり、データが順番に送信されます。情報を任意のデバイスに転送するか、デバイスからマスターに転送するには、いくつかの送信サイクルを経る必要があります。

結論


SPIこのインターフェースは、そのシンプルさと低コストにより人気を博しています。 現在、それは膨大な数のデバイスで見られ、MK はその助けを借りてプログラムされており、JTAG もそれに基づいて実装されています。 SPI。フラッシュ メモリ、EEPROM、LCD、SD カード、ADC、DAC マイクロ回路など、さまざまなマイクロ回路との通信によく使用されます。

この規格は Motorola によって説明されていますが、明確な定義や境界はありません。 SPIそのため、このインターフェイスのさまざまな実装が見つかり、さまざまな信号線の数、パケット内のビット数、およびその他の構成方法が使用される場合があります。 したがって、まず、使用しているデバイスのマニュアルを読む必要があります。

既製の実装があります SPIコンピュータに接続できる「トランシーバー」。さまざまなプロジェクトのデバッグに役立ちます。新しいオシロスコープやロジック アナライザーはデコードできます。 SPIパッケージ。

利点

  • 全二重データ伝送。
  • I²C または SMBus と比較して高いスループット。
  • パケット長を任意に選択可能。
  • I²C および SMBus と比較して消費電力要件が低い。
  • 安定したクロック速度が低いシステムでも使用できます。
  • I²C、GPIB、SCSI などのインターフェイスとは異なり、スレーブ デバイスには一意のアドレスは必要ありません。
  • 使用されるピンは 4 つだけであり、パラレル インターフェイスの場合よりもはるかに少なくなります。
  • 信号の一方向性により、必要に応じて、マスター デバイスとスレーブ デバイス間のガルバニック絶縁を簡単に構成できます。
  • 最大クロック周波数は、データ交換に関与するデバイスの速度によってのみ制限されます。

欠陥

  • I²C インターフェイスよりも多くのピンが必要です。
  • スレーブデバイスはデータフローを制御できません。
  • スレーブ デバイスからのデータ受信の確認はありません (マスター デバイスは「どこにも」データを送信できません)。
  • 標準で定義されたエラー検出プロトコルはありません。
  • 公式の規格がないため、デバイスを認証することができません。
  • データ伝送範囲の点では、SPI インターフェイスは UART や CAN などの規格に劣ります。
  • 多くのインターフェイス実装オプションが利用可能。
  • デバイスのホットプラグがサポートされていない。

出典:
モトローラのドキュメント

転送インターフェイス。

あるデバイスから別のデバイスへ、またはあるチップから別のチップへデータを転送するために、多くのデータ転送インターフェイスが開発されています。 各インターフェイスには良い面と悪い面の両方があるため、どのようなインターフェイスがあるのか​​、それぞれの長所と短所を理解し、特定の状況でデータを転送するには適切なインターフェイスを使用する必要があります。

インターフェイスには、非同期および同期データ転送が備わっています。 同期データ送信では、クロック信号がデータと同時に送信され、受信機と送信機の同期が可能になります。 このようなプロトコルの例としては、SPI インターフェイスがあります。

非同期データ送信にはクロック信号がありません。 このような回線では、受信機と送信機の間に不一致が発生する危険性があり、その結果、データが正しく受信されなくなります。 これを防ぐために、非同期インターフェイスはデータ ラインに沿って定期的な同期を実行します。 このようなインターフェースの利点は、送信に必要な導体の数が少ないことです。

最も人気のあるインターフェイスのいくつかを詳しく見てみましょう。

USARTインターフェイス。

USART インターフェイスは、シリアル ユニバーサル同期/非同期トランシーバーです。 データは定期的に USART に転送されます。 この期間は、指定された USART 速度によって決まり、ボーで指定されます (0 または 1 に等しい値のみを取ることができる文字の場合、ボーはビット/秒に相当します)。 一般に受け入れられている標準速度の範囲は、300、600、1200、2400、4800、9600、19200、38400、57600、115200、230400、460800、921600 ボーです。

データ ビットに加えて、USART はストリームに同期マーク (いわゆるスタート ビットとストップ ビット) を自動的に挿入します。 受信時に、これらの余分なビットは削除されます。 通常、スタート ビットとストップ ビットは 1 バイトの情報 (8 ビット) を区切りますが、5、6、7、8、または 9 ビットの送信を許可する USART 実装もあります。 スタート信号とストップ信号で区切られたビットが最小送信です。 USART を使用すると、送信中に 2 つのストップ ビットを挿入して、トラフィックが多い場合に受信機と送信機が非同期になる可能性を軽減できます。 受信機は 2 番目のストップ ビットを無視し、回線上の短い一時停止として扱います。

慣例では、USART 入出力のパッシブ (データがない場合) 状態は論理「1」です。 スタート ビットは常に論理「0」であるため、USART レシーバーは「1」から「0」への遷移を待機し、そこからビットの持続時間の半分の時間間隔 (スタート ビット送信の中間) をカウントします。 。 この時点で入力がまだ「0」であれば、最小小包を受け取るプロセスが開始されます。 これを行うために、受信機は (8 ビット データの場合) 9 ビット継続時間をカウントし、各瞬間の入力状態を記録します。 最初の 8 つの値は受信データ、最後の値はテスト値 (ストップ ビット) です。 ストップ ビットの値は常に「1」です。実際に受信した値が異なる場合、USART はエラーを記録します。

時間間隔を形成するために、送信側および受信側の USART には正確な時間のソース (クロック) が必要です。 このソースの精度は、スタート パルスの始まりからストップ パルスの中間までの時間間隔を設定する際の誤差 (受信機と送信機) の合計が半分を超えない (できれば、少なくとも 1/2 を超えない) 必要があります。ビット間隔の 4 分の 1)。 8 ビット メッセージの場合、0.5/9.5 = 5% (実際には 3% 未満)。 これは、受信機と送信機のエラーと回線上で発生する可能性のある信号歪みの合計であるため、USART クロック精度の推奨許容差は 1.5% 以下です。

クロック ビットがビットストリームの一部を占めるため、結果として生じる UART スループットは接続速度と等しくなりません。 たとえば、8 ビット 8-N-1 フォーマット送信の場合、クロック ビットはストリームの 20% を占め、物理速度 115,200 ボーの場合、データ ビット レートは 92,160 bps または 11,520 バイト/秒になります。

パリティチェック

USART プロトコルには、ビット パリティ方式を使用してデータの整合性を自動的に監視する機能があります。 この機能が有効な場合、データの最後のビット (「パリティ ビット」) は常に 1 または 0 になるため、バイト内の 1 の数は常に偶数になります。

フロー制御

以前は、USART デバイスの速度が非常に遅く、受信データ ストリームに追いつけないことがありました。 この問題を解決するために、USART モジュールには個別のフロー制御出力と入力が提供されました。 入力バッファがいっぱいになると、受信側 USART のロジックが対応する出力に禁止レベルを設定し、送信側 USART は送信を一時停止します。 その後、フロー制御は通信プロトコルに割り当てられるようになり、個別のフロー制御ラインの必要性は徐々になくなりました。

物理的な実装。

USART は交換プロトコルです。 ビット形成方法、バイト送信パラメータ、送信速度などを決定します。

ただし、USART の物理的な実装は異なる場合があります。 たとえば、1 つのボード内でデータを送信する場合、信号は +5V と 0V レベルで送信されます。 長距離およびデバイス間でデータを転送するには、電流ループ (4 ~ 20 mA)、RS-232 (COM ポート)、RS-485 などの他の物理電圧レベルおよび規格が使用されます。

0 ~ 5V の「コントローラ」レベルを「標準」レベルに変換するには、RS-232 用の ADM202 など、膨大な数の特殊なマイクロ回路があります。

シリアルインターフェースSPI

SPI という名前は「Serial Peripheral Bus」の略語で、外部デバイスを接続するためのバスというその目的を反映しています。 SPI バスは、マスター/スレーブの原理に従って構成されています。 バス マスターは通常マイクロコントローラーですが、プログラマブル ロジック、DSP コントローラー、または ASIC である場合もあります。 マスターに接続されているデバイスはスレーブです。 それらの役割は、さまざまな種類のマイクロ回路によって果たされます。 ストレージデバイス(EEPROM、フラッシュメモリ、SRAM)、リアルタイムクロック(RTC)、ADC/DAC、デジタルポテンショメータ、専用コントローラなど。

SPI インターフェイスの主な構成要素は従来のシフト レジスタであり、その同期信号とビットストリーム入出力信号がインターフェイス信号を形成します。 したがって、SPI プロトコルは、データ転送プロトコルではなく、それぞれが受信機と送信機の両方の機能を同時に実行する 2 つのシフト レジスタ間のデータ交換プロトコルとより正確に呼ばれます。 SPI バスでのデータ送信の前提条件は、バス同期信号の生成です。 リーダーだけがこの信号を生成する権利を持ち、スレーブの動作は完全にそれに依存します。

繋がり。

SPI バスへの接続には 3 つのタイプがあり、それぞれに 4 つの信号が含まれます。 SPI 信号の目的は表 7.1 で説明されています。

2 つのマイクロ回路のみを含む最も単純な接続を図 7.2 に示します。 ここで、バス マスターは、バス マスターが生成する SCLK 信号と同期して MOSI ラインに沿ってデータを送信し、スレーブは受信した同期信号の特定のエッジで送信されたデータ ビットをキャプチャします。 同時に、スレーブはデータ パッケージを送信します。 使用するスレーブ IC が応答データ送信を備えていない場合、またはその必要がない場合、提示された回路は MISO ラインを削除することで簡素化できます。 一方向のデータ転送は、DAC、デジタル ポテンショメータ、プログラマブル アンプ、ドライバーなどのチップで見られます。 したがって、スレーブ IC を接続するために検討されたオプションには 3 つまたは 4 つの通信ラインが必要です。

スレーブ IC がデータを送受信するには、クロック信号に加えて、SS ラインも Low に駆動する必要があります。 そうしないと、スレーブ IC は非アクティブになります。 外部 IC を 1 つだけ使用する場合、スレーブ IC の選択入力をハード ローに駆動して SS ラインを削除したくなるかもしれません。 この解決策は非常に望ましくなく、障害が発生したり、データ転送が不可能になったりする可能性があります。 チップ選択入力は、IC を初期状態にリセットする役割を果たし、場合によってはデータの最初のビットの出力を開始します。

複数のマイクロ回路を SPI バスに接続する必要がある場合は、独立 (並列) 接続 (図 7.3) またはカスケード (シリアル) 接続 (図 7.4) が使用されます。 独立した接続の方が一般的です。 SPI 互換チップを使用すると達成されます。 ここでは、マイクロ回路の選択を除くすべての信号が並列に接続され、バス マスターはいずれかの SS 信号をロー状態に転送することで、どのスレーブ IC とデータを交換するかを指定します。 この接続の主な欠点は、スレーブ チップをアドレス指定するための追加の回線が必要になることです (通信回線の総数は 3+n です。n はスレーブ チップの数です)。

十分なマイクロコントローラー レッグがない場合は、デマルチプレクサ チップを使用できます。 デマルチプレクサは、制御ピンのコードに応じて、単一の入力信号を出力信号の 1 つに接続します。 図 7.4 にデマルチプレクサの接続図を示します。 SS 信号はその入力に供給され、マイクロ回路の 1 つを選択する必要がある場合は 0 に等しい値をとります。 必要なマイクロ回路の番号はバイナリ コードで Am-A0 レッグに供給されます。 これにより、マイクロコントローラーで使用されるレッグの数を m=log 2 n に減らすことができます。 ここで、n はスレーブ チップの数です。 それらの。 128 台のデバイスを接続するには、8 つのマイクロコントローラー ピンが必要です。 1 つはイネーブル信号を設定するため、7 はオンにするチップの番号を設定するためです。 デマルチプレクサの接続されていないレッグには論理的なものが存在する必要があることに注意してください。 それ以外の場合は、信号インバータが使用され、論理 0 を論理 1 に変換します。

カスケード スイッチングにはこの欠点がありません。 ここでは、いくつかのチップが 1 つの大きなシフト レジスタを形成します。 これを行うには、図 3 に示すように、一方の IC の送信データ出力をもう一方の IC のデータ受信入力に接続します。ここでのチップ選択入力は並列に接続されているため、通信ラインの総数は等しく保たれます。ただし、カスケード接続の使用は、使用するチップのドキュメントにそのサポートが示されている場合にのみ可能です。 これを知るには、このような接続を英語で「デイジーチェーン」と呼ぶことを知っておくことが重要です。

転送プロトコル

SPI インターフェイスを介した送信プロトコルは、シフト レジスタ (図 7.6) のロジックと本質的に同じであり、シフト操作の実行と、それに応じた同期信号の特定のエッジでのデータのビット入出力で構成されます。 送信時のデータ設定と受信時のサンプリングは常に逆のクロックエッジで行われます。 これは、データが確実に確立された後にサンプリングされるようにするために必要です。 送信サイクルの最初のエッジが立ち上がりエッジまたは立ち下がりエッジになる可能性があることを考慮すると、SPI インターフェイスのロジックには 4 つの可能なオプションがあります。 これらのオプションは SPI モードと呼ばれ、次の 2 つのパラメータで記述されます。

· CPOL - 同期信号の初期レベル (CPOL=0 の場合、送信サイクルの開始前と終了後の同期ラインはロー レベルになります (つまり、最初のエッジが立ち上がり、最後のエッジが立ち下がります)。それ以外の場合、CPOL=1 の場合、 - ハイ (つまり、最初の前線が下降し、最後の前線が上昇している)。

· CPHA - 同期フェーズ。 このパラメータは、データのインストールと取得の順序を決定します。 CPHA=0 の場合、クロック サイクルの立ち上がりエッジでデータがサンプリングされ、立ち下がりエッジでデータが設定されます。 CPHA=1 の場合、データのインストールは同期サイクルの立ち上がりエッジで実行され、サンプリングは立ち下がりエッジで実行されます。

SPI モードに関する情報を図 7.7 および 7.8 に示します。

異なる SPI モードで動作するマスター チップとスレーブ チップには互換性がないため、スレーブ チップを選択する前に、バス マスターがどのモードをサポートしているかを明確にすることが重要です。 マイクロコントローラーに統合されたハードウェア SPI モジュールは、ほとんどの場合、任意のモードを選択する機能をサポートしているため、任意のスレーブ SPI チップをモジュールに接続できます (独立した接続オプションにのみ適用されます)。 さらに、どのモードの SPI プロトコルもソフトウェアで簡単に実装できます。

RS-485インターフェース

RS-485 インターフェイス (別名 EIA/TIA-485) は、最も一般的な物理通信層規格の 1 つです。 物理層は通信チャネルおよび信号伝送方式です (OSI オープン システム相互接続モデルの層 1)。

RS-485 インターフェイス上に構築されたネットワークは、ツイスト ペア (2 本のツイスト線) を使用して接続されたトランシーバで構成されます。 RS-485 インターフェイスは、差動 (平衡) データ伝送の原理に基づいています。 その本質は、1 つの信号を 2 本のワイヤで送信することです。 さらに、一方のワイヤ (条件的に A) は元の信号を伝送し、もう一方 (条件的に B) はその逆コピーを伝送します。 言い換えれば、一方のワイヤに「1」がある場合、もう一方のワイヤには「0」があり、その逆も同様です。 したがって、ツイストペアの 2 本のワイヤ間には常に電位差が存在します。「1」では正、「0」では負になります (図 7.9)。

この電位差が信号を伝達します。 この伝送方法は、コモンモード干渉に対する高い耐性を提供します。 コモンモード干渉は、回線の両方のワイヤに均等に影響を与える干渉です。 たとえば、通信線の一部を通過する電磁波は両方の線に電位を誘導します。 RS-232 のように、信号がコモンに対して 1 つのワイヤの電位によって送信される場合、このワイヤ上の干渉により、干渉をよく吸収するコモン (グランド) に対して信号が歪む可能性があります。 さらに、接地電位差は長い共通ワイヤの抵抗によって低下し、さらなる歪みの原因となります。 また、差動伝送により歪みが発生しません。 実際、2 本のワイヤが互いに近くにあり、さらに絡み合っている場合、両方のワイヤのピックアップは同じになります。 等しく負荷がかかった両方のワイヤの電位は等しく変化しますが、有益な電位差は変化しません。

RS485 インターフェイスのハードウェア実装。

インターフェイスのハードウェア実装 - 差動入力/出力 (ラインへ) およびデジタル ポート (コントローラーの UART ポートへ) を備えたトランシーバー チップ。 このインターフェイスには、RS-422 と RS-485 の 2 つのオプションがあります。

RS-422 は全二重インターフェイスです。 受信と送信は 2 つの別々のワイヤ ペアを介して行われます。 ワイヤの各ペアには送信機が 1 つだけ存在できます。

RS-485 は半二重インターフェイスです。 受信と送信は、時間的に離れて 1 対のワイヤ上で行われます。 送信機は受信モードでオフにできるため、ネットワーク内に多数の送信機が存在する可能性があります (図 7.10)。

図7.10の記号の説明

D (ドライバー) - 送信機;
R (受信機) - 受信機;
DI (ドライバー入力) - 送信機のデジタル入力。
RO (受信機出力) - 受信機のデジタル出力。
DE (ドライバーイネーブル) - 送信機を操作する許可。
RE (受信機イネーブル) - 受信機を操作する許可。
A - 直接差動入出力。
B - 逆差動入力/出力。
Y - 直接差動出力 (RS-422)。
Z - 逆差動出力 (RS-422)。

RS-485 トランシーバーを詳しく見てみましょう。 受信機のデジタル出力 (RO) は受信機の UART ポート (RX) に接続されます。 トランスミッターデジタル入力 (DI) から UART トランスミッターポート (TX) へ。 受信機と送信機は差動側で接続されているため、受信時は送信機の電源をオフにし、送信時は受信機の電源をオフにする必要があります。 この目的のために、制御入力、つまり受信機許可 (RE) と送信機許可 (DE) が使用されます。 RE 入力は反転しているため、DE に接続し、コントローラーの任意のポートからの 1 つの信号でレシーバーとトランスミッターを切り替えることができます。 レベル「0」では受信用に動作し、レベル「1」では送信用に動作します(図7.11)。

レシーバは、差動入力 (AB) で電位差 (UAB) を受信し、出力 RO でデジタル信号に変換します。 受信機の感度は異なる場合がありますが、トランシーバーチップのメーカーは信号認識の保証閾値範囲を文書に記載しています。 通常、これらのしきい値は±200 mV です。 つまり、UAB > +200 mV の場合、受信機は UAB のときに「1」を検出します。< -200 мВ - приемник определяет "0". Если разность потенциалов в линии настолько мала, что не выходит за пороговые значения - правильное распознавание сигнала не гарантируется. Кроме того, в линии могут быть и не синфазные помехи, которые исказят столь слабый сигнал.

すべてのデバイスは同じ方法で 1 本のツイスト ペア ケーブルに接続されます。つまり、一方のワイヤに直接出力 (A)、もう一方のワイヤに反転出力 (B) が接続されます。

ライン側 (RAB) レシーバーの入力インピーダンスは通常 12KΩ です。 送信機の電力は無制限ではないため、回線に接続されている受信機の数に制限が生じます。 RS-485 仕様によれば、終端抵抗を考慮すると、送信機は最大 32 台の受信機を駆動できます。 ただし、入力インピーダンスが増加したマイクロ回路が多数あり、これにより 32 を大幅に超えるデバイスをラインに接続できます。

RS-485 仕様に基づく最大通信速度は 10 Mbaud/秒に達します。 最大距離は 1200 メートルです。 1200メートルを超える距離で通信を組織する必要がある場合、または送信機の負荷容量が許容するよりも多くのデバイスを接続する必要がある場合は、特別なリピータが使用されます。

I2Cインターフェース。

このインターフェイスはフィリップスによって提案され、テレビのチップ間の通信を組織するために使用されました。 I 2 C (Inter-Integrated Circuit の略) は、双方向の非同期シリアル バスです。 物理的には、I 2 C バスは 2 本の信号線で構成され、そのうちの 1 つ (SCL) はクロック信号の送信を目的とし、2 つ目 (SDA) はデータ交換を目的としています。 ラインを制御するには、オープンコレクタの出力段が使用されるため、バスラインは、ラインの物理的な長さに応じて、1 ~ 10 kOhm の抵抗を介して +5 V 電源に接続する必要があります。データ転送速度。 標準モードの接続線の長さは 2 メートルに達し、データ転送速度は 100 kbit/s です。

すべてのバス加入者は、「リーダー」と「スレーブ」の 2 つのクラスに分けられます。 マスターデバイスはクロック信号 (SCL) を生成します。 情報を送信または受信する目的で、独立してバスにアクセスし、任意のスレーブ デバイスをアドレス指定できます。 すべてのスレーブデバイスはバスを「リッスン」して自身のアドレスを検出し、それを認識すると、所定の動作を実行します。 さらに、複数のマスターデバイスがバス上に設置されている場合、いわゆる「マルチマスター」モードが可能です。これらのデバイスは、共通のスレーブデバイスを共同で共有するか、またはそれら自体が情報交換を開始するときにマスターとして、または情報交換を開始するときにスレーブとして交互に機能します。別のマスターデバイスからのアクセスを待っています。 「マルチマスター」モードでは、競合を継続的に監視し認識する必要があります。 この点において、このモードは実装 (つまりソフトウェア実装) がより難しく、その結果、実際の製品ではあまり使用されません。

最初の瞬間、つまりスタンバイ モードでは、SCL と SDA の両方のラインが論理 1 状態になります (オープン コレクタ出力段のトランジスタが閉じています)。 送信モード (図 7.12) では、SDA データ ビットは SCL の立ち上がりエッジによってクロックされます。 SDA ライン上の情報は、SCL ラインがゼロ状態のときに変更されます。 スレーブ デバイスは、たとえば次の受信バイトを処理している間、SCL ラインをゼロ状態に「保持」できますが、マスター デバイスは情報の送信を続ける前に SCL ラインが解放されるまで待機する必要があります。

I 2 C バス パケットを同期するには、「開始」と「停止」という 2 つの条件が区別され、情報パケットの始まりと終わりが制限されます (図 7.13)。 これらの条件をエンコードするには、SCL ラインの単一状態による SDA ラインの状態の変化が使用されますが、これはデータ送信時には受け入れられません。 「START」条件は、SCL ラインがシングル状態のときに SDA ラインに下降エッジが現れると形成され、逆も同様で、「STOP」条件は、SCL ラインがシングル状態のときに SDA ラインに立ち上がりエッジが現れると形成されます。ラインは単一の状態です。

データ送信は、SCL ラインの最初の立ち上がりエッジで始まり、最初の情報バイトの最上位ビットをクロックします。 各情報バイト (8 ビット) には、SCL ラインの 9 クロック周期が含まれます。 9 番目のサイクルで、受信デバイスは確認応答 (ACK)、つまりデータの受信を示す立ち下がりエッジを発行します。 マスターとスレーブの両方のバス加入者は、異なる時点で送信機と受信機の両方になることができ、モードに応じて ACK 信号を受信または発行する必要があり、ACK 信号が存在しない場合は解釈されることに注意してください。エラーとして。

データ交換操作を開始するには、マスター デバイスがバス上で「START」条件を発行します。 「START」条件の後には、7 ビットのデバイス アドレス (ビット 1 ~ 7) と 1 ビットの読み取り/書き込み動作フラグで構成されるスレーブ デバイスのアドレス (図 7.14) のバイトが続きます。 R/W」(ビット 0)。 R/W ビットは交換の方向を決定します。0 はマスターからスレーブへのデータ転送を意味し (図 7.14a)、1 はスレーブからの読み取りを意味します (図 7.14b)。 I 2 C バス上のすべてのビットは、高から低の順に送信されます。つまり、7 番目のビットが最初に送信され、0 番目のビットが最後に送信されます。 アドレスの後には 1 つ以上の情報バイトが (R/W フラグで指定された方向に) 続く場合があり、そのビットは SCL バス上のマスターによってクロックされます。

読み取り操作を実行するとき、ホストは次のバイトを読み取りたい場合は読み取ったバイトに対して ACK を送信する必要があり、パケットの読み取りが終了しようとしている場合は ACK を発行しません (図 7.14b を参照)。

1 つの送信サイクルでスレーブ デバイスのアドレスを複数回再開すること、つまり、事前の「STOP」条件なしで「START」条件を繰り返し送信することが許可されます (図 7.14c)。

I 2 C インターフェイスを介して動作するメモリ チップのいくつかの機能と、それらとデータを交換する手順に注意する必要があります。 まず、これらのマイクロ回路の不揮発性データメモリはメモリページに分割されているため、バイトが書き込まれると、まずページ全体がマイクロ回路の内部RAMにコピーされ、そこで目的のセルが変更されます。 この後、古いページが消去され、その場所に新しいページが書き込まれます。 もう 1 つの特徴は、スレーブ アドレスの最上位 4 ビットが常に 1010 に等しくなければならないことです。この要件はフィリップス自身によって規制されています。

1-Wire バスは通信と電力に 1 本の導体のみを使用します。 通信モードは非同期および半二重であり、マスター/スレーブ パターンに厳密に従います。 1 つ以上のスレーブ デバイスを同時に同じバスに接続できます。 1 つのバスに接続できるマスターデバイスは 1 つだけです。

バスのアイドル状態は、プルアップ抵抗によって生成されるハイ レベルに対応します。 プルアップ抵抗の値はスレーブ IC のマニュアルに記載されています。 バスに接続されているすべてのチップは、低レベルを生成できなければなりません。 マイクロコントローラの出力が 3 ステートをサポートしていない場合は、オープンコレクタまたはオープンドレイン出力を持つドライバを提供する必要があります。

1-Wire バスを介した信号送信は、60 µs の持続時間のタイムスロットに分割されます。 タイムスロットごとに 1 ビットのデータのみが送信されます。 スレーブ デバイスには、定格遅延時間と大幅な差があることが許容されます。 ただし、タイムベースが異なる部下との正確なコミュニケーションを確保するには、リーダーによるより正確なタイミングが必要です。

基本的なバス信号。

マスターは各通信をビット レベルで開始します。 これは、方向に関係なく、すべてのビットの送信がマスターによって開始される必要があることを意味します。 これは、バスを Low に設定することで実現され、他のすべてのデバイスのロジックが同期されます。 1-Wire バス経由の通信には 5 つの主なコマンドがあります。 1」、「ログを書き込みます。 0」、「読み取り」、「リセット」、「プレゼンス」。

シグナル「ログを書き込んでください。 1"

シグナル「ログを書き込んでください。 1」を図に示します。 7.15。 マスターは 1 ~ 15 µs の間ローレベルを設定します。 この後、残りのタイムスロットでバスを解放します。

米。 7.15 – 「ログを書き込んでください。 1"

シグナル「ログを書き込んでください。 0"

シグナル「ログを書き込んでください。 0”を図7.16に示します。 マスターは少なくとも 60 μs、120 μs を超えない範囲でローレベルを生成します。

図 7.16 – 信号「ログを書き込みます。 0"

信号の読み取り

「Read」信号を図に示します。 7.17。 マスターは 1 ~ 15 µs の間ローレベルを設定します。 スレーブは、ログを送信したい場合はバスを Low に保持します。 0. ログの転送が必要な場合。 1 の場合は、単にラインを解放します。 バス スキャンは、バスが Low になってから 15 µs 以内に実行する必要があります。 マスター側から見ると、「Read」信号は本質的には「Write log」信号です。 1」。 スレーブの実際の内部状態は、「ログ記録」信号によって決定されます。 1」または「読書」。

図 7.17 – 「読み取り」信号

リセット/プレゼンス信号

「リセット」信号と「プレゼンス」信号を図 7.18 に示します。 パルスの時間間隔が異なることに注意してください。 マスターは 8 タイムスロット (480 µs) の間 Low になり、その後バスを解放します。 この長い期間のロー状態は「リセット」信号と呼ばれます。

スレーブがバス上に存在する場合、スレーブは、マスターがバスを解放してから 60 μs 以内に、少なくとも 60 μs の間 Low レベルを設定する必要があります。 この反応を「プレゼンス」と呼びます。 このような信号が検出されない場合、マスターはバスにデバイスが接続されておらず、それ以上の通信は不可能であると想定する必要があります。

USB (ユニバーサル シリアル バス) は、外部デバイスをパーソナル コンピュータにすばやく接続し、必要なソフトウェアを見つけてインストールするために開発されました。 低電力デバイスには、インターフェイスを通じて直接電力が供給されます。

USB 標準は、ネットワーク上にマスター (ホスト) デバイスが 1 つだけ存在することを意味します。 さらに、この規格はネットワーク上で最大 127 台のスレーブ デバイスをサポートします。 マスター デバイスとスレーブ デバイスを区別するために、さまざまなタイプのコネクタが開発されています (図 7.19)。マスター用にはタイプ A、スレーブ用にはタイプ B です。 5V 電圧はマスター コネクタであるタイプ A コネクタにのみ存在することが認められています。 残りのデバイスにはそこから直接電力が供給されます。

USB 標準では 4 本のシールド線が使用され、そのうち 2 本が電力 (+5v および GND) を送信します (図 7.19 および表 7.2)。 他の 2 つはツイスト ペアの差動データ信号を表します。 使用されるエンコード方式 NRZI(Non Return to Zero Invert) は、マスタークロックとスレーブクロックを同期するための同期フィールドを備えたデータ送信用です。

USB 2.0 標準では、On-The-Go (OTG) 標準が導入され、ホスト ネゴシエーション プロトコルが導入されました。これにより、2 つの USB デバイスが誰がマスターとして機能するかについて合意することができます。 これは、携帯電話からパーソナル コンピュータへの接続など、単一のポイントツーポイント接続を目的としており、これに限定されます。

USB は、動的にロードおよびアンロードされるドライバーによる「ホット」 (プラグアンドプレイ) 接続をサポートします。 ユーザーはデバイスを接続するだけでバスに接続できます。 ホストは接続を検出し、新しく挿入されたデバイスをポーリングして適切なドライバーをロードし、ロードの瞬間を画面上の砂時計で示します (USB デバイスのドライバーがシステムにすでにインストールされている場合)。 エンドユーザーは終了や終了については気にしません。 IRQ(割り込み) やポート アドレス、コンピュータの再起動 (再起動は必要ありません) についても説明しません。 ユーザーが USB デバイスの使用を終えたら、それを取り外す (またはケーブルを抜く) だけで、ホストがデバイスの不在を検出し、ドライバーを自動的にアンロードします。

SB バージョン 1.1 は、速度 12 Mbits/s のフルスピード モードと速度 1.5 Mbits/s の低速モードの 2 つの速度をサポートします。 1.5 Mbits/s モードは速度が遅く、EMI (干渉) の影響を受けにくいため、フェライト ビーズのコストが削減され、コンポーネントの品質要件が軽減されます。

フルスピードバスケーブルはシールドで保護されたツイストペアケーブルであり、低速動作にも使用できます。 最低速度でのみ動作するケーブル (マウスの接続など) は、シールドされていないものであれば何でも構いません。

USB 2.0 規格では、データ転送速度 480Mbits/s の高速モードが導入されています。

データ転送。

インターフェイスを介したすべてのデータ転送はホストによって開始されます。 データはパケットの形式で送信されます。 USB インターフェイスは、いくつかのタイプのパケットを使用します。

A) パッケージに署名する (トークンパッケージ) データ転送のタイプと方向、エンドポイントのデバイスアドレスとシリアル番号を記述します (CT は USB デバイスのアドレス指定可能な部分です)。 機能パッケージにはいくつかのタイプがあります。 , , SOF, 設定;

B) データパッケージ (データパケット) 送信されたデータが含まれます。

B) 承認パッケージ (ハンドシェイクパケット) データ転送の結果を報告することを目的としています。 調整パッケージにはいくつかの種類があります。 確認応答, N.A.K., ストール.

USB 経由のデータ転送は次のように行われます。

最初のパケット、いわゆるトークンは、転送されるデータのタイプ、転送操作 (読み取りまたは書き込み)、デバイス アドレス、およびエンドポイントを記述するためにマスター デバイスによって生成されます。 次に通常送信されるのは、有用な情報を運ぶデータ パケットで、その後に、データまたはトークンが正常に受信されたか、エンドポイントが停止しているか、データを受け入れることができないことを示すハンドシェーク パケットが続きます。

USB 標準のエンドポイントは、データのソースとシンクです。 すべてのデバイスはエンドポイント 0 をサポートする必要があります。これは、列挙中 (接続されているデバイスのタイプを決定するためのハンドル要求)、およびデバイスがバス上で動作している限り、すべての制御およびステータス要求を受け入れるエンドポイントです。

1 から番号が付けられたエンドポイントは、ユーザー情報の送信に使用されます。 いくつかの例を見てみましょう。

デバイス ドライバーはマスター デバイス エンドポイント EP1 に送信します。 なぜなら このデバイスがマスターである場合、データは OUT バッファ EP1 に入ります。 この場合、OUT トークンが送信され、データを送信する準備ができていることが示されます。 このトークンを受信すると、スレーブ デバイスは OUT バッファからデータを読み取ることができます。

スレーブ デバイスはデータをマスターに転送する必要がある場合、そのデータを IN バッファに置きます。 このバッファは、マスターがエンドポイントからのデータを要求する IN トークンを送信するまでデータを保持します。 すべてのエンドポイント バッファには、マスターに関連した名前が付けられます。つまり、 スレーブデバイスの出力バッファは IN と呼ばれます。 これはマスターデバイスの入力バッファです。

あるエンドポイントから別のエンドポイントへのデータ転送は、ストリームを通じて行われます。 フロー – ホストとエンドポイント間の論理接続。

ストリームには、転送タイプ (制御、バルク、ISO、または割り込み)、データ フローの方向、最大パケット/バッファ サイズなどのパラメータのセットもあります。

たとえば、デフォルトのストリームは、転送タイプ制御を備えた IN エンドポイント 0 と OUT エンドポイント 0 で構成される双方向ストリームです。

USB では 2 種類のパイプが定義されています

A) ストリームパイプには事前定義された USB 形式がないため、ストリーム パイプを通じてあらゆるタイプのデータを送信し、相手側でデータを回復できます。 データ ストリームは順次であり、所定の方向 (IN または OUT) を持ちます。 ストリーム パイプは、バルク、アイソクロナス、および割り込み転送タイプをサポートします。 ストリーム パイプはホストまたはデバイスから制御できます。

B) メッセージパイプ事前定義された USB フォーマットを持っています。 これらはホストによって制御され、ホストから送信されたリクエストによって開始されます。 データは、リクエストで指定された希望の方向に送信されます。 したがって、メッセージ パイプではデータを両方向に転送できますが、サポートされるのは制御転送のみです。

USB 規格では、次の 4 種類のデータ転送について説明しています。

A) 制御転送 (コントロール転送) は、デバイス構成およびその他のデバイス固有の目的に使用されます。

B) ストリーミング (一括転送) は、比較的大量の情報を送信するために使用されます。

B) 割り込み転送 (転送の中断) は、タイムリーな送信が重要である比較的少量の情報を送信するために使用されます。 期間が限られており、他のタイプの転送と比べて優先度が高くなります。

D) アイソクロナス転送 (アイソクロナス転送) リアルタイム ストリーミングとも呼ばれます。 このような転送で送信される情報は、作成、送信、受信時にリアルタイムのスケールを必要とします。

ストリーミング転送 送信中にエラーを検出し、情報を再要求することにより、ホストと機能の間でエラーのないデータ転送が保証されることが特徴です。 ホストが関数からデータを受信する準備ができると、関数にフラグ パケットを送信します。 -ビニール袋。 これに応答して、データ転送フェーズの関数はデータ パケットをホストに送信します。

今日はタイヤについての知識を始めます SPI (シリアル ペリフェラル インターフェイス).

このバスは電子機器で非常に広く使用されています。 同期かつ全二重であるため非常に便利であるため、センサー、コントローラー、ドライバー、その他のデバイスなど、さまざまなデジタル デバイス間の通信用の多くの回路で使用されています。

このバスを理解する必要があるもう 1 つの重要な要素は、このバスがコントローラーのハードウェアで組織されているということです。 AVR.

さらに、望むと望まざるにかかわらず、コントローラーはこのインターフェースを介してフラッシュされるため、初めてコントローラーのフラッシュを開始するとすぐに、長い間 SPI インターフェースと通信することになります。

そこで、このタイヤについてもっと詳しく知りたいと思います。

Atmega8 コントローラの技術ドキュメントを開いて、このコントローラのピン配置が示されているページを開いて、ピン 16 から 19 に SPI バス ピンがあることを確認してください。

これらの調査結果についてもう少し詳しく説明します

SS(チップセレクト)— これはデバイス選択区間です。 このピンのスレーブ デバイスがロー レベルに設定されている場合、このデバイスは応答し、SPI バスを介して情報を交換します。ハイ レベルの場合は、応答しません。

MOSI (マスター出力スレーブ入力)- マスターデバイスの出力ピンおよびスレーブデバイスの入力ピンです。

MISO (マスター入力スレーブ出力)- 逆に、スレーブの出力、マスターの入力。

SCK— 同期レッグ。 このバス上の情報交換に参加するすべてのデバイスには、特定の周波数のクロック パルスが供給されます。

これは、Atmega8 コントローラーの SPI バスの実装の図です。

他のバスと同様に、特定の情報を保存するレジスタが多数あります。

SHIFT REGISTERに興味があり、情報交換をしています。 設定に応じて、同期ピンに下降または上昇の特定のエッジがあるとすぐに、スレーブおよびマスター デバイスのこれらのレジスタは、すべての情報ではなく 1 ビットのみの情報を交換します。 これらのレジスタは左にシフトし、各レジスタの最上位ビットは、関連するデバイスの同じレジスタの最下位ビットに送られます。 つまり、スレーブは MOSI ピンを介して最上位ビットをリーダーに送信し、リーダはそれを左シフトにより空いた下位ビットに書き込み、スレーブは置き換えられた上位ビットを MISO を介して転送します。リーダーの下位ビットにピンで固定します。 これが交換の仕組みです。つまり、8 クロック サイクルでバイトが完全に交換されます。

1 バイトの情報のうち 8 ビットすべてが送信されるとすぐに、特定のレジスタがこのプロセスが完了したことを知らせます。 というか、特定のレジスタの特定のビット。

また、ブロック図には分周器があり、その入力はクロック・パルスを受信し、特定の値で分周されてチェーンを介して SCK ピンに送信され、そこからピン上のスレーブ・デバイスに供給されます。同じ名前です。 これにより、デバイスの同期が確保されます。 クロック周波数は、交換に参加しているすべてのデバイスでサポートされている最も低い周波数から選択されます。

複数と言ったのは、特定の回路上に 2 つ以上のデバイスが存在する可能性があるためです。 デバイスにアドレスがない場合に、これがどのように保証されるかについて説明します。

複数のデバイス間、つまりマスター デバイスごとに複数のスレーブが存在する場合に情報を交換するには、いくつかの方法があります。 そのうちの最も一般的な 2 つを見ていきます。

最初の方法は放射状です(画像をクリックすると画像が拡大されます)

ここで、マスターはデータを特定のデバイスに送信し、SS ピンの論理 0 をオンにします。この方法では、デバイスを 1 つだけ選択できます。また、コントローラー ポートの空きピンもいくつか必要になります。

もう一つの興味深い方法があります - リングまたはカスケード (画像をクリックして画像を拡大します)

ここでは、選択レッグがすべて平行であり、交換が循環していることがわかります。 したがって、伝達円が増加するという事実により速度は低下しますが、ポートレッグは節約されます。

次のレッスンで、プロジェクトで特定のデバイスを使用するときに、これらすべてをさらに詳しく学習します。

そうですね、バスを介してデータを送信する回路のようです SPI私たちはそれを理解しました。

ここで、AVR コントローラのハードウェア レジスタのレベルでこのプロセスを制御する方法を考えてみましょう。

これらのレジスタは、ページ上のブロック図に示されています。

Atmega8 には、SPI バスを処理するための次のレジスタがあります。

SPDR (SPI データレジスタ)- データレジスタ。ブロック図では DATA BUFFER です。 その後スレーブ デバイスに送信するためにこのレジスタにバイトを入力し、そこからスレーブ デバイスからの情報のバイトを読み取ります。 また、コントローラーがマスター デバイスになる必要もありません。 次に、2 つのコントローラーの回路を組み立てます。そのうちの 1 つはスレーブになります。 したがって、送信と受信の両方のバイトが配置されるのはこのレジスタ内です。

SPCR (SPI 制御レジスタ)- 制御レジスタ

このレジスタには次のビットが含まれます。

SPIE (SPI 割り込みイネーブル)- 割り込みを有効にするビット。

SPE (SPI イネーブル)— SPI バスを有効にするビット。

DORD (データ順序)— ビットが送信される順序を設定するビット。1 に設定すると、最下位ビットが最初に送信され、0 に設定すると、最上位ビットが送信されます。

MSTR (マスター/スレーブ選択)— デバイスをマスターまたはスレーブとして指定するビット。 このビットが 1 に設定されている場合、デバイスはマスターになります。

CPOL (クロック極性)— 同期極性。同期パルスのどのエッジでスタンバイ モードが開始されるかを決定します。

このビットが 1 の場合、上昇エッジを持つスタンバイ モードになり、0 の場合、下降エッジを持つスタンバイ モードになります。

CPHA (クロックフェーズ)— クロック位相、つまりどのエッジでビットが送信されるかを決定するビット。

CPOL と CPHA のインストールに応じたデータ転送図を見てみましょう

これは非常に興味深い依存関係です。 デバイスの技術的特性で、たとえば、SPI 0:0 および SPI 1:1 モードで動作できることが時々わかりますが、これはまさにこれらのビットの設定に関係します。

SPR1、SPR0 (SPI クロック レート選択)- これらは、同期分周器の値を担当するビットであり、ビットと連携して動作します。 SPI2Xステータスレジスタにあります。 制御レジスタの 8 ビットではすべての設定に十分ではなく、ステータス レジスタには多くの空きビットがあるため、これは制御レジスタでもあります。

SPSR (SPI ステータス レジスタ)- ステータスレジスタ

SPI2X (ダブルSPIスピードビット)- 速度を 2 倍にするビット。制御レジスタの SPR1 および SPR0 ビットと連動します。

これら 3 ビットに対する周波数の依存性を見てみましょう。

SPIF (SPI 割り込みフラグ)— 割り込みフラグ。 このビットが 1 に設定されるのを待っています。 バイトを受け取ったとき。 別のデバイスからのバイトがバッファに完全に現れるとすぐに、このフラグが設定されます。 このフラグは、割り込みを有効にするビットが設定されており、グローバル割り込みが有効になっている場合にのみ機能します。

WCOL (書き込み衝突フラグ)— データ転送中にビット競合が発生した場合、またはデータ転送中にデータ レジスタへの書き込みが試行された場合、競合または衝突フラグが設定されます。

さて、これで SPI インターフェイスについては少し慣れてきたと言えます。

ビデオチュートリアルを見る(写真をクリックしてください)

投稿閲覧数: 6,294

説明書

SPI- シリアルペリフェラルインターフェイスまたは 「シリアルペリフェラルインターフェース」マスターデバイスと周辺デバイス(スレーブ)をインターフェースするための同期伝送プロトコルです。 多くの場合、マスター デバイスは です。 デバイス間の通信は 4 線式で行われるため、SPI は「4 線式インターフェイス」と呼ばれることもあります。 タイヤは次のとおりです。
MOSI (マスター アウト スレーブ イン)- マスターデバイスからスレーブデバイスへのデータ伝送ライン。
MISO (マスターインスレーブアウト)- スレーブからマスターデバイスへの伝送ライン。
SCLK (シリアルクロック)- マスターデバイスによって生成される同期クロックパルス。
SS(スレーブセレクト)- スレーブデバイス選択ライン; ラインが「0」の場合、スレーブデバイスは現在アドレス指定されていることを「理解」します。
4 つのデータ転送モード (SPI_MODE0、SPI_MODE1、SPI_MODE2、SPI_MODE3) があり、クロック パルスの極性の組み合わせによって決まります (HIGH または LOW レベルで動作します)。 クロック極性、CPOL、およびクロック パルスの位相 (クロック パルスの立ち上がりエッジまたは立ち下がりエッジでの同期)、 クロック位相、CPHA.
この図は、SPI プロトコル経由でデバイスを接続するための 2 つのオプション (独立型とカスケード型) を示しています。 SPI バスに独立して接続されている場合、マスター デバイスは各スレーブ デバイスに個別にアクセスします。 カスケードの場合、デバイスはカスケードで 1 つずつトリガーされます。

Arduino では、SPI インターフェイス バスは特定のポートにあります。 各ボードには独自のピン割り当てがあります。 便宜上、ピンは複製され、別の ICSP コネクタ (サーキット シリアル プログラミング、シリアル プロトコルを使用する回路に含まれるデバイス) にも配置されています。 ICSP コネクタにはスレーブ選択ピン (SS) がないことに注意してください。 Arduino はネットワーク内のマスターデバイスとして使用されることが想定されています。 ただし、必要に応じて、任意の Arduino ピンを SS として割り当てることができます。
この図は、Arduino UNO および Nano の SPI バスへのピンの標準的な対応を示しています。

SPI プロトコルを実装する特別なプロトコルが Arduino 用に作成されました。 次のように接続します。プログラムの先頭に次のコードを追加します。 #include SPI.h
SPI プロトコルの使用を開始するには、設定を行ってから、SPI.beginTransaction() プロシージャを使用してプロトコルを初期化する必要があります。 これは 1 つの命令で実行できます。 SPI.beginTransaction(SPISettings(14000000, MSBFIRST, SPI_MODE0)).
これは、SPI プロトコルを 14 MHz の周波数で初期化し、データ送信がモード「0」で MSB (最上位ビット) から開始されることを意味します。
初期化後、対応する SS ピンを LOW 状態にしてスレーブ デバイスを選択します。
次に、SPI.transfer() コマンドを使用してデータをスレーブ デバイスに転送します。
送信後はSSをHIGH状態に戻します。
プロトコルの操作は SPI.endTransaction() コマンドで完了します。 別のデバイスが異なる設定を使用してデータ転送を開始しようとした場合の問題を回避するために、SPI.beginTransaction() 命令と SPI.endTransaction() 命令の間の転送時間を最小限に抑えることをお勧めします。

SPI インターフェースの実際の応用を考えてみましょう。 SPIバス経由で8ビットシフトレジスタを制御してLEDを点灯させます。 レジスタ74HC595をArduinoに接続してみましょう。 LED を 8 つの出力のそれぞれに (制限抵抗を介して) 接続します。 その図を図に示します。

こんな感じでスケッチを書いてみましょう。
まず、SPI ライブラリを接続し、SPI インターフェイスを初期化しましょう。 ピン 8 をスレーブ デバイス選択ピンとして定義しましょう。 値「0」を送信してシフト レジスタをクリアしましょう。 シリアルポートを初期化します。
シフト レジスタを使用して特定の LED を点灯するには、その入力に 8 ビットの数値を適用する必要があります。 たとえば、最初の LED を点灯するには、2 進数 00000001、2 番目の LED には 00000010、3 番目の LED には 00000100 などを指定します。 これらの 2 進数を 10 進数に変換すると、1、2、4、8、16、32、64、128 という順序が形成され、0 から 7 までの累乗になります。
したがって、loop() サイクルでは、LED の数に基づいて 0 から 7 まで再計算します。 pow(基数、次数) 2 のループ カウンタの累乗を計算します。 マイクロコントローラーは「double」型の数値をあまり正確に処理できないため、round() 関数を使用して結果を整数に変換します。 そして、結果の数値をシフト レジスタに転送します。 明確にするために、シリアル ポート モニタには、この操作中に取得された値が表示されます。1 桁の数字が表示され、LED が波状に点灯します。


AVR マイクロコントローラには、標準インターフェイスを実装するモジュールが含まれています。 これらのモジュールは、デジタル センサー、メモリ チップ、DAC、ADC、その他のマイクロコントローラーなどのさまざまな周辺デバイスと通信するために使用されます。 この記事では、例として atmega16 マイクロコントローラーを使用して、シリアル ペリフェラル インターフェイス モジュールまたは SPI (シリアル ペリフェラル インターフェイス) モジュールを操作する方法を説明します。

導入

SPI は、チップ間のシリアル データ交換用に設計された 4 線式同期バスです。 このインターフェイスは Motorola によって開発されましたが、現在はすべてのメーカーで使用されています。 このインターフェイスは、使いやすさと実装のしやすさ、高い交換速度、短距離を特徴としています。
SPI を介したデータ交換中は、デバイスの 1 つがマスターとなり、もう 1 つがスレーブになります。 通常 (常にではありませんが)、マイクロコントローラーはマスターとして機能します。 マスターは周辺デバイスをアクティブ状態に切り替え、クロック信号とデータを生成します。 それに応じて、スレーブ デバイスはそのデータをマスターに送信します。 両方向のデータ転送はクロック信号と同期して行われます。
物理的には、SPI はシフト レジスタに基づいて実装され、送信機と受信機の両方の機能を実行します。
SPI を介したデータ交換の原理を次の図に示します。

このインターフェイスで使用される信号には次の目的があります。

モシ- マスター出力/スレーブ入力。 マスター出力/スレーブ入力。 マスターからスレーブにデータを転送する役割を果たします。
味噌
– マスター入力/スレーブ出力。 マスター入力/スレーブ出力。 スレーブデバイスからマスターデバイスにデータを転送するために機能します。
SLK- シリアルクロック。 同期信号。 すべてのスレーブデバイスにクロック信号を送信する役割を果たします。
SS- スレーブ選択。 スレーブの選択。 スレーブ機器を選択するときに使用します。

チップ メーカーは、これらの信号に別の名前を使用することがよくあります。 代替オプションは次のとおりです。

モシ– DO、SDO、DOUT。
味噌– DI、SDI、DIN。
SCK– CLK、SCLK。
SS– CS、同期

SPI接続図

SPI 経由で 2 つのデバイスを接続する一般的な図は次のようになります。

複数のスレーブデバイスをマスターデバイスに接続することも可能です。 ただし、いつでも交換できるのは 1 つだけであり、残りは非アクティブな状態でなければなりません。

例外は、SPI によるカスケード接続方式です。 この接続により、デバイス シフト レジスタは 1 つの大きなレジスタを形成し、SPI ラインの数は 4 のままになります。 確かに、すべてのマイクロ回路がそのような接続をサポートしているわけではありません。

MOSI または MISO ラインを使用しない場合は、接続図の短縮版も可能です。 つまり、データ転送は一方向のみで行われる。 このような回路は、たとえば、外部の DAC および ADC チップをマイクロコントローラーに接続するときに使用されます。

SPI通信プロトコル

SPI 交換プロトコルはシフト レジスタのロジックに似ており、クロック信号の特定のエッジでのデータのビットごとの連続的な出力/入力で構成されます。 データの設定とサンプリングはクロック信号の逆エッジで実行されます。
SPI 仕様では、クロック信号の位相および極性と送信データの関係が異なる 4 つのデータ送信モードが規定されています。
これらのモードは、次の 2 つのパラメータで記述されます。

CPOL– クロック極性。 クロック極性 - クロック信号の初期レベルを決定します。
CPHA– クロック位相。 クロック位相 - データの設定とサンプリングのシーケンスを決定します。

以下の図は、4 つの SPI 通信モードすべてを示しています。

SPI モード 0: CPOL = 0、CPHA=0。クロック信号は論理 0 レベルで始まります。 データのラッチは立ち上がりエッジで行われます。 データ変更は立ち下がりエッジで発生します。 データがラッチされる瞬間を矢印付きの図に示します。

SPI モード 1: CPOL = 0、CPHA=1。クロック信号は論理 0 レベルで始まります。 データ変更は立ち上がりエッジで発生します。 データのラッチは立ち下がりエッジで実行されます。

SPI モード 2: CPOL = 1、CPHA = 0。クロック信号は論理 1 レベルで始まります。 データのラッチは立ち下がりエッジで実行されます。 データ変更はクロック信号の立ち上がりエッジで実行されます。

SPI モード 3: CPOL = 1、CPHA = 1。クロック信号は論理 1 レベルで始まります。 データ変更はクロック信号の立ち下がりエッジで実行されます。 データのラッチは立ち上がりエッジで行われます。

最新のマイクロコントローラーは、4 つの SPI 動作モードをすべてサポートしています。
SPI を介したデータ送信は、最上位ビットの転送だけでなく、最下位ビットの転送でも発生する可能性があることに注意してください。 また、選択信号(SS)の保持時間内に送信するバイト数は特に制限はなく、使用するスレーブデバイスの仕様によって決まります。 スレーブ デバイスの仕様には、サポートされる SPI 動作モード、最大クロック周波数、送信または受信データの内容も示されています。