NXPのUART-I2CブリッジSC18IM700でLチカ
すべての道はLチカに通ず
このチップの存在を知ったとき、あまり使うことはないかなとスルーしてたのですが、かなり使い道があると思ったのでちょっとだけ。
UARTさえあれば、プログラミングせずにI2Cデバイスと通信できるのでC言語とかVerilogとかぜんぜんぜんっ知らない僕でも使えちゃいます。ガハハハハ。
やめて石投げないで
気をつけるべきはRESETとWAKEUPの端子のプルアップくらいでしょうか。SC18IM700はデフォルトで9600baud、8N1で通信するので特に気にする部分もありません。って偉そうにいってSC18IM700の通信コマンド間違えてて動かない動かないと3時間唸っていたのでした。
とりあえずGPIOでも動かしてみる
SC18IM700+秋月のFT231XボードでTeraTermからLチカしてみました。
なお、SC18IM700のリセット後、'OK'という文字が送信されます。SC18IM700が動作しないように思えるときはこの文字が受信できているかまず確認します。
もしできていれば受信はOKなので、I2Cバスのプルアップ・速度が問題か、GPIOが動作していないのであればPortConfの設定を見直せばいいことになります。
詳細はデータシート参照のこと
TeraTermからコマンド送信
FT231X(USB-UARTで5V/3.3V系ならなんでもOKのはず)のTX/RXをSC18IM700のRX/TXと接続します。写真は秋月FT231X基板とダイセン変換基板に載せたSC18IM700です。
SC18IM700では文字データ以外の16進数も送受信するため、任意のバイナリデータを送受信できるようTeraTermの設定を変更します。
(1)debug=on にする
デフォルトでは C:\Program Files (x86)\teraterm\TERATERM.INI が設定ファイルになっていると思いますが、このINIファイルの
debug=off
の行を見つけ出し、(自分は475行目付近にあった)
debug=on
に書き換えて上書き保存する。
(2) 送受信エンコードをSJISに変更する
設定(S) -> 端末(T) -> 漢字ー受信(K)と漢字ー送信(J)のエンコードを両者ともSJISに変更する
(3) 16進表示モードに切り替える。
通信中にSHIFT + ESCを何回か押すと切り替わるはず。実動作に問題はないので切り替えは実際に通信が始まってからでOK
(4) 送信コマンドのマクロを書く
(例)UARTで0x12, 0x34 , 0x56を送信したい場合、
send $12$34$56
とマクロファイル(.ttl)に記述すればいい。
今回は以下のように書きました
send $57$02$AA$03$AA$50 ; GPIO全ピンを出力モード(push-pull)にする send $52$02$03$50 ; GPIO config(PortConf1,PortConf2)をリードする :blink send $4F$00$50 ; GPIOに0x00をライトする send $49$50 ; GPIOのピン状態をリードする(ライトした'00'がリードされるはず) mpause 1000 ; 1秒待つ send $4F$FF$50 ; GPIOに0xFFをライトする send $49$50 ; GPIOのピン状態をリードする(ライトした'FF'がリードされるはず) mpause 1000 ; 1秒待つ goto blink ; 繰り返し
上記のマクロをメモ帳などで記述し、 foobar.ttlみたいなファイル名で保存。
TeraTermのコントロール(O) -> マクロ(M)でfoobar.ttlを呼び出す。
TeraTermの画面はこうなるはず
GPIO0~7にLEDをつけて確認すれば2秒周期でLEDがブリンクしているのが確認できるはず。
mbedで動かないものはデバイスに非ず
SC18IM700が動かずにウンウン唸っていたところ、非合法組織クソコード撲滅委員会北関東支部のクマーおさんに助けていただきました。
https://developer.mbed.org/users/okano/code/SC18IM700_GPIO_pin_operation_sample/file/16ad158dc535/main.cpp
ホントに助かりました。ありがとうございます。マヨネーズ反対!
I2Cは?
手元にI2Cデバイスがないので動作を確認できないのですが、オシロで信号を見てみました。TeraTermマクロは以下の通り。
I2Cアドレス0xA0に1バイトデータ0xAAを送信するマクロです。
send $53$A0$01$AA$50 ; write I2C (S(0x53) + Address(W:LSB=0) + Num of Byte + DATA + P(0x50)) send $52$0A$50 ; read I2C Status
信号波形。
デバイスが接続されていないので当たり前ですが、アドレスに対してACKが返ってきてないのでエラーで終わっています。この状態でSC18IM700のI2C Statusをリードすると、'F1'=I2C_NACK_ON_ADDRESS が返ってきます。詳細はデータシートの9.2.7参照。
次回は、本命のI2Cデバイスを動かしてみます