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

シフトレジスタ 74HC597から Arduinoへ SPIでデータを受ける

シフトレジスタ 74HC597から Arduinoへ SPIでデータを受ける

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

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

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

74HC597 から Arduinoへデータを受ける方法

接続図

データを受信する場合も、Arduino からデータを送ります。このとき送信するデータはダミーデータです。SPI.transfer(dummyData) でダミーデータが COPI\text{COPI} に送信され、同時に受信した CIPO\text{CIPO} のデータは戻り値として出力されます。
ダミーデータは 74HC597 では利用しませんから、COPI\text{COPI} はどこへも接続しません。利用するのは送信時に出力されるシリアルクロック SCK\text{SCK} で、74HC597 のシフトクロック SHCP\text{SH}_\text{CP} に接続します。

74HC597 側では、チップセレクト CS\overline\text{CS} を受けてパラレルロード PL\overline\text{PL} を生成し、ストレージレジスタからシフトレジスタへデータを渡します。そして SCK\text{SCK} に同期してデータを CIPO\text{CIPO} へ送出します。
送信が完了すると CS\overline\text{CS} が HIGH になりますので、これをストレージクロック STCP\text{ST}_\text{CP} として、外部からのパラレルデータをストレージレジスタへ読み込みます。つまり、74HC597 から送られてくるデータは、一回前の通信が完了したときのデータということになります。

タイミングダイヤグラム

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

ペリフェラル (74HC597) 側。CS\overline\text{CS}STCP\text{ST}_\text{CP} につながっているが、LOW になっても何も起こらない。
CS\overline\text{CS} の立ち下がりエッジで、一定時間のパラレルロード PL\overline\text{PL} パルスを生成する。これにより、シリアルデータ Q7\text{Q7} に データ D7\text{D7} が出力される。
SHCP\text{SH}_\text{CP} (SCK\text{SCK}) の立ち上がりエッジでデータをシフトし、8ビットのデータが CIPO\text{CIPO} へ送られる。コントローラも、データを SCK\text{SCK} の立ち上がりエッジで読み込み、SPI.transfer() の戻り値として出力する。
受信が終了し CS\overline\text{CS} が HIGH になると、それがストレージクロック STCP\text{ST}_\text{CP} となり、新たなデータがストレージレジスタへ読み込まれる。

回路図

回路図

Arduino は Nano Every です。使用するピンは、SCK\text{SCK} が D13、CIPO\text{CIPO} が D12、CS\overline\text{CS} は D8 です。UNO や NANO では CS\overline\text{CS} は D10 ですので、間違えないように。COPI\text{COPI} (D11) は使用しません。
左の Dip スイッチで 8ビットのデータを生成、それをシフトレジスタ 74HC597 に読み込み、Arduino へ送ります。
下部の NOR ゲート 74HC02 を使った回路はワンショットパルス回路。チップセレクト CS\overline\text{CS} が LOW になったときに、パラレルデータをロードするための PL\overline\text{PL} を生成します。パルス幅は 90nsほどになっています。

スケッチ

9行目。Arduino Nano Every では CS\overline\text{CS} のピンモードを設定してやらないとうまく動きません。UNO や NANO では必要ないです。
Dipスイッチで生成した 8ビットデータが、シリアルモニタに出力されます。

spi_receiving_test.ino

// Sketch for 74HC597 to Arduino SPI-Test 2023.9.10 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); Serial.begin(9600); SPI.begin(); } void loop() { static byte receivedValue = 0; SPI.beginTransaction(mySettings); digitalWrite(SS, LOW); receivedValue = SPI.transfer(0xff); digitalWrite(SS, HIGH); SPI.endTransaction(); Serial.println(receivedValue, BIN); delay(50); }
1
1
meyon230のアイコン画像
電子工作とかパソコンとかネットワークとかプログラミングとか、いろいろ。
  • meyon230 さんが 2023/09/21 に 編集 をしました。 (メッセージ: 初版)
  • meyon230 さんが 2023/09/21 に 編集 をしました。 (メッセージ: 一般公開)
  • meyon230 さんが 2023/09/21 に 編集 をしました。 (メッセージ: タグ「SPI」を追加)
  • meyon230 さんが 2023/11/01 に 編集 をしました。 (メッセージ: リンク先URL変更)
ログインしてコメントを投稿する