meyon230のアイコン画像
meyon230 2023年09月21日作成 (2023年11月01日更新)
セットアップや使用方法 セットアップや使用方法 Lチカ Lチカ 閲覧数 328
meyon230 2023年09月21日作成 (2023年11月01日更新) セットアップや使用方法 セットアップや使用方法 Lチカ Lチカ 閲覧数 328

Arduinoからシフトレジスタ 74HC595へ SPIでデータを送る

Arduinoからシフトレジスタ 74HC595へ SPIでデータを送る

SPI (Serial Peripheral Interface) とはどんな通信方式なのかを勉強して、Arduino からシフトレジスタ 74HC595 (SIPO) へ SPI でデータを送る実験をしてみました。

この記事は「meyon's STUDY」に投稿した記事の抜粋です。

なお、Arduino 公式サイトのアナウンスに従い、用語の言い換えをしています。新しい用語については Arduino & Serial Peripheral Interface (SPI) を参照してください。

Arduino から 74HC595 へデータを送る方法

接続図

Arduino では、SPI のコマンドである SPI.transfer(value) で内部のシフトレジスタへデータ value が渡され、COPI\text{COPI} をとおして送信が始まります。74HC595 は、Arduino から送られてくるシリアルクロック SCK\text{SCK} に同期してデータを受け取ります。すべてのデータが送信されたら Arduino から CS\overline\text{CS} 信号が送られてきますので、ストレージレジスタへデータを渡します。

タイミングダイヤグラム

コントローラ (Arduino) 側では、チップセレクト CS\overline\text{CS} を LOW にすることで通信を開始し、終了したら HIGH にもどす。SPI.transfer() を実行すると、COPI\text{COPI} にデータ D7 がセットされ、シリアルクロック SCK\text{SCK} が送出される。SCK\text{SCK} は 8クロック出力され、それにともなって送信データがシフトする。

ペリフェラル (74HC595) 側。CS\overline\text{CS} は レジスタクロック RCLK\text{RCLK} につながっていて、LOW になっても何も起こらない。SCK\text{SCK} は シフトクロック SRCLK\text{SRCLK} につながるが、クロックが入ってこなければ何も起こらない。つまり、待機状態。
COPI\text{COPI} は シリアル入力 SER\text{SER} につながっているので、Arduino 側でデータ D7 が COPI\text{COPI} にセットされると、それが SER\text{SER} に入力される。SCK\text{SCK} が入るたびにデータを受けとり、シフトして、8ビットのデータがシフトレジスタから出力される。送信が終了し CS\overline\text{CS} が HIGH になると、それがレジスタクロック RCLK\text{RCLK} となり、データがストレージレジスタから出力される。

回路図

回路図

Arduino は Nano Every です。使用するピンは、SCK\text{SCK} が D13、COPI\text{COPI} が D11で UNO や NANO と同じですが、CS\overline\text{CS} は D8 です。UNO、NANO では D10 ですので、間違えないように。
CIPO\text{CIPO} は入力端子ですので、GND もしくは +5V につないでおきます。うっかり出力ポートにしちゃったりすると悲惨な目にあいますので、1kΩ の抵抗を保護のためにつけておきましょう。

スケッチ

Arduino Nano Every では CS\overline\text{CS} のピンモードを設定してやらないとうまく動きません。UNO や NANO では必要ないです。
Arduino で生成された 8ビットのカウントデータ 0x00~0xFF が、LEDに表示されます。

spi_transmission_test.ino

// Sketch for Arduino to 74HC595 SPI-Test 2023.9.8 meyon #include <SPI.h> SPISettings mySettings(8000000, MSBFIRST, SPI_MODE0); void setup() { // In Nano Every,SS is pin-D8, Mode setting required pinMode(SS, OUTPUT); SPI.begin(); } void loop() { for (int value=0x00; value<=0xFF; value++) { SPI.beginTransaction(mySettings); digitalWrite(SS, LOW); SPI.transfer(value); digitalWrite(SS, HIGH); SPI.endTransaction(); delay(50); } }
meyon230のアイコン画像
電子工作とかパソコンとかネットワークとかプログラミングとか、いろいろ。
  • meyon230 さんが 2023/09/21 に 編集 をしました。 (メッセージ: 初版)
  • meyon230 さんが 2023/09/21 に 編集 をしました。 (メッセージ: 一般公開)
  • meyon230 さんが 2023/11/01 に 編集 をしました。 (メッセージ: リンク先URL変更)
ログインしてコメントを投稿する