meyon230 が 2023年11月01日01時18分48秒 に編集
リンク先URL変更
メイン画像の変更
本文の変更
SPI (Serial Peripheral Interface) とはどんな通信方式なのかを勉強して、Arduino からシフトレジスタ 74HC595 (SIPO) へ SPI でデータを送る実験をしてみました。
この記事は「[meyon's STUDY](http://meyon.gonna.jp/study/electronic/9765/)」に投稿した記事の抜粋です。
この記事は「[meyon's STUDY](https://meyon.gonna.jp/study/electronic/9765/)」に投稿した記事の抜粋です。
なお、Arduino 公式サイトのアナウンスに従い、用語の言い換えをしています。新しい用語については [Arduino & Serial Peripheral Interface (SPI)](https://docs.arduino.cc/learn/communication/spi) を参照してください。 ## Arduino から 74HC595 へデータを送る方法
![接続図](http://meyon.gonna.jp/study/wp-content/uploads/spiTransmissionConnectionDiagram_431599.png)
![接続図](https://meyon.gonna.jp/study/wp-content/uploads/spiTransmissionConnectionDiagram_431599.png)
Arduino では、SPI のコマンドである SPI.transfer(value) で内部のシフトレジスタへデータ value が渡され、$\text{COPI}$ をとおして送信が始まります。74HC595 は、Arduino から送られてくるシリアルクロック $\text{SCK}$ に同期してデータを受け取ります。すべてのデータが送信されたら Arduino から $\overline\text{CS}$ 信号が送られてきますので、ストレージレジスタへデータを渡します。
![タイミングダイヤグラム](http://meyon.gonna.jp/study/wp-content/uploads/spiTransmissionTimingDiagram_431599.png)
![タイミングダイヤグラム](https://meyon.gonna.jp/study/wp-content/uploads/spiTransmissionTimingDiagram_431599.png)
コントローラ (Arduino) 側では、チップセレクト $\overline\text{CS}$ を LOW にすることで通信を開始し、終了したら HIGH にもどす。SPI.transfer() を実行すると、$\text{COPI}$ にデータ D7 がセットされ、シリアルクロック $\text{SCK}$ が送出される。$\text{SCK}$ は 8クロック出力され、それにともなって送信データがシフトする。 ペリフェラル (74HC595) 側。$\overline\text{CS}$ は レジスタクロック $\text{RCLK}$ につながっていて、LOW になっても何も起こらない。$\text{SCK}$ は シフトクロック $\text{SRCLK}$ につながるが、クロックが入ってこなければ何も起こらない。つまり、待機状態。 $\text{COPI}$ は シリアル入力 $\text{SER}$ につながっているので、Arduino 側でデータ D7 が $\text{COPI}$ にセットされると、それが $\text{SER}$ に入力される。$\text{SCK}$ が入るたびにデータを受けとり、シフトして、8ビットのデータがシフトレジスタから出力される。送信が終了し $\overline\text{CS}$ が HIGH になると、それがレジスタクロック $\text{RCLK}$ となり、データがストレージレジスタから出力される。 ## 回路図
![回路図](http://meyon.gonna.jp/study/wp-content/uploads/spiTransmission_schematic_431599.png)
![回路図](https://meyon.gonna.jp/study/wp-content/uploads/spiTransmission_schematic_431599.png)
Arduino は Nano Every です。使用するピンは、$\text{SCK}$ が D13、$\text{COPI}$ が D11で UNO や NANO と同じですが、$\overline\text{CS}$ は D8 です。UNO、NANO では D10 ですので、間違えないように。 $\text{CIPO}$ は入力端子ですので、GND もしくは +5V につないでおきます。うっかり出力ポートにしちゃったりすると悲惨な目にあいますので、1kΩ の抵抗を保護のためにつけておきましょう。 ## スケッチ Arduino Nano Every では $\overline\text{CS}$ のピンモードを設定してやらないとうまく動きません。UNO や NANO では必要ないです。 Arduino で生成された 8ビットのカウントデータ 0x00~0xFF が、LEDに表示されます。 ```C++: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); } } ```