MSP430G2553 - I2C
概要
I2C通信プロトコルでは、データは8ビット単位で送信される。
I2C通信でデータを送受信する場合、以下に示すようなデータフォーマットが使用される。
- スタートコンディション
- スレーブアドレス (7ビット) + 読み取り / 書き込みビット (1ビット)
- データバイト(8ビット)
- ACKまたはNACKビット
- 複数のデータバイトを送信する場合は、手順3と4を繰り返す。
- ストップコンディション
I2C通信を行う場合、各レジスタを適切に設定して、必要に応じて割り込み処理を実装することにより、MSP430G2553マイコンで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で追加された。
- ハイスピードモードを上回る高速通信が可能である。
実際のアプリケーションでは、接続されるデバイスのサポートする速度、通信距離、ノイズ環境等を考慮して、適切な通信速度を選択する必要がある。
多くの場合、標準モードやファストモードが使用されており、これらの速度で十分な性能が得られる。
高速モードを使用する場合は、適切なプルアップ抵抗の選択や配線の設計に注意が必要となる。
また、デバイスの仕様を確認して、対応する通信速度を選択することが重要である。
UCB0CTL1レジスタ
UCB0CTL1レジスタの概要
USCI_B0 (Universal Serial Communication Interface, module B0) モジュールの制御レジスタの1つである。
このレジスタは、I2C通信やSPI通信等のシリアル通信プロトコルの設定や動作を制御するために使用される。
主な機能と設定は以下の通りである。
- クロック源の選択 (UCSSEL)
UCSSEL
ビットを使用して、USCI_B0モジュールのクロック源を選択する。- ACLK、SMCLK、または外部クロックから選択可能です。
- 同期モード選択 (UCMODE)
UCMODE
ビットを使用して、同期式通信プロトコル (I2C、SPI) を選択する。- マスター / スレーブモード選択 (UCMST)
UCMST
ビットを使用して、USCI_B0モジュールをマスターまたはスレーブとして設定する。
- データビット数の設定 (UC7BIT)
UC7BIT
ビットを使用して、データ長を7ビットまたは8ビットに設定する。
- クロック位相とポラリティの設定 (UCCKPH, UCCKPL)
UCCKPH
ビットとUCCKPL
ビットを使用して、SPIモードでのクロック位相とポラリティを設定する。
- ソフトウェアリセット (UCSWRST)
UCSWRST
ビットを使用して、USCI_B0モジュールをリセットする。
これらの設定を適切に行うことにより、目的のシリアル通信プロトコルを実装して、他のデバイスとの通信を確立することができる。
UCB0CTL1レジスタは、USCI_B0モジュールの動作を細かく制御するための重要なレジスタの1つである。
UCB0CTL1レジスタは、I2C通信だけでなく、SPI通信でも使用される。
USCI_B0モジュールは、I2C通信とSPI通信の両方の通信プロトコルをサポートしているため、UCB0CTL1レジスタには両方のプロトコルに関連する設定が含まれている。
I2C通信に関連するビットは以下の通りである。
- UCTR
- UCTXSTT
- UCTXSTP
UCB0CTL1レジスタの重要なビット
UCB0CTL1
レジスタには、I2C通信モードで使用される3つの重要なビットがある。
以下に示すビットは、I2C通信におけるデータの送受信や、スタート・ストップコンディションの制御に使用される。
マスターモードでは、UCTXSTP
ビット、および、UCTXSTT
ビットを適切に設定することにより、I2C通信のタイミングを制御できる。
スレーブモードでは、UCTR
ビットを設定することにより、データの送信または受信を指定できる。
UCTR (Transmit / Receive Mode)
このビットは、I2Cスレーブモードでのデータの送受信方向を制御する。
- 0
- 受信モード (スレーブはマスターからデータを受信)
- 1
- 送信モード (スレーブはマスターにデータを送信)
UCTXSTT (Transmit START Condition)
このビットを1
に設定する場合と、マスターモードでI2Cバスにスタートコンディションを送信する。
スタートコンディションは、データ転送の開始を示すために使用する。
- 0
- 影響なし
- 1
- I2Cバスにスタートコンディションを送信
UCTXSTP (Transmit STOP Condition)
このビットを1
に設定する場合、マスターモードでI2Cバスにストップコンディションを送信する。
ストップコンディションは、データ転送の終了を示すために使用する。
- 0
- 影響なし
- 1
- I2Cバスにストップコンディションを送信
UCB0CTL0 : USCI_B0制御レジスタ0
UCSYNC : 同期モード有効ビット (I2Cモードの選択)
- 0
- 非同期モード (UART通信)
- 1
- 同期モード (I2C、SPI通信)
UCMODE : モード選択ビット (I2Cモードの選択)
- 00
- 3線式SPI (UCxSIMO、UCxSOMI、UCxCLK)
- 01
- 4線式SPI (UCxSIMO、UCxSOMI、UCxCLK、UCxSTE)
- 10
- I2Cモード
- 11
- 予約済み
UCMST : マスター / スレーブモード選択ビット
- 0
- スレーブモード
- 1
- マスターモード
UCTR : 送信 / 受信モード選択ビット (I2Cモードでのみ使用)
応答確認の有効化を行うビットである。
- 0
- 受信モード
- 1
- 送信モード
UCB0BR0, UCB0BR1 : USCI_B0ボーレートレジスタ
UCB0CLK
レジスタ、UCB0BR0
レジスタ、UCB0BR1
の3つのレジスタを組み合わせて、I2Cの通信速度を設定する。
UCB0I2CSA : USCI_B0 I2Cスレーブアドレスレジスタ
スレーブモードでは、自身のスレーブアドレスを設定する。
マスターモードでは、通信するスレーブデバイスのアドレスを設定する。
UCB0TXBUF : USCI_B0送信バッファレジスタ
UCB0TXBUF : USCI_B0送信バッファレジスタとは
UCB0TXBUFレジスタは、送信するデータを1バイトずつ書き込むレジスタである。
このレジスタにデータを書き込むと、自動的に送信が開始される。
データを送信する時、UCB0TXBUFレジスタが空になるのを待つ必要は無い。
I2C通信では、以下のような手順でデータを送信する。
- UCB0TXBUFレジスタにデータを書き込む。
- 書き込まれたデータが自動的に送信される。
- 送信が完了すると、
UCB0TXIFG
フラグがセットされる。 - 次のデータを送信する場合は、
UCB0TXIFG
フラグをクリアして、再度、UCB0TXBUF
レジスタにデータを書き込む。
つまり、1バイトずつデータを送信することができるため、UCB0TXBUFレジスタが空になるのを待つ必要は無い。
ただし、前のデータの送信が完了する前に新しいデータを書き込んでしまうと、データが上書きされてしまうため、注意が必要である。
一般的には、UCB0TXIFG
フラグを確認する、または、送信完了割り込みを使用して前のデータの送信が完了したことを確認した後に次のデータを書き込むことにより、
データの送信タイミングを適切に制御できる。
サンプルコード
以下の例では、I2C通信において、スレーブアドレスを0x48に設定して、マスターデバイスからのリクエストに応じてデータを送信している。
I2C通信の送信割り込みを設定する手順を、以下に示す。
- GPIOの設定
- P1.6およびP1.7をI2Cピン (UCB0SCLとUCB0SDA) として設定する。
- USCI_B0の設定
- I2Cモード、同期モード、スレーブアドレスを設定する。
- 送信割り込みの有効化
- IE2レジスタの
UCB0TXIE
ビットを設定する。
- IE2レジスタの
- CPUをオフにして、割り込みを有効化する。
送信割り込みが発生する時、USCI0TX_ISR
割り込みサービスルーチンが呼び出される。
この中で、配列transmitDataから次のデータを読み出して、UCB0TXBUFレジスタに書き込む。
これにより、データの送信が自動的に開始される。
全てのデータの送信が完了すると、送信割り込みを無効化する。
マスターデバイスからリクエストを受信すると、スレーブアドレスの一致により、送信割り込みが発生して、データの送信が自動的に開始される。
#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の設定
P1SEL |= BIT6 | BIT7; // I2Cピンを選択 (UCB0SDAはP1.7, UCB0SCLはP1.6)
P1SEL2|= BIT6 | BIT7; // I2Cピンを選択 (UCB0SDAはP1.7, UCB0SCLはP1.6)
// USCI_B0 の設定
UCB0CTL1 |= UCSWRST; // ソフトウェアリセットを有効化
UCB0CTL0 = UCMODE_3 | UCSYNC; // I2Cモード, 同期モード
UCB0I2COA = SLAVE_ADDRESS; // スレーブアドレスを設定
UCB0CTL1 &= ~UCSWRST; // ソフトウェアリセットを解除
IE2 |= UCB0TXIE; // 送信割り込みを有効化
__bis_SR_register(CPUOFF | GIE); // CPUをオフにして, 割り込みを有効化
while(1) {
// メインループ
// ...略
}
}
// USCI_B0送信割り込みサービスルーチン
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
if (transmitIndex < sizeof(transmitData)) {
UCB0TXBUF = transmitData[transmitIndex++]; // 次のデータを送信バッファに書き込む
}
else {
IE2 &= ~UCB0TXIE; // 送信完了後、送信割り込みを無効化
}
}
UCB0RXBUF : USCI_B0受信バッファレジスタ
UCB0RXBUF : USCI_B0受信バッファレジスタとは
受信したデータを読み出すレジスタである。
新しいデータを受信すると、UCB0RXIFG
フラグがセットされる。
UCB0RXBUFレジスタは、I2C通信で受信したデータを格納するレジスタであり、8ビット幅を持つ。
I2C通信では、データは8ビット (1バイト) 単位で送受信される。
マスターデバイスから1バイトのデータが送信されて、スレーブデバイス (MSP430G2553の場合) がそのデータを受信する時、以下の動作が行われる。
- 受信した1バイトのデータがUCB0RXBUFレジスタに格納される。
UCB0RXIFG
(USCI_B0受信割り込みフラグ) がセットされる。
したがって、UCB0RXBUFレジスタは1バイト単位でデータを受信して、UCB0RXIFG
フラグは1バイトの受信が完了したことを示す。
UCB0RXIFG
フラグがセットされることにより、新しいデータが受信されたことを示す。
このフラグは、ソフトウェアで明示的にクリアする必要がある。
一般的に、UCB0RXIFG
フラグがセットされたことを検出するには、以下に示す2つの方法がある。
- ポーリング方式
UCB0RXIFG
フラグを定期的に確認して、セットされたらデータを読み出す。
- 割り込み方式
UCB0RXIE
(USCI_B0受信割り込み有効ビット) を有効にしておき、UCB0RXIFG
フラグがセットされたら割り込みが発生するようにする。
どちらの方法を使用するかは、アプリケーションの要件や設計に依存する。
ただし、割り込み方式を使用する場合は、適切な割り込みハンドラを実装する必要がある。
サンプルコード
以下の例では、MSP430G2553でI2C通信の受信割り込みを使用している。
スレーブアドレスを0x48に設定して、マスターデバイスからのデータを受信している。
I2C通信の受信割り込みを設定する手順を、以下に示す。
- GPIOの設定
- P1.6およびP1.7をI2Cピン (UCB0SCLとUCB0SDA) として設定する。
- USCI_B0の設定
- I2Cモード、同期モード、スレーブアドレスを設定する。
- 受信割り込みの有効化
- IE2レジスタの
UCB0RXIE
ビットを設定する。
- IE2レジスタの
- CPUをオフにして、割り込みを有効化する。
受信割り込みが発生する時、USCI0RX_ISR
割り込みサービスルーチンが呼び出される。
この割り込みサービスルーチン内で、UCB0RXBUF
レジスタから受信データを読み出して、変数receivedDataに格納する。
その後、UCB0RXIFG
フラグをクリアして、次の受信割り込みに備える。
マスターデバイスからデータを受信すると、変数receivedDataにデータが格納されるため、メインループまたは他の関数からこの変数にアクセスすることにより、受信したデータを処理できる。
#include <msp430.h>
#define SLAVE_ADDRESS 0x48
volatile unsigned char receivedData;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマを停止
// GPIOの設定
P1SEL |= BIT6 | BIT7; // I2C ピンを選択 (UCB0SDA は P1.7、UCB0SCL は P1.6)
P1SEL2 |= BIT6 | BIT7; // I2C ピンを選択 (UCB0SDA は P1.7、UCB0SCL は P1.6)
// USCI_B0の設定
UCB0CTL1 |= UCSWRST; // ソフトウェアリセットを有効化
UCB0CTL0 = UCMODE_3 | UCSYNC; // I2Cモード、同期モード
UCB0I2COA = SLAVE_ADDRESS; // スレーブアドレスを設定
UCB0CTL1 &= ~UCSWRST; // ソフトウェアリセットを解除
IE2 |= UCB0RXIE; // 受信割り込みを有効化
__bis_SR_register(CPUOFF | GIE); // CPUをオフにして、割り込みを有効化
while(1) {
// メインループ
// ...略
}
}
// USCI_B0受信割り込みサービスルーチン
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
receivedData = UCB0RXBUF; // 受信データを変数に格納
UCB0RXIFG &= ~BIT0; // 受信割り込みフラグをクリア
}
IE2 : 割り込み有効化レジスタ2
IE2レジスタは、様々な割り込みソースの割り込みを有効または無効にするために使用する。
IE2レジスタの各ビットを設定することにより、対応する割り込みソースの割り込みを有効または無効にできる。
例えば、UCB0RXIE
ビットを1
に設定すると、USCI_B0モジュールの受信割り込みが有効になる。
割り込みを使用する場合、対応する割り込みサービスルーチン (ISR) を定義する必要がある。 (ISRは、割り込みが発生した時に実行される関数)
また、IE2レジスタと併せて、対応する割り込みフラグレジスタ (IFG2) も確認することが重要である。
IFG2レジスタは、割り込みの発生状況を示すフラグビットを含んでいる。
割り込みが発生すると、対応するフラグビットが設定される。
ISR内で適切な処理を行った後、フラグビットをクリアする必要がある。
IE2レジスタの各ビットの詳細を以下に示す。
UCB0RXIE : USCI_B0受信割り込み有効ビット (0ビット目)
- 0
- USCI_B0受信割り込みを無効化
- 1
- USCI_B0受信割り込みを有効化
UCB0TXIE : USCI_B0送信割り込み有効ビット (1ビット目)
- 0
- USCI_B0送信割り込みを無効化
- 1
- USCI_B0送信割り込みを有効化
UCA0RXIE : USCI_A0 受信割り込み有効ビット (2ビット目)
- 0
- USCI_A0受信割り込みを無効化
- 1
- USCI_A0受信割り込みを有効化
UCA0TXIE : USCI_A0 送信割り込み有効ビット (3ビット目)
- 0
- USCI_A0送信割り込みを無効化
- 1
- USCI_A0送信割り込みを有効化
URXIE1 : USART1 受信割り込み有効ビット (4ビット目)
- 0
- USART1受信割り込みを無効化
- 1
- USART1受信割り込みを有効化
UTXIE1 : USART1 送信割り込み有効ビット (5ビット目)
- 0
- USART1送信割り込みを無効化
- 1
- USART1送信割り込みを有効化
予約済み (Reserved) (6ビット目)
予約済みのビットは、一般的には、以下のようなガイドラインに従う。
- 読み取り時
- 予約済みビットの値は未定義であるため、読み取った値に依存するようなコードを書くべきではない。
- 書き込み時
- 予約済みビットには、常に0を書き込むようにする。
- 将来的に、これらのビットが新しい機能に割り当てられた場合、0を書き込んでおくことにより、予期しない動作を防ぐことができる。
例えば、IE2レジスタの6ビット目に値を書き込む場合は、次のように記述する。
このように記述することにより、予約済みビットに0を書き込むことで、将来の互換性を維持することができる。
IE2 = (IE2 & ~BIT6) | (0 << 6); // IE2.6 に0を書き込む
BTIE : Basic Timer 割り込み有効ビット (7ビット目)
- 0
- Basic Timer割り込みを無効化
- 1
- Basic Timer割り込みを有効化
IFG2 : 割り込みフラグレジスタ2
IFG2レジスタは、対応する割り込みイベントが発生したかどうかを示すフラグビットを含む。
IFG2レジスタの各ビットの詳細を以下に示す。
UCB0RXIFG : USCI_B0受信割り込みフラグ (0ビット目)
- 0
- 割り込みイベントなし
- 1
- USCI_B0受信割り込みイベントが発生
- 新しいデータが受信バッファに到着
UCB0TXIFG : USCI_B0送信割り込みフラグ (1ビット目)
- 0
- 割り込みイベントなし
- 1
- USCI_B0送信割り込みイベントが発生
- 送信バッファが空になり、新しいデータを書き込み可能
UCA0RXIFG : USCI_A0受信割り込みフラグ (2ビット目)
- 0
- 割り込みイベントなし
- 1
- USCI_A0受信割り込みイベントが発生
UCA0TXIFG : USCI_A0送信割り込みフラグ (3ビット目)
- 0
- 割り込みイベントなし
- 1
- USCI_A0送信割り込みイベントが発生
URXIFG1 : USART1 受信割り込みフラグ (4ビット目)
- 0
- 割り込みイベントなし
- 1
- USART1受信割り込みイベントが発生
UTXIFG1 : USART1 送信割り込みフラグ (5ビット目)
- 0
- 割り込みイベントなし
- 1
- USART1送信割り込みイベントが発生
予約済み (Reserved) (6ビット目)
BTIFG : Basic Timer 割り込みフラグ (7ビット目)
- 0
- 割り込みイベントなし
- 1
- Basic Timer割り込みイベントが発生
上記の各フラグビットは、対応する割り込みイベントが発生すると自動的に1
にセットされる。
例えば、USCI_B0モジュールでデータを受信する時、UCB0RXIFG
ビットがセットされる。
割り込みサービスルーチン (ISR) 内で割り込みイベントを処理した後、対応するフラグビットを手動でクリアする必要がある。
フラグビットをクリアしない場合、ISRが繰り返し呼び出されることになることに注意する。
フラグビットをクリアするには、一般的に、フラグビットに1
を書き込む。
例えば、UCB0RXIFG
ビットをクリアするには、次のように記述する。
UCB0RXIFG &= ~BIT0; // UCB0RXIFGビットをクリア
割り込みを使用する場合は、IE2レジスタで対応する割り込みを有効にして、IFG2レジスタでフラグビットを確認およびクリアすることが重要である。
これにより、割り込みイベントを適切に処理して、システムを安定して動作させることができる。