「MSP430G2553 - LCD」の版間の差分

提供: MochiuWiki : SUSE, EC, PCB

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == <br><br> == SC2004 / I2C通信 == ==== ATmega328とI2C ==== MSP430G2553において、I2Cのシリアルクロック線(SCL)とシリアルデータ線(SDA)で一般的によく使用されるピンは、以下の通りである。<br> 原則として、以下に示すピンをI2C通信に使用することが推奨される。<br> ただし、必要に応じて他のピンをUSCIモジュールに割り当てることも可能である。<br> * SCL *…」
 
34行目: 34行目:
<u>I2C通信を使用する場合は、プルアップ抵抗を適切に配置する必要がある。</u><br>
<u>I2C通信を使用する場合は、プルアップ抵抗を適切に配置する必要がある。</u><br>
<u>多くのモジュールには、プルアップ抵抗が内蔵されているが、必要に応じて外部にプルアップ抵抗を追加する必要がある。</u><br>
<u>多くのモジュールには、プルアップ抵抗が内蔵されているが、必要に応じて外部にプルアップ抵抗を追加する必要がある。</u><br>
<br>
==== MSP430G2553の設定 ====
以下の設定を適切に行うことにより、MSP430G2553でI2C通信を正常に動作させることができる。<br>
* クロック設定
*: I2C通信を使用する前に、MSP430G2553のクロックを適切に設定する必要がある。
*: 通常、SMCLK (サブメインクロック) を使用して、UCB0CTL1レジスタのUCSSELビットでクロックソースを選択する。
*: <br>
* ポートの設定
*: I2C通信に使用するポート (例: P1.6とP1.7) を、I2C機能に設定する必要がある。
*: P1SELレジスタとP1SEL2レジスタを適切に設定して、ピンをI2C通信用に割り当てる。
*: <br>
* I2C通信の初期化
*: UCB0CTL1レジスタのUCSWRSTビットをセットして、I2Cをリセット状態にする。
*: その後、UCB0CTL0レジスタでI2Cのマスターモード、同期モード、7ビットアドレッシング等を設定する。
*: また、UCB0BRレジスタでI2Cのクロック周波数を設定する。
*: <br>
* I2Cアドレスの設定
*: UCB0I2CSAレジスタで、スレーブデバイス(SC2004)のI2Cアドレスを設定する。
*: <br>
* 割り込みの設定 (必要な場合)
*: I2C通信の割り込みを使用する場合は、UCB0IEレジスタで適切な割り込みを有効にして、割り込みハンドラを設定する。
*: <br>
* 通信エラーの処理
*: I2C通信中にエラーが発生した場合、UCB0STATレジスタのエラーフラグを確認して、適切にエラー処理を行う。
*: 必要に応じて、I2Cの初期化やリスタートを行うこと。
*: <br>
* 低電力モードの考慮
*: MSP430G2553はデフォルトでは低電力モードになっている。
*: そのため、I2C通信を使用する場合は、適切なタイミングでスリープモードから復帰させる必要がある。
<br>
<br>
==== SC2004の設定 ====
==== SC2004の設定 ====
41行目: 70行目:
一般的に、LCDに表示のためには、ファンクションセット、エントリーモード、ディスプレイのON / OFF等の設定が必要となる。<br>
一般的に、LCDに表示のためには、ファンクションセット、エントリーモード、ディスプレイのON / OFF等の設定が必要となる。<br>
<br>
<br>
==== I2Cを介したデータ送信 ====
==== I2Cを介したデータ送信 ====
MSP430からSC2004にデータを送信するには、I2Cのスタート条件、SC2004のスレーブアドレス、データ、ストップ条件の順に送信する。<br>
MSP430からSC2004にデータを送信するには、I2Cのスタート条件、SC2004のスレーブアドレス、データ、ストップ条件の順に送信する。<br>

2024年6月3日 (月) 01:37時点における版

概要



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のコマンドやテキストデータが含まれる。

サンプルコード

  1. I2Cの初期化 (i2c_init)
    • ピンの設定、I2Cモードの設定、クロック周波数の設定等

  2. LCDの初期化 (lcd_init)
    • 8ビットデータ、2行表示、5x8ドットの設定
    • 表示ON、カーソルOFF、点滅OFFの設定
    • カーソル移動方向を右に設定
    • 画面クリア

  3. 文字列の表示 (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++);
    }
 }