i2c用関数の作成その1(LCD用書き込み機能)   nobcha(c)2011

1.初めに

 i2cインターフェイスを使用してユニット組み合わせで試作を進めたいと思っています。3Vでも動くというストロベリーリナックス社LCDを使うためのi2c制御マスター関数を作ります。まずは書き込みからです。

 続くその次にはEEPROMなどの読み取りにも対応予定。

 さらにはスレーブも作ります。スレーブ出来ればi2c化したユニットをビルディングブロックで組み合わせる方式にて大規模試作がやりやすくなります。

 

2.関数レパートリィ

 とりあえず必要な関数はLCD用の書き込みだけなのですが、最終的には読み取りも必要となるので、全てでどんな関数が必要かまとめてみます。 

i2c 関数 まとめ                                  by nobcha (c)2011
分類 名称 説明 引用 する 関数 など 定義 場所
1 レベル 関数 void i2c_stop(void) ストップ状態にします:クロックをHにしてデータをL->Hします SDA_LOW()  SCL_HIGH()  SDA_HIGH()  __delay_us(X) "i2c.c"
2 レベル 関数 void i2c_restart(void) スタート状態にします:まずはデータ線を確実にHにして、スタート状態にします。i2c_Start()マクロも同様です SDA_LOW()  SCL_HIGH()  SDA_LOW()  __delay_us(X) "i2c.c"
3 低レベル 関数 unsigned char i2c_sendbyte(unsigned char byte) バイトをスレーブに送ります. エラー時にはTRUEを返します SDA_LOW()  SCL_LOW()  SDA_HIGH()  i2c_waitforSCL()   __delay_us(X) "i2c.c"
4 低レベル 関数 unsigned char i2c_sendaddress(unsigned char address, unsigned char rw) スレーブへアドレスとデータの方向指定ビットを送ります. 7ビットアドレス(最下位無視)、方向(FALSE=write) i2c_sendbyte(byte) "i2c.c"
5 低レベル 関数 signed char i2c_readack(void) スレーブ側からのアックをチェックします. アックを返すか、アックなしか、バスエラーならERRORです SCL_LOW()   i2c_waitforSCL()      __delay_us(X) "i2c.c"
6 低レベル 関数 int i2c_readbyte(void) スレーブからバイトリードします。読んだバイトを返すか、もしバスエラーだったらERRORを返します SCL_LOW()  i2c_waitforSCL()     __delay_us(X) "i2c.c"
7 低レベル 関数 void i2c_sendack(unsigned char status) スレーブ側にアックあるいは非アックを送ります。I2C_LASTというstatusを送ると、これで最後バイトを送りますという意味です SDA_LOW()  SDA_HIGH()   __delay_us(X) "i2c.c"
8 高レベル 関数 signed char i2c_putbyte(unsigned char data) スレーブに1バイトを送ります。I2C_ERROR、アック、非アックを返します。 i2c_sendbyte(data)  i2c_readack() "i2c.c"
9 高レベル 関数 int i2c_getbyte(unsigned char more) スレーブから1バイト読み取り、転送のアックを確認。戻り値はI2C_ERRORならtrueであり、それ以外はbyte i2c_readbyte()   i2c_sendack(byte) "i2c.c"
10 高レベル 関数 int i2c_putstring(const unsigned char *str, unsigned char length) スレーブにバイト列を送り、転送のアックを確認する。もし転送不成功なら転送残バイト数を返す i2c_putbyte(*str) "i2c.c"
11 高レベル 関数 unsigned char i2c_getstring(unsigned char *str, unsigned char number) スレーブから指定されたバイト数をstr文字列に格納、転送のアックを返す。読み込みに成功しなかった文字数を返す i2c_getbyte(number) "i2c.c"
12 低レベル 関数 unsigned char i2c_open(unsigned char address, unsigned char mode) 指定アドレスのデバイスと通信を開始する。モードはI2C_READあるいはI2C_WRITEで指定される。もし指定アドレスに対してアック無いとTRUEを返す i2c_start()   i2c_sendaddress(address, mode)   i2c_readack() "i2c.c"
13 低レベル 関数 unsigned char
i2c_waitforSCL(void)
遅いスレーブの場合用にクロック線が開放されるのをまつ。タイムアウト時間の後もSCLが開放されないときはTRUEを返す。もしそうでないときはSCLが開放された時にFALSEを返す     __delay_us(X) "i2c.c"
14 低レベル 関数 void i2c_free() バスを開放する SCL_LOW()  SCL_HIGH()   __delay_us(X) "i2c.c"
15 低レベル 関数 unsigned char i2c_read(unsigned char ucAdr) 1文字読んでucAdrが0ならば読み取り終了する i2c_readfrom(ucAdr)  i2c_getbyte(MORE)  i2c_stop() "i2c.c"
16 マクロ定義 I2C_MORE 更にデータがあるか i2c_getbyte(MORE) "i2c.h"
17 マクロ定義 I2C_LAST 読むべき最後のデータなのか i2c_getbyte(MORE) "i2c.h"
18 マクロ定義 I2C_ERROR バスエラーのチェック 結果 i2c_getbyte(MORE) "i2c.h"
19 高レベル 関数 i2c_writeto(address)  書き 込み先デバイスの 指定 、アクティベート i2c_Open(number) "i2c.h"
20 高レベル 関数 i2c_readfrom(address)  読み取り元デバイスの指定 、アクティベート i2c_Open(number) "i2c.h"

 HI-TECH CV9.71aに付属しているサンプルプログラムを参考にしました。

 

3.プログラム

 試作目的の関数はi2c.cヘッダファイルi2c.hです。ハードウェア依存するポートの定義はi2c.hの中に#define定義します。今回はi2c制御のLCDを動かします。そのために従来4ビット並列でSC1602型液晶を制御していた関数の下部にi2c.c関数を呼び出すことにします。lcd_i2c_func.clcd_i2c_func.hを作りました。これらの関数をテスト用のメイン関数88main.cから呼び出します。またdelay.hも必要となります。

  

4.実験回路 

 PIC16F88を用いてi2c制御LCDをRB1,RB3ポートにつなぎます。RB4には電源表示、動作チェック用のLEDを接続します。SCL,SDAのプルアップ抵抗、LCDのリセット線のプルアップ抵抗、電源のデカップリングコンデンサなど忘れぬよう接続します。

 

5.デバッグ、波形

 デバッグする前にタイミング確認の要点をまとめました。

 まずはSTARTコンディションから始まります。次にアドレスがちゃんと出ているか、LCDは書き込み専用なので、〜WRITEになります。そして、スレーブ側がアドレスに〜ACK応答しているかがポイントです。アドレスの次にコマンド+データの各8ビット+〜ACKが合計18ビット続きます。そして最後にSTOPコンディションが出ているかを確認します。

 デバッグではまずはSTARTコンディションの確認です。PICKIT2の機能であるLOGIC TOOLが3チャンネルのロジックアナライザとして使えます。これでSDAとSCLをつないでSCLがHでSDAがLになる条件をトリガーにしてキャプチャします。こんな感じになるはずです。

 

6.お礼など

 電子回路試作でブログ、ホームページに各社発表されている方の情報を参考にしました。感謝します。また次のフリーソフトを利用させていただきました。開発された方、普及に協力されている方、提供会社、テンプレートを提供されている方に感謝します。

回路図ソフト 水魚堂の回路図エディタ  http://www.suigyodo.com/online/schsoft.htm

マイクロチップ社の開発システム及び言語プログラム  http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2879

 記載されている内容に著作権が存在します。無断で丸のままコピーすることは許されません。また記載内容は個人が趣味の範囲で実行したものであり、必ずしも動作が正確なものかを保証するものではありません。各自の判断で実行願います。

 

全体目次に戻る 

アイコンは「牛飼いとアイコンの部屋」からの提供。ありがとうございます。

 

inserted by FC2 system