PICマイクロコントローラでI2Cデバイスを利用するための汎用ライブラリ
目次 |
LCDドライバICで指定されている信号タイミングの標準的な時間は、ENピン前後の信号伝達を保証する部分では1マイクロ秒程度、1つのコマンドが送信さた後のウエイト時間が30マイクロ秒程度。
それに対して、I2Cバスを用いて伝送した場合は1回のHi/Lo伝送に掛かる時間は200マイクロ秒程度となるはずだ(下図参照)。
I2Cバスを用いてLCDを制御する限りにおいては、ウエイト時間をPIC側のプログラム内で意識して指定する必要性は殆ど無い(数十ミリ秒を必要とするリセット後のウエイト時間など一部の例外を除く)。ここで公開しているライブラリ関数には何らかの参考になると考えて、マイクロ秒単位のウエイト時間も指定している。
Booster Circuitを3.3Vの場合はON(ST7032_POWER_BOOST_L
)に、5Vの場合はOFF(ST7032_POWER_BOOST_L
)とする。
ボルテージフォロアは3.3V, 5V共にON(ST7032_FOLLOWER_H
)とする。
// I2C LCD initialize (I2C液晶の初期化) void i2c_lcd_init(void) { //〜 中略 〜 // Contrast set(low byte)=0x8 (IS=1 mode) i2c_lcd_send_command(0x70 | (LCD_CONTRAST & 0x0f)); __delay_us(30); // Wait 26.3 us // Contrast set(high byte)=0x2, Icon=ON, Booster circuit=OFF (IS=1 mode) i2c_lcd_send_command(0x50 | ST7032_POWER_BOOST_L | ST7032_ICON_L | ((LCD_CONTRAST >> 4) & 0x03)); __delay_us(30); // Wait 26.3 us // follower circuit=ON, Amplified Ratio (IS=1 mode) i2c_lcd_send_command(0x60 | ST7032_FOLLOWER_H | ST7032_V0_AMP); __delay_ms(220); // Wait 200 ms //〜 中略 〜 }
変換アダプタ(上)と1602 LCD(下)
この変換アダプタはI2Cで送信した8ビット長のデータを、単にLCD側端子の各ピンに割り当てているだけと判明。PICマイクロコントローラ側でデータパルスとENパルスの組み合わせでデータ伝送するLCD制御信号のタイミングを取ってやる必要がある。
この変換アダプタを入手した時に得た情報ではI2Cアドレスは0x27で、サンプルプログラムも提供されなかった。中国人いい加減すぎる…
BL | RS | RW | EN | D7 | D6 | D5 | D4 |
バックライト(BL)ビットは、1のときバックライト消灯、0のとき点灯という動作となる。
ENピンの電圧がHiからLoに落ちる前後でデータ転送(認識)が行われるが、最低80nsecや10nsecというのはI2C経由の制御では十分満たすことが出来る。
S | Address(7bit) | R/W | A | Data(8bit) | A | P |
LCD_ENビットを立てたデータと、そうでないデータを連続して送信する。ロジック・アナライザで観察したENピンのビット変化(水色で着色)で、データが転送される(・)様子を次に示す。
// send data to I2C LCD (I2C液晶にデータを送信する) 4 bit mode void i2c_lcd_send_data(unsigned char data){ unsigned char lcddata; // Put the Upper 4 bits data // Write Enable Pulse E: Hi lcddata = (data>>4) & 0x0f | LCD_BACKLIGHT | LCD_RS; i2c_lcd_send_common(lcddata | LCD_EN); __delay_us(2); // PWeh=0.23 us (HD44780U), Tpw=0.14 us (SD1602V) // Write Enable Pulse E: Hi -> Lo i2c_lcd_send_common(lcddata & ~LCD_EN); __delay_us(2); // Tcyce-PWeh=0.5-0.23=0.27 us (HD44780U), Tc-Tpw=1.2-0.14=1.06 us (SD1602V) // Put the Lower 4 bit data lcddata = (data & 0x0f) | LCD_BACKLIGHT | LCD_RS; i2c_lcd_send_common(lcddata | LCD_EN); __delay_us(2); i2c_lcd_send_common(lcddata & ~LCD_EN); __delay_us(2); __delay_us(50); // Wait 37 us (HD44780U), 43 us (SD1602V) }
変換アダプタ(上)と1602 LCD(下)
D7 | D6 | D5 | D4 | BL | EN | RW | RS |
バックライト(BL)ビットは、1のときバックライト点灯、0のとき消灯という動作となる。
書き込み後のウエイト時間はポーリングを利用するのではなく、想定される最大時間を満足する値としている。最大時間は「AN1028 : Recommended Usage of Microchip I2CTM Serial EEPROM Devices」の5ページ目に示されているI2Cバスクロック100kHz時の最大値を用いている。