デジタルノギスの表示部を取り出そうと思い、小さい液晶を探した所、秋月さんにI2Cタイプの小型の物があり、それを使う事にしました。ところで、I2Cでどうやって使うのって所から始めました。う〜ん実は判っていたようでいざ使おうとすると、う〜んよくわからん。設定に有るいくつかの事が実際わからなかった。
秋月の説明書に有る、ここの部分
スレーブアドレスは、0xC7です。(アドレス0111110+0(R/W))
コントロールバイトで「データ、コマンドの指定」RSと「連続データの指定」Coを送信します。
コマンドの場合RS=0、データはRS=1になります。データを複数送る場合Co=1で、最終データはCo=0です。
特に最後の「データを複数送る場合Co=1で、最終データはCo=0です。」の部分。言っている事は判るのだが、データって0~FFまで有るわけだから、連続で送ったらコントロールかデータかなんて判らんやんか。これはつまり、最終データのときはCo=0としなはれということで、連続してデータを送る場合は、最後のデータを送りきったら、STOP状態を作ってのみ終了できるということ。と理解しておこう。下の表が参考になるのだろう。
Co | Description |
---|---|
0 | Last control byte to be sent. Only a stream of data bytes is allowed to follow. This stream may only be terminated by a STOP condition. 最後の制御バイトが送信される。 データ·バイトのストリームのみをたどることができる。 このストリームはのみSTOP条件で終了させることができる。 |
1 | Another control byte will follow the data byte unless a STOP condition is received. STOP条件を受信しない限り、別の制御バイトはデータバイトに従います。 |
データ列の最初にStart状態があって、最後にStop状態があるということらしい。そのStartとStopを作り出すための手順がある。
void i2c_start(void){ while(!(P1IN & BIT6)); USISRL = 0; USICTL0 |= USIGE + USIOE; USICTL0 &= ~USIGE; }
void i2c_stop(void){ USICTL0 |= USIOE; USISRL = 0; USICNT = 1; while(!(USICTL1 & USIIFG)); USISRL = 0xff; USICTL0 |= USIGE; USICTL0 &= ~(USIGE + USIOE); }
データを送る場合は、最初のほうで説明があるように、RS=1になる。それで、連続してデータを送ることになるから、Co=0となる。
途中で、DDRAMアドレスを変えるときは、Start状態からはじめる。。。。。う~ん、めんどい。