「MSP430G2553 - LCD」の版間の差分
| 75行目: | 75行目: | ||
送信データには、SC2004のコマンドやテキストデータが含まれる。<br> | 送信データには、SC2004のコマンドやテキストデータが含まれる。<br> | ||
<br> | <br> | ||
==== 注意点 ==== | |||
* 電源電圧の確認 | |||
*: <u>SC2004は、5[V]電源が必要となることが多い。</u> | |||
*: <u>MSP430G2553は3.3[V]で動作するため、電圧レベル変換が必要になる場合がある。</u> | |||
*: したがって、LCDモジュールに3.3[V]対応のものを使用する、または、適切な電圧レベル変換回路を追加する必要がある。 | |||
*: <br> | |||
* プルアップ抵抗の設定 | |||
*: I2C通信では、SCLとSDAラインにプルアップ抵抗が必要である。 | |||
*: 多くのLCDモジュールには、プルアップ抵抗が内蔵されているが、必要に応じて外部にプルアップ抵抗を追加すること。 | |||
*: プルアップ抵抗の値は、通常4.7[kΩ] 〜 10[kΩ]程度である。 | |||
*: <br> | |||
* 初期化シーケンスの確認 | |||
*: SC2004の初期化シーケンスは、データシートに記載されている。 | |||
*: 初期化コマンドと各コマンドの実行後の遅延時間を確認して、プログラムで適切に実装すること。 | |||
*: <br> | |||
* 通信速度の設定 | |||
*: I2C通信の速度は、MSP430G2553のクロック周波数とUCBRレジスタの設定によって決定される。 | |||
*: SC2004のデータシートで推奨されている通信速度を確認し、適切に設定すること。 | |||
*: <br> | |||
* エラーハンドリング | |||
*: I2C通信では、エラーが発生する可能性がある。 | |||
*: エラー状態を適切に処理して、必要に応じてリトライや初期化処理を行うこと。 | |||
<br> | |||
==== サンプルコード ==== | ==== サンプルコード ==== | ||
# I2Cの初期化 (i2c_init) | # I2Cの初期化 (i2c_init) | ||
2024年6月3日 (月) 01:42時点における版
概要
SC2004 / I2C通信
ATmega328とI2C
MSP430G2553において、I2Cのシリアルクロック線(SCL)とシリアルデータ線(SDA)で一般的によく使用されるピンは、以下の通りである。
原則として、以下に示すピンをI2C通信に使用することが推奨される。
ただし、必要に応じて他のピンをUSCIモジュールに割り当てることも可能である。
- SCL
- USCIモジュールのUCB0SCLに対応している。
- P1.6
- P3.1
- SDA
- USCIモジュールのUCB0SDAの代替ピンである。
- P1.7
- P3.0
使用不可のピンを、以下に示す。
- P1.0
- P1.1
- 外部クリスタル発振器に接続されているため、I2C通信には使用できない。
- P1.5
- P2.0
- P1.5はXT2IN、P2.0はXT2OUTとして使用される可能性があるため、I2C通信に使用する場合は注意が必要である。
- P2.6
- P2.7
- デバッグ用のJTAGインターフェースに使用されるため、I2C通信には使用できない。
※注意 1
ピンの割り当ては、プロジェクトの要件やPCBレイアウトに応じて柔軟に変更できるが、使用するピンが他の機能と競合しないように注意すること。
※注意 2
I2C通信を使用する場合は、プルアップ抵抗を適切に配置する必要がある。
多くのモジュールには、プルアップ抵抗が内蔵されているが、必要に応じて外部にプルアップ抵抗を追加する必要がある。
MSP430G2553の設定
以下の設定を適切に行うことにより、MSP430G2553でI2C通信を正常に動作させることができる。
- クロック設定
- I2C通信を使用する前に、MSP430G2553のクロックを適切に設定する必要がある。
- 通常、SMCLK (サブメインクロック) を使用して、UCB0CTL1レジスタのUCSSELビットでクロックソースを選択する。
- ポートの設定
- I2C通信に使用するポート (例: P1.6とP1.7) を、I2C機能に設定する必要がある。
- P1SELレジスタとP1SEL2レジスタを適切に設定して、ピンをI2C通信用に割り当てる。
- I2C通信の初期化
- UCB0CTL1レジスタのUCSWRSTビットをセットして、I2Cをリセット状態にする。
- その後、UCB0CTL0レジスタでI2Cのマスターモード、同期モード、7ビットアドレッシング等を設定する。
- また、UCB0BRレジスタでI2Cのクロック周波数を設定する。
- I2Cアドレスの設定
- UCB0I2CSAレジスタで、スレーブデバイス(SC2004)のI2Cアドレスを設定する。
- 割り込みの設定 (必要な場合)
- I2C通信の割り込みを使用する場合は、UCB0IEレジスタで適切な割り込みを有効にして、割り込みハンドラを設定する。
- 通信エラーの処理
- I2C通信中にエラーが発生した場合、UCB0STATレジスタのエラーフラグを確認して、適切にエラー処理を行う。
- 必要に応じて、I2Cの初期化やリスタートを行うこと。
- 低電力モードの考慮
- MSP430G2553はデフォルトでは低電力モードになっている。
- そのため、I2C通信を使用する場合は、適切なタイミングでスリープモードから復帰させる必要がある。
SC2004の設定
SC2004は、I2Cスレーブデバイスである。
SC2004のデータシートを参照して、初期化シーケンスやコマンドを確認する。
一般的に、LCDに表示のためには、ファンクションセット、エントリーモード、ディスプレイのON / OFF等の設定が必要となる。
I2Cを介したデータ送信
MSP430からSC2004にデータを送信するには、I2Cのスタート条件、SC2004のスレーブアドレス、データ、ストップ条件の順に送信する。
送信データには、SC2004のコマンドやテキストデータが含まれる。
注意点
- 電源電圧の確認
- SC2004は、5[V]電源が必要となることが多い。
- MSP430G2553は3.3[V]で動作するため、電圧レベル変換が必要になる場合がある。
- したがって、LCDモジュールに3.3[V]対応のものを使用する、または、適切な電圧レベル変換回路を追加する必要がある。
- プルアップ抵抗の設定
- I2C通信では、SCLとSDAラインにプルアップ抵抗が必要である。
- 多くのLCDモジュールには、プルアップ抵抗が内蔵されているが、必要に応じて外部にプルアップ抵抗を追加すること。
- プルアップ抵抗の値は、通常4.7[kΩ] 〜 10[kΩ]程度である。
- 初期化シーケンスの確認
- SC2004の初期化シーケンスは、データシートに記載されている。
- 初期化コマンドと各コマンドの実行後の遅延時間を確認して、プログラムで適切に実装すること。
- 通信速度の設定
- I2C通信の速度は、MSP430G2553のクロック周波数とUCBRレジスタの設定によって決定される。
- SC2004のデータシートで推奨されている通信速度を確認し、適切に設定すること。
- エラーハンドリング
- I2C通信では、エラーが発生する可能性がある。
- エラー状態を適切に処理して、必要に応じてリトライや初期化処理を行うこと。
サンプルコード
- I2Cの初期化 (i2c_init)
- ピンの設定、I2Cモードの設定、クロック周波数の設定等
- LCDの初期化 (lcd_init)
- 8ビットデータ、2行表示、5x8ドットの設定
- 表示ON、カーソルOFF、点滅OFFの設定
- カーソル移動方向を右に設定
- 画面クリア
- 文字列の表示 (lcd_print)
- lcd_data関数を使用して文字データをLCDに送信
I2C通信では、i2c_start関数でスタートコンディション、i2c_stop関数でストップコンディションを発生させて、i2c_write関数でデータを送信している。
LCDへのコマンド送信は、lcd_cmd関数、データ送信はlcd_data関数を使用している。
#include <msp430.h>
#include <stdint.h>
// I2Cアドレス
#define LCD_ADDR 0x27
// または
// #define LCD_ADDR 0x3f
// I2C関数
void i2c_init();
void i2c_start();
void i2c_stop();
void i2c_write(uint8_t data);
// LCD関数
void lcd_init();
void lcd_cmd(uint8_t cmd);
void lcd_data(uint8_t data);
void lcd_print(const char *str);
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマを停止
i2c_init(); // I2C初期化
lcd_init(); // LCD初期化
lcd_print("Hello, MSP430"); // 文字列を表示
while (1);
}
void i2c_init()
{
P1SEL |= BIT6 | BIT7; // I2C用のピン設定 (P1.6:SCL, P1.7:SDA)
P1SEL2 |= BIT6 | BIT7;
UCB0CTL1 |= UCSWRST; // I2Cをリセット
UCB0CTL0 = UCMST | UCMODE_3 | UCSYNC; // I2Cマスター, I2Cモード, 同期モード
UCB0CTL1 = UCSSEL_2 | UCSWRST; // SMCLK, リセット解除
UCB0BR0 = 12; // SCLクロック: 100kHz (12[MHz] / 12 = 100[kHz])
UCB0BR1 = 0;
UCB0I2CSA = LCD_ADDR; // スレーブアドレス
UCB0CTL1 &= ~UCSWRST; // I2C動作開始
}
void i2c_start()
{
UCB0CTL1 |= UCTR; // 送信モード
UCB0CTL1 |= UCTXSTT; // スタートコンディション
while (UCB0CTL1 & UCTXSTT); // スタートコンディション完了まで待機
}
void i2c_stop()
{
UCB0CTL1 |= UCTXSTP; // ストップコンディション
while (UCB0CTL1 & UCTXSTP); // ストップコンディション完了まで待機
}
void i2c_write(uint8_t data)
{
UCB0TXBUF = data; // データ送信
while (!(UCB0IFG & UCTXIFG)); // 送信完了まで待機
}
void lcd_init()
{
__delay_cycles(50000); // 50ms待機
lcd_cmd(0x38); // 8ビットデータ, 2行表示, 5x8ドット
lcd_cmd(0x0C); // 表示ON, カーソルOFF, 点滅OFF
lcd_cmd(0x06); // カーソル移動方向を右に設定
lcd_cmd(0x01); // 画面クリア
__delay_cycles(2000); // 2[mS]待機
}
void lcd_cmd(uint8_t cmd)
{
i2c_start();
i2c_write(0x00); // コマンドモード
i2c_write(cmd);
i2c_stop();
__delay_cycles(2000); // 2[mS]待機
}
void lcd_data(uint8_t data)
{
i2c_start();
i2c_write(0x40); // データモード
i2c_write(data);
i2c_stop();
__delay_cycles(50); // 50[uS]待機
}
void lcd_print(const char *str)
{
while (*str) {
lcd_data(*str++);
}
}