2014.5.28

前へ
次へ
ホームページトップへ戻る

CPLD+SIMMを使ってUSBプロトコルの解析を!
VHDLを速習! XC95144XL+16MB・SIMMを使ってUSBプロトコルアナライザを作ってしまいました!
主目的は差し迫った事情からUSBプロトコルの解析をすることだったのですが、その手段として選んだのがコレ!


[第57回]


●ハードウェアによるウォームブート(8)

前回からの続きです。
前回は残る第二の問題点

2)CPU(Z8S180)はPIC18F14K50との間でUSB通信のためのデータのやりとりを行っている。
突然のCPUリセットはシステムをハングアップさせてしまうが、それを避けるにはどうすればよいか。

ということについて、ハングアップを回避することができるかどうかという点はさておいて、とにかくCPU RESETが発生したことをどうやってPIC18F14K50に知らせたらよいかについて、皆様も考えてみてください、と書いたところで終わりました。
皆様おわかりになりましたでしょうか?

Z8S180とPIC18F14K50との間でデータの送受信を行なうための信号線は全部使ってしまっていて、CPU RESETが発生したことを知らせるための信号線を用意することはできません。
ここで「全部使ってしまっている」というところがミソなのです。
まてよ。
ということでデジタル的に思考してみますと。

Z8S180からPIC18F14K50にデータを送るときにはRB7をLにします。
逆にZ8S180がPIC18F14K50にデータを要求するときはRB6をLにします。
このことを下に表でまとめてみますとこうなります。

送信も受信もない CPU→PIC PIC→CPU  ?
RB7      1    0    1  0  
RB6      1    1    0  0

おわかりいただけましたでしょうか?
そうです。
RB7とRB6を同時にLにする、という選択肢は未使用のまま残されていました。
これを使えば、Z8S180がPIC18F14K50と更新中に突然CPU RESETが発生してもPIC18F14K50をハングアップさせないようにしつつ、PIC18F14K50にCPU RESETを知らせることができそうです。

前回少し書きましたようにCPU RESETによってZ8S180はメモリ(RAM)の00000番地からプログラムの実行を開始します。
そこであらかじめRAMの00000番地〜にウォームブートプログラムを書いておきます。
そのウォームブートプログラムではRB7とRB6を同時にLにするようにします。

次にPIC18F14K50の側のプログラムです。
PIC18F14K50はZ8S180からデータの送信があるか、あるいはデータの送出要求があるかを常に監視しています。
RB7がLになったときはZ8S180からデータを受信するルーチンを実行します。
RB6がLになったときはZ8S180にUSB受信データを送出するルーチンを実行します。
もともとそのようになっているプログラムに以下の部分をそれぞれ書き加えます。

RB7がLになったときはZ8S180からデータを受信するルーチンを実行しますが実行中は常にRB6の状態を見ていてRB6がLになったら受信処理を打ち切ってCPURESET処理を実行します。
RB6がLになったときはZ8S180にUSB受信データを送出するルーチンを実行しますが実行中は常にRB7の状態を見ていてRB7がLになったらUSB受信バッファをクリアしたうえでCPURESET処理を実行します。

このようにプログラムを変更することでPIC18F14K50はCPU RESETが発生したことを知ることができ、同時にハングアップも回避できます。
しかしもうひとつ問題が残っています。
突然のCPU RESETはPIC18F14K50をハングアップさせると同様に、そのPIC18F14K50とUSBを介してつねに交信しているWindows側のプログラムもまたハングアップさせてしまう可能性があります。

そこでPIC18F14K50がZ8S180からCPU RESETの発生を伝えられると、PIC18F14K50はそのことをUSBを介してWindows側のプログラムに伝えるように、それぞれのプログラムを変更しました。
具体的にはそのことを示す特殊なコードをPIC18F14K50からWindows側のプログラムに送るようにしました。
Windows側のプログラムはUSBを介して送られてくるデータをつねにチェックして、CPU RESETを示す特殊コードを発見したら、そのための処理を実行するようにプログラムを書き換えました。

そのように書きますと一言で済んでしまいますが、特にWindows側のプログラムは突然にZ8S180がリセットされてしまうことは想定外でしたから、Z8S180のプログラムがウォームブートを行なうのに合わせて、Windows側のプログラムを書き換えるのはなかなかに面倒なことでした。

まあしかし、なにはともあれ、やっとクリアできてやれやれでありました。

CPLD+SIMMを使ってUSBプロトコルの解析を![第57回]
2014.5.28upload

前へ
次へ
ホームページトップへ戻る