ロジックICでマイコンとSPIしてみた
前書き
マイコンとかをいじっていて、内部の変数を見たいんだけどいっぱい線を引かずに済む方法は無いかなって思うこと無い?
個人的にはマイコンからSPIで吐いて74HC595でLEDを点けるのが好きでバーLEDとか7セグとかいくつか作った事がある。
今回は74HC165も使って読み書きの両方ができる回路を作って、忘備録としてここに多少書いておくことにした。
概要
百聞は何とかなのでとりあえず動画と概略図。マイコン(MCU)との8bitの入出力(スイッチ8個の状態を読んだり、LED8個を好きなパターンで点けたり)が、SPIの信号線4本だけ(と正確には絵に書いてないけど電源とGNDの合計6線)でできる。そんだけ。
わーい!ロジックICでSPI入出力デバイスできた! pic.twitter.com/qPRE7FlmYh
— TEFSOM (@Si_SJ_MOSFET) 2020年7月24日
部品
使ったロジックICは74HC595(LED点ける)、74HC165(SW読む)、74HC04(論理ひっくり返す)の3つだけ。意外と少なく済んだ。(実は最初に165じゃなくて595と対の597を使おうとしてたけど、入力をラッチするパルスを作るのが面倒なのと入手性が165よりも悪いので165にした。あと164はデータの書き換え中に出力を保持できないので595の方が好き。)
スイッチ(SW)は、秋葉原のaitendoの近くに遊舎工房ってお店ができたときに寄って買って部品箱に眠ってたキースイッチ。たしか以下の紫のやつ。別に普通のスイッチでも全く問題はないけど使ってみたかっただけ。LEDは普通に秋月の3mm砲弾型。
https://yushakobo.jp/shop/kailh-pro/
(雑談:そういや秋葉原に行ったときは秋月と千石に行くのは書くまでもないとして、aitendoで黒いプラスチックスペーサーセット(秋月のセットのよりクオリティ高いしばら売りのよりコスパ良いと思う)を買いつつ変なキットとか表示デバイスとかを見るのがルーチンだったな。またいつかぶらぶらしたい。)
回路図
こんな感じ。そんなに変な事はしていない。よく見るとあちこち負論理になってるのに気付くかもしれないけど、単なる好みの問題なので気にしないように。
そういやLEDの抵抗を何Ωにするかで年がばれる的なツイートを見たけど、自分は単に考えるのが面倒なので「とりあえず約1mA流れる抵抗値にして、暗すぎたり明るすぎてどうしようもなければ調整する」ことにしている。
あと真面目に考えると、MISOにスリーステートバッファを入れないと他のと衝突しないかとか気になるけど、今回は1つだけ使う想定として省略。(しばらくして発掘したときにこれを忘れて2つ使おうとしてヘンテコ波形で悩むとかありがちなのでメモとして残しておく。)
動作
今回の回路図だとSPIするときの波形はこうなる。SPIの波形ってクロックとデータの関係によって4通りあって更にSSが正論理か負論理かとかもあるからマイコンの設定には気を付けよう。読めないときは大抵設定を勘違いしている。(個人的にはこの設定はクロックより先にデータが出てきてクロックの立下り(ネガティブエッジ)でデータを読むので「先出しネガ読み」とか言ったりするけど当然誰にも通じないので注意)
説明
これで終わりでも良いけど図2の回路と図3の波形になる説明をちょっと書いてみる。
74HC165は図4に示すように、ロードモード(LD/SFがロー)の間に各入力(H~A)を読んで、シフトモード(LD/SFがハイ)にしてクロック(CLK)を入れると、クロックの立ち上がりでデータがシフトされて出力(QH)される。(上付きバーを打つのが面倒なので下線にした)
74HC595は図5に示すように、シフト用クロック(SCLK)の立ち上がりでシリアル入力(SI)を読んで、ラッチ用クロック(RCLK)の立ち上がりで各出力(QH~QA)が更新される。
もし仮に165と595に同じクロックを使うと図6みたいにSPIの違うモードが混ざった波形ができてしまって困る。なので色々手抜きで済むようにちょっと考えて各部の波形を図7みたいにすればいいやという結論に着地する。SSとかが負論理なのは好みの問題。
あとの書いてないピン等はデータシートで。データシート読まずに失敗するのはテストで問題文を全部読まずに回答して間違えるのとおんなじようなもんだって聖書にも書いてあるとかいないとか。そういえば聖書で思い出したけどロジックIC好きのバイブルといえば「CPUの創りかた」だと思うのでみんな読もう。あと几帳面な読者はこの記事中の記号が図と回路とデータシートとかで揃ってないことが気になるだろうけどこのピンだなと察してほしい。以上!