MSP430F149 - I2C

提供: MochiuWiki : SUSE, EC, PCB

概要

I2C通信プロトコルでは、データは8ビット単位で送信される。

I2C通信でデータを送受信する場合、以下に示すようなデータフォーマットが使用される。

  1. スタートコンディション
  2. スレーブアドレス (7ビット) + 読み取り / 書き込みビット (1ビット)
  3. データバイト (8ビット)
  4. ACKまたはNACKビット
  5. 複数のデータバイトを送信する場合は、手順3と4を繰り返す。
  6. ストップコンディション


I2C通信を行う場合、各レジスタを適切に設定して、必要に応じて割り込み処理を実装することにより、MSP430F149マイコンでI2C通信を行うことができる。

また、各レジスタの設定は、通信モード、クロック周波数、スレーブアドレス等、アプリケーションの要件に応じて行う。


I2C通信の速度

I2C通信の速度は、標準モードとファストモードの2種類が一般的に使用されている。

  • 標準モード (Standard mode)
    通信速度: 100 [kbit/s]
    標準モードは、I2Cバスの基本的な速度である。
    多くのデバイスがこの速度をサポートしている。
    長距離の通信や、ノイズの多い環境での通信に適している。

  • ファストモード (Fast mode)
    通信速度: 400 [kbit/s]
    ファストモードは、標準モードの4倍の速度で通信を行う。
    高速な通信が必要な場合に使用される。
    短距離の通信や、ノイズの少ない環境での通信に適している。

これらの他にも、以下に示すような高速モードが存在する。

  • ファストモードプラス (Fast mode plus)
    通信速度: 1 [Mbit/s]
    I2Cバージョン 2.0で追加された。
    ファストモードの2.5倍の速度で通信を行う。

  • ハイスピードモード (High-speed mode)
    通信速度: 3.4 [Mbit/s]
    I2Cバージョン 3.0で追加された。
    非常に高速な通信が可能であるが、特殊なハードウェアが必要である。

  • ウルトラファストモード (Ultra Fast mode)
    通信速度: 5 [Mbit/s]
    I2Cバージョン 4.0で追加された。
    ハイスピードモードを上回る高速通信が可能である。


実際のアプリケーションでは、接続されるデバイスのサポートする速度、通信距離、ノイズ環境等を考慮して、適切な通信速度を選択する必要がある。
多くの場合、標準モードやファストモードが使用されており、これらの速度で十分な性能が得られる。

高速モードを使用する場合は、適切なプルアップ抵抗の選択や配線の設計に注意が必要となる。

また、デバイスの仕様を確認して、対応する通信速度を選択することが重要である。


U0CTL / U1CTL : USART制御レジスタ

U0CTL / U1CTLレジスタの概要

USART0 / USART1 (Universal Synchronous/Asynchronous Receiver/Transmitter) モジュールの制御レジスタである。
このレジスタは、I2C通信やSPI通信、UART通信等のシリアル通信プロトコルの設定や動作を制御するために使用される。

MSP430F149は2つのUSARTモジュール(USART0とUSART1)を搭載しており、それぞれU0CTLレジスタとU1CTLレジスタで制御される。

主な機能と設定は以下の通りである。

  • 同期モード選択 (SYNC)
    SYNCビットを使用して、同期式通信プロトコル (I2C、SPI) または 非同期式通信プロトコル (UART) を選択する。

  • I2Cモード選択 (I2C)
    I2Cビットを使用して、I2C通信モードを有効化する。

  • マスター / スレーブモード選択 (MST)
    MSTビットを使用して、USARTモジュールをマスターまたはスレーブとして設定する。

  • 送信 / 受信モード選択 (I2CEN, TXWAKE)
    I2Cモードでの送受信方向を制御する。

  • ソフトウェアリセット (SWRST)
    SWRSTビットを使用して、USARTモジュールをリセットする。


これらの設定を適切に行うことにより、目的のシリアル通信プロトコルを実装して、他のデバイスとの通信を確立することができる。
U0CTL / U1CTLレジスタは、USARTモジュールの動作を細かく制御するための重要なレジスタである。

U0CTL / U1CTLレジスタの重要なビット

U0CTL / U1CTLレジスタには、I2C通信モードで使用される重要なビットがある。

SWRST (Software Reset)

このビットを1に設定すると、USARTモジュールがリセット状態になる。
レジスタの設定を変更する場合は、このビットを 1 に設定してからレジスタを変更して、その後 0 に戻すことにより、変更を有効化する。

  • 0
    リセット解除、USARTモジュール動作中
  • 1
    リセット有効、USARTモジュール停止中


SYNC (Synchronous Mode Enable)

このビットは、同期モードまたは非同期モードを選択する。

  • 0
    非同期モード (UART通信)
  • 1
    同期モード (I2C、SPI通信)


I2C (I2C Mode Select)

このビットは、I2Cモードを有効化する。
SYNCビットが1の場合に有効である。

  • 0
    SPIモード
  • 1
    I2Cモード


MST (Master Mode)

このビットは、マスターモードまたはスレーブモードを選択する。

  • 0
    スレーブモード
  • 1
    マスターモード



U0TCTL / U1TCTL : USART送信制御レジスタ

U0TCTL / U1TCTLレジスタの概要

USART0 / USART1の送信制御レジスタである。
I2C通信モードでは、スタートコンディションとストップコンディションの生成を制御する。

TXSTT (Transmit START Condition)

このビットを1に設定すると、マスターモードでI2Cバスにスタートコンディションを送信する。

スタートコンディションは、データ転送の開始を示すために使用する。

  • 0
    影響なし
  • 1
    I2Cバスにスタートコンディションを送信


TXSTP (Transmit STOP Condition)

このビットを1に設定すると、マスターモードでI2Cバスにストップコンディションを送信する。

ストップコンディションは、データ転送の終了を示すために使用する。

  • 0
    影響なし
  • 1
    I2Cバスにストップコンディションを送信


TXD (Transmit / Receive Mode)

このビットは、I2Cモードでのデータの送受信方向を制御する。

  • 0
    受信モード
  • 1
    送信モード



U0BR0, U0BR1 / U1BR0, U1BR1 : USARTボーレートレジスタ

U0BR0U0BR1レジスタ (またはU1BR0U1BR1レジスタ) を組み合わせて、I2Cの通信速度を設定する。
使用するクロック源の周波数に応じて、適切な値を設定する。

通信速度の計算式は以下の通りである。
 通 信 速 度 = ク ロ ッ ク 源 周 波 数 (U0BR0+U0BR1×256)

例えば、SMCLKが8MHzで、標準モード(100kHz)のI2C通信を行う場合、以下のように設定する。
100000=8000000(U0BR0+U0BR1×256)
U0BR0+U0BR1×256=80

したがって、U0BR0 = 80U0BR1 = 0と設定する。


I2CSA (I2CPSC) : I2Cスレーブアドレスレジスタ

MSP430F149では、I2Cスレーブアドレスを設定するレジスタの名称がI2CSAまたはI2CPSCとなる場合がある。
(具体的なレジスタ名はデータシートを参照してください)

スレーブモードでは、自身のスレーブアドレスを設定する。
マスターモードでは、通信するスレーブデバイスのアドレスを設定する。


U0TXBUF / U1TXBUF : USART送信バッファレジスタ

U0TXBUF / U1TXBUF : USART送信バッファレジスタとは

U0TXBUF / U1TXBUFレジスタは、送信するデータを1バイトずつ書き込むレジスタである。
このレジスタにデータを書き込むと、自動的に送信が開始される。

データを送信する時、U0TXBUF / U1TXBUFレジスタが空になるのを待つ必要は無い。

I2C通信では、以下のような手順でデータを送信する。

  1. U0TXBUF / U1TXBUFレジスタにデータを書き込む。
  2. 書き込まれたデータが自動的に送信される。
  3. 送信が完了すると、U0TXIFG / U1TXIFGフラグがセットされる。
  4. 次のデータを送信する場合は、U0TXIFG / U1TXIFGフラグをクリアして、再度、U0TXBUF / U1TXBUFレジスタにデータを書き込む。


つまり、1バイトずつデータを送信することができるため、U0TXBUF / U1TXBUFレジスタが空になるのを待つ必要は無い。
ただし、前のデータの送信が完了する前に新しいデータを書き込んでしまうと、データが上書きされてしまうため、注意が必要である。

一般的には、U0TXIFG / U1TXIFGフラグを確認する、または、送信完了割り込みを使用して前のデータの送信が完了したことを確認した後に次のデータを書き込むことにより、
データの送信タイミングを適切に制御できる。

サンプルコード

以下の例では、I2C通信において、スレーブアドレスを0x48に設定して、マスターデバイスからのリクエストに応じてデータを送信している。

I2C通信の送信割り込みを設定する手順を、以下に示す。

  1. GPIOの設定
    P3.1およびP3.3をI2Cピン (SDAとSCL) として設定する。
  2. USART0の設定
    I2Cモード、同期モード、スレーブアドレスを設定する。
  3. 送信割り込みの有効化
    IE1レジスタのU0TXIEビット (またはIE2レジスタのU1TXIEビット) を設定する。
  4. CPUをオフにして、割り込みを有効化する。


送信割り込みが発生する時、USART0TX_ISR割り込みサービスルーチンが呼び出される。
この中で、配列transmitDataから次のデータを読み出して、U0TXBUFレジスタに書き込む。
これにより、データの送信が自動的に開始される。

全てのデータの送信が完了すると、送信割り込みを無効化する。
マスターデバイスからリクエストを受信すると、スレーブアドレスの一致により、送信割り込みが発生して、データの送信が自動的に開始される。

 #include <msp430.h>
 
 #define SLAVE_ADDRESS 0x48
 
 const unsigned char transmitData[] = "Hello, I2C!";
 volatile unsigned int transmitIndex = 0;
 
 int main(void)
 {
    WDTCTL = WDTPW | WDTHOLD;   // ウォッチドッグタイマを停止
 
    // GPIOの設定 (MSP430F149のI2Cピン - データシートで確認してください)
    // USART0を使用する場合: P3.1 (SDA), P3.3 (SCL)
    P3SEL |= BIT1 | BIT3;       // I2Cピンを選択
 
    // USART0の設定
    U0CTL |= SWRST;             // ソフトウェアリセットを有効化
    U0CTL |= SYNC | I2C;        // 同期モード、I2Cモード
    // I2CSA = SLAVE_ADDRESS;   // スレーブアドレスを設定 (レジスタ名はデータシート参照)
    U0CTL &= ~SWRST;            // ソフトウェアリセットを解除
    IE1 |= U0TXIE;              // 送信割り込みを有効化 (USART0の場合)
 
    __bis_SR_register(CPUOFF | GIE);   // CPUをオフにして, 割り込みを有効化
 
    while(1) {
        // メインループ
        // ...略
    }
 }
 
 // USART0送信割り込みサービスルーチン
 #pragma vector=USART0TX_VECTOR
 __interrupt void USART0TX_ISR(void)
 {
    if (transmitIndex < sizeof(transmitData)) {
        U0TXBUF = transmitData[transmitIndex++];   // 次のデータを送信バッファに書き込む
    }
    else {
        IE1 &= ~U0TXIE;                            // 送信完了後、送信割り込みを無効化
    }
 }


※注意
MSP430F149のI2Cピン配置とレジスタ名は、使用するUSARTモジュール(USART0またはUSART1)によって異なる。
詳細を知りたい場合は、MSP430F149のデータシートを参照してください。


U0RXBUF / U1RXBUF : USART受信バッファレジスタ

U0RXBUF / U1RXBUF : USART受信バッファレジスタとは

受信したデータを読み出すレジスタである。
新しいデータを受信すると、U0RXIFG / U1RXIFGフラグがセットされる。

U0RXBUF / U1RXBUFレジスタは、I2C通信で受信したデータを格納するレジスタであり、8ビット幅を持つ。
I2C通信では、データは8ビット (1バイト) 単位で送受信される。

マスターデバイスから1バイトのデータが送信されて、スレーブデバイス (MSP430F149の場合) がそのデータを受信する時、以下の動作が行われる。

  1. 受信した1バイトのデータがU0RXBUF / U1RXBUFレジスタに格納される。
  2. U0RXIFG / U1RXIFG (USART受信割り込みフラグ) がセットされる。


したがって、U0RXBUF / U1RXBUFレジスタは1バイト単位でデータを受信して、U0RXIFG / U1RXIFGフラグは1バイトの受信が完了したことを示す。

U0RXIFG / U1RXIFGフラグがセットされることにより、新しいデータが受信されたことを示す。
このフラグは、ソフトウェアで明示的にクリアする必要がある。

一般的に、U0RXIFG / U1RXIFGフラグがセットされたことを検出するには、以下に示す2つの方法がある。

  • ポーリング方式
    U0RXIFG / U1RXIFGフラグを定期的に確認して、セットされたらデータを読み出す。
  • 割り込み方式
    U0RXIE / U1RXIE (USART受信割り込み有効ビット) を有効にしておき、U0RXIFG / U1RXIFGフラグがセットされたら割り込みが発生するようにする。


どちらの方法を使用するかは、アプリケーションの要件や設計に依存する。
ただし、割り込み方式を使用する場合は、適切な割り込みハンドラを実装する必要がある。

サンプルコード

以下の例では、MSP430F149でI2C通信の受信割り込みを使用している。
スレーブアドレスを0x48に設定して、マスターデバイスからのデータを受信している。

I2C通信の受信割り込みを設定する手順を、以下に示す。

  1. GPIOの設定
    P3.1およびP3.3をI2Cピン (SDAとSCL) として設定する。
  2. USART0の設定
    I2Cモード、同期モード、スレーブアドレスを設定する。
  3. 受信割り込みの有効化
    IE1レジスタのU0RXIEビット (またはIE2レジスタのU1RXIEビット) を設定する。
  4. CPUをオフにして、割り込みを有効化する。


受信割り込みが発生する時、USART0RX_ISR割り込みサービスルーチンが呼び出される。
この割り込みサービスルーチン内で、U0RXBUFレジスタから受信データを読み出して、変数receivedDataに格納する。
その後、U0RXIFGフラグをクリアして、次の受信割り込みに備える。

マスターデバイスからデータを受信すると、変数receivedDataにデータが格納されるため、メインループまたは他の関数からこの変数にアクセスすることにより、受信したデータを処理できる。

 #include <msp430.h>
 
 #define SLAVE_ADDRESS 0x48
 
 volatile unsigned char receivedData;
 
 int main(void)
 {
    WDTCTL = WDTPW | WDTHOLD;   // ウォッチドッグタイマを停止
 
    // GPIOの設定 (MSP430F149のI2Cピン - データシートで確認してください)
    // USART0を使用する場合: P3.1 (SDA), P3.3 (SCL)
    P3SEL |= BIT1 | BIT3;       // I2Cピンを選択
 
    // USART0の設定
    U0CTL  |= SWRST;            // ソフトウェアリセットを有効化
    U0CTL  |= SYNC | I2C;       // 同期モード、I2Cモード
    // I2CSA = SLAVE_ADDRESS;   // スレーブアドレスを設定 (レジスタ名はデータシート参照)
    U0CTL  &= ~SWRST;           // ソフトウェアリセットを解除
    IE1    |= U0RXIE;           // 受信割り込みを有効化 (USART0の場合)
 
    __bis_SR_register(CPUOFF | GIE);  // CPUをオフにして、割り込みを有効化
 
    while(1) {
       // メインループ
       // ...略
    }
 }
 
 // USART0受信割り込みサービスルーチン
 #pragma vector=USART0RX_VECTOR
 __interrupt void USART0RX_ISR(void)
 {
    receivedData = U0RXBUF;     // 受信データを変数に格納
    IFG1 &= ~U0RXIFG;           // 受信割り込みフラグをクリア
 }


※注意
MSP430F149のI2Cピン配置とレジスタ名は、使用するUSARTモジュール (USART0 または USART1) によって異なる」。
詳細を知りたい場合は、MSP430F149のデータシートを参照すること。


IE1, IE2 : 割り込み有効化レジスタ

IE1およびIE2レジスタは、様々な割り込みソースの割り込みを有効または無効にするために使用する。

IE1 / IE2レジスタの各ビットを設定することにより、対応する割り込みソースの割り込みを有効または無効にできる。
例えば、U0RXIEビットを1に設定すると、USART0モジュールの受信割り込みが有効になる。

割り込みを使用する場合、対応する割り込みサービスルーチン (ISR) を定義する必要がある。 (ISRは、割り込みが発生した時に実行される関数)

また、IE1 / IE2レジスタと併せて、対応する割り込みフラグレジスタ (IFG1 / IFG2) も確認することが重要である。
IFG1 / IFG2レジスタは、割り込みの発生状況を示すフラグビットを含んでいる。
割り込みが発生すると、対応するフラグビットが設定される。
ISR内で適切な処理を行った後、フラグビットをクリアする必要がある。

IE1レジスタの主なビット


U0RXIE : USART0受信割り込み有効ビット

  • 0
    USART0受信割り込みを無効化
  • 1
    USART0受信割り込みを有効化


U0TXIE : USART0送信割り込み有効ビット

  • 0
    USART0送信割り込みを無効化
  • 1
    USART0送信割り込みを有効化


IE2レジスタの主なビット


U1RXIE : USART1受信割り込み有効ビット

  • 0
    USART1受信割り込みを無効化
  • 1
    USART1受信割り込みを有効化


U1TXIE : USART1送信割り込み有効ビット

  • 0
    USART1送信割り込みを無効化
  • 1
    USART1送信割り込みを有効化


予約済み (Reserved) ビット

予約済みのビットは、一般的には、以下のようなガイドラインに従う。

  • 読み取り時
    予約済みビットの値は未定義であるため、読み取った値に依存するようなコードを書くべきではない。
  • 書き込み時
    予約済みビットには、常に0を書き込むようにする。
    将来的に、これらのビットが新しい機能に割り当てられた場合、0を書き込んでおくことにより、予期しない動作を防ぐことができる。


例えば、IE1 / IE2レジスタの予約済みビットに値を書き込む場合は、次のように記述する。
このように記述することにより、予約済みビットに0を書き込むことで、将来の互換性を維持することができる。

 IE1 = (IE1 & ~BIT6) | (0 << 6);  // 予約済みビットに0を書き込む



IFG1, IFG2 : 割り込みフラグレジスタ

IFG1およびIFG2レジスタは、対応する割り込みイベントが発生したかどうかを示すフラグビットを含む。

IFG1レジスタの主なビット


U0RXIFG : USART0受信割り込みフラグ

  • 0
    割り込みイベントなし
  • 1
    USART0受信割り込みイベントが発生
    新しいデータが受信バッファに到着


U0TXIFG : USART0送信割り込みフラグ

  • 0
    割り込みイベントなし
  • 1
    USART0送信割り込みイベントが発生
    送信バッファが空になり、新しいデータを書き込み可能


IFG2レジスタの主なビット


U1RXIFG : USART1受信割り込みフラグ

  • 0
    割り込みイベントなし
  • 1
    USART1受信割り込みイベントが発生


U1TXIFG : USART1送信割り込みフラグ

  • 0
    割り込みイベントなし
  • 1
    USART1送信割り込みイベントが発生


上記の各フラグビットは、対応する割り込みイベントが発生すると自動的に1にセットされる。
例えば、USART0モジュールでデータを受信する時、U0RXIFGビットがセットされる。

割り込みサービスルーチン (ISR) 内で割り込みイベントを処理した後、対応するフラグビットを手動でクリアする必要がある。
フラグビットをクリアしない場合、ISRが繰り返し呼び出されることになることに注意する。

フラグビットをクリアするには、一般的に、フラグビットに0を書き込む。
例えば、U0RXIFGビットをクリアするには、次のように記述する。

 IFG1 &= ~U0RXIFG;  // U0RXIFGビットをクリア


割り込みを使用する場合は、IE1 / IE2レジスタで対応する割り込みを有効にして、IFG1 / IFG2レジスタでフラグビットを確認およびクリアすることが重要である。
これにより、割り込みイベントを適切に処理して、システムを安定して動作させることができる。


MSP430F149とMSP430G2553の主な違い

MSP430F149とMSP430G2553では、I2C通信に使用する通信モジュールが異なる。

  • MSP430F149
    USART (Universal Synchronous/Asynchronous Receiver/Transmitter) モジュールを使用
    レジスタ名: U0CTL, U1CTL, U0TXBUF, U0RXBUF 等
    割り込みベクタ: USART0TX_VECTOR, USART0RX_VECTOR 等

  • MSP430G2553
    USCI (Universal Serial Communication Interface) モジュールを使用
    レジスタ名: UCB0CTL0, UCB0CTL1, UCB0TXBUF, UCB0RXBUF 等
    割り込みベクタ: USCIAB0TX_VECTOR, USCIAB0RX_VECTOR 等


MSP430F149でI2C通信を実装する場合は、データシートを参照して、適切なレジスタ設定とピン配置を確認することが重要である。