chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

LPCXpresso(LPC1769)でI2C通信させる

以前からパスワードでロックされてしまったSDカードのパスワードを外すためにブルートフォースで総当たりさせているが、どのパスワードを試しているのかシリアルで確認していた。この方法だと、PCがないとパスワードが分からず、連続稼働させるのは大変だ。そこで、、テスト対象のパスワードが液晶で表示されるように改良中。
液晶はStrawberryLinuxで買った液晶モジュール*1。I2Cで接続できる。ただ、、NXPが提供するI2CのサンプルではどうもPINからI2Cの信号が出ないようなのだった。ちゃんと仕様書を読んでいないので何がわるいのかわからない。しかも、I2Cはプロトコルが複雑で232CのようにIOを叩けばいいというものでもなさそうだ。ひょっとして、IOピンはオープンドレインになっている??
マニュアルをじっくり読んで、プロトコルも理解して取り組むべきなんだろうけど、他にいろいろやりたいことあるし、I2Cの使いこなしにこってり時間をかける気がないので、他の動きそうなサンプルを物色中

■追記
サンプルを動かしてみたもののやはり、I2Cのポートから信号は出ず、きっちり仕様書を読んでどんな順番でレジスタを叩いているのか確認が必要。結局、急がば回れということですな。

■追記(140426)
信号が出ないのはIOがオープンドレインの仕様になっているのにプルアップさせていないのが原因であった。適当な抵抗でプルアップすると信号が出るようになって、液晶からACKを返すようになった。が、、続く信号がマイコンから出ないのであった。なぜだろうか。。I2Cのライブラリに組み込まれている状態遷移が正しく動作していないようだ。やっぱり仕様書に書かれているレジスタを全部読んで、スクラッチから組んでみないと何が悪いのかデバッグもできない。

■追記(140430)

いろいろ調べた結果、I2Cはオープンドレインの設定になっていて、プルアップ抵抗が必要なのだった。そこで、1KΩの抵抗でプルアップしたら、マスター側からI2Cのバスに信号が流れるようになった。が!次の問題として、ステートマシンが動かない。なぜか?? さらに調べると、スレーブ側の液晶パネルから、ACKは返しているのだけど、プルアップが1KΩでは小さすぎて、0Vまでドライブできず、1.*V程度までしか下がらず、マスターのマイコン側ではACKを返してこないと判断したようであった(左の写真は、液晶パネル側からACKを返すべく0Vに引き下げようとしてるけど、プルアップが強烈で、1.*Vの中間値になってしまっている状況)。

そこで、プルアップを3.3KΩに変更して、液晶パネル側から0Vに引き下げやすくした。この結果、ACKが0V近くまで下げられるようになり、マイコン側でもACKが返ったと認識できるようになった(左の写真はプルアップを3.3KΩに変更した結果、液晶パネルからのACKが正しくI2C信号に乗るようになった状況)。

そんなこんなで、NXPのデモが正しく動作しないのはI2Cバスに取り付ける抵抗値の問題であった。諸問題が解決して、ストロベリーリナックス社が提供している液晶パネル制御サンプルが動作し、液晶パネルに文字が出せるようになった。バックライト付きの液晶ですが、LEDの接続がまだなので見にくいですが(左図参照)。。

ご参考までに、I2C経由で連続的に液晶にデータを送信した場合の波形


■関連URL
I2Cのコードで連続読み込みできないというQA
http://www.lpcware.com/content/forum/lpc1769-i2c-delay
NXP提供のライブラリ群
http://www.lpcware.com/content/nxpfile/lpcopen-platform
Keil版?サンプルコード
http://www.lpcware.com/content/nxpfile/mcb1700-sample-code-bundle-lpc17xx-peripherals-using-keils-mdk-arm

k346coilさんの音声再生ソース(R8CでSDカード読み込みとPWMによる音声再生)
http://k346coil.mo-blog.jp/blog/2014/04/r8cwav_cf21.html

*1:I2C低電圧キャラクタ液晶モジュール(16x2行)[バックライト付] メーカー品番:SB1602BW