今回はCH552のプログラムを作って、動作の確認をしていきます。しかしながら、今回は次から次へと問題が噴出してきます。
プログラムが実行されない
まずは、基板に搭載されているLEDを点灯させるところから始めます。LEDはマトリックス接続されています。とりあえず、LED_YをHIGHに、LED_XをLOWにすることでLEDを点灯させることができます。
プログラムは以下のとおりです、IOピンの設定と、出力設定だけとなります。
const int LED_PIN_Y0 = 10; const int LED_PIN_Y1 = 11; const int LED_PIN_Y2 = 12; const int LED_PIN_X0 = 13; const int LED_PIN_X1 = 14; const int LED_PIN_X2 = 15; const int LED_PIN_X3 = 16; void setup() { pinMode(LED_PIN_Y0, OUTPUT); pinMode(LED_PIN_Y1, OUTPUT); pinMode(LED_PIN_Y2, OUTPUT); pinMode(LED_PIN_X0, OUTPUT); pinMode(LED_PIN_X1, OUTPUT); pinMode(LED_PIN_X2, OUTPUT); pinMode(LED_PIN_X3, OUTPUT); digitalWrite(LED_PIN_Y0, HIGH); digitalWrite(LED_PIN_Y1, HIGH); digitalWrite(LED_PIN_Y2, HIGH); digitalWrite(LED_PIN_X0, LOW); digitalWrite(LED_PIN_X1, LOW); digitalWrite(LED_PIN_X2, LOW); digitalWrite(LED_PIN_X3, LOW); } void loop() { }
このプログラムを書き込んでみましたが、LEDが点灯しません。
あまりに単純なプログラムなので、プログラムが間違っていることは考えられません。
これまで、CH552のマイコンモジュールを何十個も作ってプログラムを書き込んできましたが、動作しないことは一度もありませんでした。
いつもと違う点は何なのか考えてみたところ、いつもは5Vで動作させているのに、今回は3Vで動作させています。
それが原因でした。CH552は5Vと3Vではクロックの最大動作周波数が異なります。コンパイル時の設定で16MHzに下げました。
するとシアン色のLEDだけが点灯するようになりました。とりあえずプログラムは動作するようになりました。
赤色LEDが点灯しない
LEDマトリクスには11個の赤色LEDと、1個のシアン色LEDが接続されています。今、LED_YはHIGH、LED_XはLOWになっています。このためシアン色のLEDだけでなく、赤色LEDも点灯するはずです。むしろ、順方向電圧の高いシアンは点灯せずに、赤色LEDが点灯するはずなのです。
テスターでLEDが点灯するか確認してみました。すると、とんでもないことがわかりました。
このLEDは、マーキングが通常の極性と反対になっているのです。通常、表から見た場合、カソード側に緑色のマーキングがあります。また裏面にある三角形の角の方向がカソードです。このLEDは反対でした。
データシートを確認してみます。なんと反対が正しいのです。こんなの初めてです。
赤色のLEDの極性が逆に取り付けられていることがわかったので、シアン色のLEDも逆に取り付けて、全てを反対にします。
プログラムも極性を逆にして、LED_YをLOW、LED_XをHIGHとしました。
無事に赤色LEDが点灯しました。予想通り、順方向電圧の高いシアン色LEDは点灯しませんでした。
LEDが点灯することがわかったので、マトリックス制御して目的のLEDのみ点灯できるようにプログラムします。
LEDを個別に点灯できるようになりました。
USBケーブルが問題を巻き起こす
D+D-ピン間のショート検出に成功
ピン間のショート実験ができるように、ターゲット基板を作りました。ターゲット基板と検出回路とは、USBケーブルで接続してあります。
プログラムでアナログスイッチをD+とD-につながるように設定します。また、ターゲット基板ではD+とD-をジャンパーワイヤーでショートします。
すると、検出回路のコンパレータの出力がHIGHとなりました。ジャンパーワイヤーを外すとLOWになります。
回路が正常に動作し、D+とD-ピンのショートを検出できることがわかりました。ショート検出回路は正常に動作することがわかりました。
VBUS・GNDピン間が測定できない
続いてVBUSとGND間のショートが検出できるか、確認してみます。プログラムでアナログスイッチをVBUSとGNDに接続します。ターゲット基板のVBUSとGNDを、ジャンパーワイヤーでショートします。
するとどうでしょう。コンパレータの入力電圧が0Vになってしまい、結果はLOWになってしまいました。検出用の0.3V電源出力も0Vになってしまっています。ジャンパーワイヤーを外す(ショートを解除する)と検出用の0.3Vが回復します。GNDピンが、回路のGNDとつながっているかのような動作です。
テスターで色々調べると、USBケーブルのGNDピンが、USBコネクタの外側の金属(シールド)とつながっていることがわかりました。
原因は、ケーブルのGNDとシールドが接続されていることでした。ケーブルのシールドは、USBコネクタのシールドと接続されます。またコネクタのシールドは、基板上でGNDに接続されています。このため、USBコネクタのGNDピンは、回路のGNDと接続されてしまうのでした。
USBケーブルのシールドとGNDの線が接続されていますが、これは正しいケーブルなのでしょうか。USBケーブルやコネクタの規格を見てみます。
この規格書には、3.4.2章にケーブルの接続方法についても書かれています。
一番下のNote6に「シールドとGNDはコネクタの部分で接続するべきである」と書かれていました。ケーブル内ではシールドとGNDはつながっているんですね。
このため、GNDピンのショートを検出するためには、基板に実装されたUSBコネクタのシールドを、GNDから浮かす必要があります。
これには基板の設計変更が必要です。仕方がないので、他のピンの確認に移りたいと思います。
SBUピンは結線されていない
続いて、VBUS・SBU2ピン間のショートが検出できるか確認です。ここでも問題発生です。ターゲット基板のVBUSには0.3Vが来ているのに、検出回路のSBU2ピンが0Vです。テスターで調べてみると、ターゲット側のSBU2ピンと検出回路側のSBU2ピン間がつながっていませんでした。
USBケーブルとしてSBUピンはどういう扱いなのでしょうか。もう一度規格書を見てみます。
GND、VBUS,CC,D+,D-とありますが、なんとその中に、SBU1もSBU2も存在していません。USB2.0のType-Cケーブルの中では、SBUはつながっていないのです。
規格書には「Full-Featured Type-C Standard Cable」についても書かれてます。こちらのケーブルではSBUは結線されています。
しかし、SBU1のピンはケーブルの反対側ではSBU2につながっています。SBU1とSBU2はクロス接続されています。このため、ターゲットのSBU2を調べる際には、検出回路側のSBU1に接続しないといけないことがわかります。
何やら複雑なことになってきました。
CC1とCC2ピンは逆になることもある
続いてCC1・D-ピン間のショートが検出できるか確認です。この場合も、0Vとなり検出できませんでした。テスターで配線を調べてみると、検出回路側のCC1ピンはターゲット基板のCC2とつながっていました。
どうしてCC2につながっているかといと、USBコネクタには裏表があって、裏と表を逆につないでいたからでした。
普段、USB-Cコネクタは裏表を気にせずに使っています。これは裏表が反対に刺さっても、それを検出して正常に繋がるように回路的にどうにかしているからです。今回は裏表反対に刺していたために、CC1のピンの反対にあるCC2ピンにつながってしました。
USBケーブルの裏表も考慮しないといけないことがわかりました。
とりあえず、他のピンの確認に進みます。
CC2は存在しない
それでは次に、CC2ピンとVBUSピンの間のショートが検出できるか確認してみます。先ほどの実験でコネクタの裏表がが逆に接続されているため、CC1ピンとCC2ピンは入れ替わっていることがわかっています。このため、ターゲット基板でCC1とVBUSをショートしてみます。
しかしながら、検出回路側では0Vになってしまいます。テスターで調べてみると、検出回路側のCC2はターゲット基板のCC1とつながっていないのです。
これは、USBの規格書に理由が書いてありました。
実はCC2ピンはケーブルには存在しないのです。CC2ピンは、ケーブル内ではVCONNに接続されます。VCONNは何かというと、ケーブルに内蔵されているeマーカーの電源です。eマーカーは何かと言うと、ケーブルがどの通信速度まで対応しているかとか、どこまで電力を伝送できるかなどのケーブルの仕様を教えてくれるICです。eマーカーはRaでプルダウンされています。
さらに規格書には、USB2.0の場合、eマーカーは無くてもよい(正確にはあっても良い)と書いてあります。この場合、VCONNピンには何もつながっていません。
つまりのことろ、CC2同士はつながっていないのです。
結局D+,D-しかショート検出できなかった
結局のところ、D+とD-同士のショートしか検出することができませんでした。
そして、色々と問題がわかりました。
USBケーブルを使う場合、コネクタの裏表を考慮する必要があると言うこと。GNDとシールドがつながっていること。さらに、どんなケーブルを使ってもCC2ピン同士は結線されていないので、CC2ピンとのショートは検出できません。
このためケーブルは使わずに、全てのピンがあるUSB-Cのレセクタプルを、基板に直接実装する必要があります。
コネクタを探して基板を再設計したいと思います。
コメント