CH552TのRSTピンを入力用に使う
安価なUSBマイコンであるCH552Tは20pinだが、電源とグランドと3.3Vに加えて、USBを使うためには2つのピンを使うので、それ以外の使えるピンは15本となる。 さらに、通常はRSTピンはリセットするために使われるので、実質的に使えるピンは14本である。 しかし、RSTピンによるリセットを無効にすると、入力ピンとして使うことができるようになる。 ネットを探したが、そのやり方に関する情報が見つからなかったので、いろいろと調べながら試行錯誤したら、入力ピンとして使うことができたので、その方法を書いておく。
まず、リセット機能を無効にするために、flashにあるconfiguration dataのEN_RST_RESETを変更しなければならない。 いろいろなツールのソースを見ていたらch55xtoolを使うと、これが実現できそうなことが分かった。 debianでインストールするには、少し工夫が必要だったが、以下のようにすれば動くようになった。
pipx ensurepath python3 -m pipx install ch55xtool sudo aptitude install python3-usb
権限の問題を設定するのが面倒だったので、sudoを使ったら、pathを指定しないといけなくなった。 それなら、ensurepathをしないでも良いのかも知れない。 まず、DFUモードにして、以下のコマンドを実行して、現在の設定を表示する。
sudo ~/.local/bin/ch55xtool -p
購入したばかりのICでは、USBに接続するとDFUモードになるので、そのまま実行でき、以下のような結果が表示される。
Found CH552 with SubId:17 BTVER:02.50 UID:??-??-??-??-??-??-??-?? Chip configs 0xFFFFFFFF 0xFFFFFFFF 0x000052FF Finalize communication. Done.
最後の数字のbit12がEN_RST_RESETで最初は1となっている。 USBを指し直して、すぐに以下を実行すると、リセットを無効にできる。
sudo ~/.local/bin/ch55xtool -p -a Dis_RST_RESET --cfgs_options_force_action
もう一度設定を確認すると数字が変わっているのが分かる。
Chip configs 0xFFFFFFFF 0x0000000F 0x000042FF
5から4となり、その二進数の1の桁が0となっており、EN_RST_RESETが0に変わっている。
データシートを見ても説明は無いので、細かいことは分からないが、リセット機能を無効にしても、pull-down抵抗は有効のままのようである。 RSTピンの状態を読み取るには、CLOCK_CFGレジスタのbRSTビットを確認すれば良い。 例えば、ch55xduinoでこれを実現するプログラムは以下の通りである。
uint8_t readRST(){ __data uint8_t bit = bRST; __data uint8_t portBuf = CLOCK_CFG; if (portBuf & bit) return HIGH; return LOW; }
digitalReadと同じように書けないのが残念だが、特殊なピンなので仕方がないかな。 でも,adruinoでプログラムを書き換えたら,RSTの設定が元にもどってしまったので,P3.6とV33を短絡してUSBケーブルをさしてDFUモードに入って,もう一度ch55xtoolから設定し直した.
CH552TでUSBを使う場合でも、このようにすれば入力として1ピン、入出力として14ピンで、合計15ピンを使うことが出来るようになる。 使えるピンの数が多くなることによって、CH552Tの活用の幅が広がると思う。