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の活用の幅が広がると思う。