« RX-MEGAボードが出来上がってきた | トップページ | RX62NでArduinoシールドを操作! »

2011.07.19

J-Writerの高速化をめざして

じつは、J-Writerと特電RXボード上のUSB-JTAGは、同じUSBマイコンをほぼ同じファームウェアを使っています。最近、RXのデバッグを高速にできるようにしたいと強く思い、この3連休を利用して高速化のための改良を行っていました。
題して、「J-WriterもRX62NのUSB-JTAGも3倍速くしちゃおうプロジェクト」です。

RX用のUSB-JTAGが速くなれば、J-Writerも速くなります。だからこの際一挙に両方改良してしまいます。

下の写真は特電 究極のRX62Nボードの写真です。
見てのとおり2つのUSBポートがあり、いま挿さっているUSBのほうがUSB-JTAGのものです。
Rx_usbjtag

このUSB-JTAGはオンボードの78Kマイコン(uPD78F0730)です。
そうです、トラ技の付録についてきたUSBマイコンです。

いままではuPD78F0730のI/Oポートをソフトウェアで上げ下げして、JTAG信号を作り出していました。
そのため、とても遅かったのです。だいたい●0kHzくらいしかでません。

そこで、今回、uPD78F0730に内蔵されているCSI10というシリアル通信モジュールを使って8bit分のJTAG信号をハードウェアで作ることにしました。CSI10は125kHz~8MHzまでのクロックに同期したシリアル通信を行ってくれます。

しかしCSI10は8bit固定なので、例えば27bitのJTAG信号を送信したいときには、8bit*3回+3bitと分けて送信しなければなりません。ここでポイントとなるのは、CSI10と汎用I/Oポートをうまく切り替えること。

78KマイコンはCSIとI/Oポートをセレクタで切り替えているのではなく、P1.0(クロック)についてはANDで、P1.2(MOSI)についてはORで共有させています。
P10blockP12block

したがって、一方のモジュールを無効にするときは注意が必要です。クロックはHに、データはLにしないともう一方のモジュールが動きません。

具体的には、ポートからCSIに切り替える場合は、

CSIC10.4 = 1; // アイドル時のCSIクロックをLにする
CSIM10 = 0xd0; // CSI有効
P1.0 = 1; // ポート側から出すクロックをHにする
P1.2 = 0; // ポート側から出すデータをLにする

このように、CSI側に切り替えてからポートのクロックをH出力にします。

CSIからポートに切り替える場合は、

P1.0 = 0; // ポート側から出すクロックをLにする
CSIM10 = 0x00; // CSI無効
CSIC10.4 = 0; // アイドル時のCSIクロックをHにする

と、ポートのクロックをLにしてからCSIを無効にするとひげが出ません。

これで、CSIとポートをスムーズに切り替えられます。そして8bit単位の高速な転送はCSIで、7bit以下の転送はポートで、と使い分けられるようになりました。

実際にCSIに送信データを送る部分はアセンブラ化して、


mov a,[hl]
?Ltxrx3:
mov SOTB10,a
incw hl
mov a,[hl]
?Ltxrx4:
bt CSIM10.0,$?Ltxrx4
dbnz b,$?Ltxrx3
pop hl

とすれば、配列から次の送信データを取ってくるのに3命令・20クロックサイクルでできます。78Kマイコンは最短で2クロック/1命令ですが、実際の命令では5~10クロックかかるので1μ秒に2命令くらいしか実行できません。意外と遅いのです。

苦労した結果、データの間隔は1.2~1.4μ秒にまで縮まりました。
78k_csi_tx

このCSI10というペリフェラルでJTAG信号を生成するには、データの送信だけではなく、受信もしなければならないので、プログラムはもっと複雑になりますが、間隔は3μ秒以下にすることができました。

高速化のネックとなるのは、トラ技BIOSとセットになっているUSBファームウェアの遅さです。USBファームウェアは内部にリングバッファを持っています。ユーザが用意したバッファ上のデータをUSBに送信するには、ユーザバッファ→リングバッファ→USB FIFOと2回の転送を行わなければなりません。受信の際も同様です。
このデータ転送はファームウェアの中と、割り込み処理ルーチンの中で、for文をブンブン回して行われていますが、1バイト転送するたびにif文でリングバッファの境界検査をしているので、とても遅いのです。
より高速化のためには、このしくみを抜本的に改良することが必須と考えています。

さて、こうしてCSI版のJTAG信号が効率よく出せるよう、ファームウェアを全面的に書き換えました。
その結果、バウンダリスキャンの速度が2.3倍になりました。

従来は、RX62Nを1回バウンダリスキャンするのに約9msかかっていました。
78kjtag_oldfirm

上の図はSDRAMのメモリテストの波形です。

それが、新しいファームウェアではRX62Nのスキャンに約4msになりました。
78kjtag_newfirm

USB越しなので時間が1ms単位なのは仕方がないとして、最短で2msまで縮められるはずです。

|

« RX-MEGAボードが出来上がってきた | トップページ | RX62NでArduinoシールドを操作! »

コメント

コメントを書く



(ウェブ上には掲載しません)




« RX-MEGAボードが出来上がってきた | トップページ | RX62NでArduinoシールドを操作! »