マイコン独立大作戦
ROM/RAM/RTCボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
作戦その2はキーボードインターフェースです。
作戦その3は、SDカードインターフェースです。
作戦その4は、ROM/RAM/RTCボードです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第11回]
●受信データの波形
また間が空いてしまいました。
5日ぶりの更新です。
いえ、遊んでいるひまなどありません。
私には土曜日も日曜日も祝日もありません。
ひたすら仕事に励んでおりました。
もう真性ワーカーホリックです。
なかなか自分で思っているほど進捗しないのが悩みなのですが、それでもこの5日間であれこれかなり進んだと思います。
その成果はいずれまたHP上に整理して書くことになるかと思います。
さて、今回は前回の続きです。
前回はDS1307に日時データを送信しました。
今回はDS1307から日時DATAを受信します。
受信は送信に比べると少し面倒です。
DS1307との通信では、最初にデバイスIDを送り、次に書き込みまたは読み出しを開始するレジスタアドレスをDS1307に送ります。
この部分は送信でも受信でも同じです。
送信の場合にはそのあと続いて日時データを送信しますが、受信の場合にはレジスタアドレスを送信したあと一旦送信を終了して、そのあと受信に切り換えてもう一度デバイスIDを送ったあと、日時データを受信します。
必要なデータを受信し終わったらそこでSTOPを出力して通信を終了します。
前回と同様、通信の様子をカメレオンUSB+ロジアナで観測しましたので、その波形を下に示します。
PROBE00(上側の波形)がSCLでPLOBE01(下側の波形)がSDAです。
画像編集作業をラフに行なっていますので3番目の波形(PLOBE02)も表示されているところもありますが意味はありませんから無視してください。
SCLがHのときにSDAをLにするとそれがスタート信号となります。
そこから送信スタートです。
DS1307のデバイスbニして1101000を送った後R/Wビットの0を送り、そのあと4800μS〜4820μSのところでDS1307からACK(Lレベルの信号)が送出されています(4800μS〜4820μSは下図の先頭のパルスのところです)。
そのあとレジスタbニして00を送っています。
4840μSから5040μSまで8ビットの0の送信のあと、5060μSのところでDS1307からACKが送出されています(5060μSは下図の先頭のパルスのところです)。
ここまでは前回のデータ送信の場合と同じです。
ここでデータ受信に切り換えるために一旦STOPを送って、そのあとSTARTを送っています。
5080μSのところでSCLが立ち上がった直後にSDAをLからHにしています(上の波形では同時に見えますがSCLをHにしたあとでSDAをHにしています)。
波形からはわかりませんがこの操作のために5060μSでACK受信のためにSDAにHを出力したあと一旦H→L出力にしています。
STOP出力はSCLの立ち上がり直後でそのあとSTART出力のためのL出力までは5μS以上の間を置いています。
STOPについてはそういうことでよいのかDS1307のデータシートでは確認できませんでしたが、特に問題なくDS1307の応答が得られましたので、そういうことでよいと思います。
ここではSTARTのあともう一度DS1307のデバイスIDとして1101000を送っています。
今度は受信ですから、そのあと8ビット目のR/Wビットとして1を送信しています。
そのあとの5320μSのところでDS1307からACKが送出されています。
ここからは受信モードに切り換わります。
5360μSから5500μSまでDS1307からレジスタ0のデータが送信されています。
00110100ですから前回送信したときと同じ34です。
レジスタ0は秒の値です。
前回送信を開始したときからまだ5400μSしか経過していませんから、時刻データは同じ値が読み出されて正解です。
しかしそれだけではDS1307が停止しているのか正常に動作しているのかということまではわかりません。
実は正常に動作していることは、間を置いて繰り返しデータを受信することで確認済みです。
DS1307からのデータ送信は5500μSのSCLの立ち下り直後にHに変わっています。
これはDS1307がホストからのACKを受けるために出力をHにしたためです。
CPUからはここでACKとしてLを出力しています。
次のデータはレジスタ1です。
レジスタ1は分の値(BCD2桁)です。
5560μSから5720μSまでがDS1307からの送信データです。
そのあとCPUからは5740μSでACKを出力しています。
受信したデータは送信した値と同じ26です。
次はレジスタ2です。
レジスタ2は時の値(BCD2桁)です。
5780μSから5940μSまでがDS1307からの送信データです。
そのあとCPUからは5960μSでACKを出力しています。
受信したデータは送信した値と同じ16です。
次はレジスタ3です。
レジスタ3は曜日の値(BCD2桁)で01〜07です。
6000μSから6160μSまでがDS1307からの送信データです。
そのあとCPUからは6180μSでACKを出力しています。
受信したデータは送信した値と同じ01です。
次はレジスタ4です。
レジスタ4は日の値(BCD2桁)です。
6220μSから6380μSまでがDS1307からの送信データです。
6220μS〜6240μSはひとつ前のレジスタ3の画像にあります。
そのあとCPUからは6400μSでACKを出力しています。
受信したデータは送信した値と同じ25です。
次はレジスタ5です。
レジスタ5は月の値(BCD2桁)です。
6440μSから6580μSまでがDS1307からの送信データです。
6440μS〜6480μSはひとつ前のレジスタ4の画像にあります。
そのあとCPUからは6600μS〜6620μSのところでACKを出力しています。
受信したデータは送信した値と同じ06です。
次はレジスタ6です。
レジスタ6は年の値(BCD2桁)です。
6640μSから6800μSまでがDS1307からの送信データです。
6440μS〜6480μSはひとつ前のレジスタ5の画像にあります。
そのあとCPUからは6820μSのところでACKを出力しています。
受信したデータは送信した値と同じ17です。
次はレジスタ7です。
レジスタ7はコントロールデータです。
6860μSから7020μSまでがDS1307からの送信データです。
そのあとCPUからは7040μSのところでACKを出力しています。
受信したデータは送信した値と同じ10です。
なおここでは動作テストなのでレジスタ7も読み出しましたが、レジスタ7は日時データではありませんから、通常は読み出す必要はありません。
また最後のデータを読み終わって、そこで通信を打ち切るときはACK(0)ではなくてNACK(1)を送るようにDS1307のマニュアルには書いてありますが([第8回]のFigure5参照)、その分プログラムが複雑になるので、最後もACKを送ったあとSTOP(SCLがHのときにSDAをLからHにします)を送っていますが特に支障はないようです。
ROM/RAM/RTCボードの製作[第11回]
2017.7.18upload
前へ
次へ
ホームページトップへ戻る