最近「I2C式通信」のICをやって来ましたが、どうもSlave動作はハードが組み込まれているPIC16F88のようなICでないとメモリーを使い「作りづらい」です、不可能ではないと思いますがSoft作りが面倒です。
そこで簡単な2線式通信を実験しました。この程度の物は誰でも気が付くと思いますがとにかくやってみた所、何とかDATAは転送出来ました。
8bitで256uSec(4MHz:256Steps)のスピードで送れそこそこです。普通DATAは一方的に送っている事が多く、大きなシステム等私たちは稀にしか作りません・・・この程度でも間に合います。
送信と受信のタイミング
動作はI2C式通信を参考にしています。つまりスタートは同じく2本の信号線を[0]にしてスタートとしました。
8bitを先端から順次出し、クロックを送信しているだけです。必要ならこれを何回か繰り返してDATAを送ることが出来ます。受信側はこれの逆をさせてDATAを受け取ります。プログラム自体は簡単でもっとうまい方法があるかも知れませんが「動いてから改善していけば良い」として進めてきました。
動作に付いて
1.スタートとし送信側「DATA線(MDA・MCL)を[0]にします」これを検出するまで受信側は待機します。
2.送信のDATA送出は先頭のbit分をMDAに設定します。
3.送信は「クロック(MCL)を立ち上げ」ます。
4.受信側は立ち上げを見てDATAを取り込みますが、それまで待ちます。
5.送信は「クロックを立ち下げ」ます。これでMCL信号が出ました。
6.受信側は、この立下りを確認します。
7.1bit分シフトし8回実行、終わらなければ[2]へ戻ります。
8.送信はMDA・MCLを[1]にしてストップとします。これでDATAを送信出来ました。
受信側はここをチエックしなくても作動します。今回のプログラムをシュミレーションで確認すると「259Steps]となりました。1mSで約3Byteぐらい送れるようです(内部発振4MHz動作)。
実験をして
サンプルプログラムは「DATAを5として送信」しました。約1秒後の2回目はこれをひっくり返して送信、次回はまた逆にすると[5]になります。
ハードはLEDを点灯させ1秒ごとに点滅し動作が確認出来ます。実験では2本線の直結でも作動します、プルアップの必要はありませんが後で改善するかも知れないので付けています、Rは12KΩを使っています(現在は使わないのでなくても作動)。
それからMDA・MCLの信号線名は勝手に私が付けました。I2Cと同じSDA・SCLにしては混乱する為です。
複雑な物、例えば「DATAのやり取りが必要」などは従来からある[I2Cコントロール]でやれば良いのです、この通信はI2Cに対抗する物ではありません。
送受のプログラムもコントロールミスしなければ逆も可能で、Softを入れ替えれば送受も可能です(同じ2本の信号線を使って、です)。サンプルプログラムです(送信と受信を重ねています)。
2011/1/17 作成