MSP430G2553 - I2C
概要
I2C通信プロトコルでは、データは8ビット単位で送信される。
I2C通信でデータを送受信する場合、以下に示すようなデータフォーマットが使用される。
- スタートコンディション
- スレーブアドレス (7ビット) + 読み取り / 書き込みビット (1ビット)
- データバイト(8ビット)
- ACKまたはNACKビット
- 複数のデータバイトを送信する場合は、手順3と4を繰り返す。
- ストップコンディション
I2C通信を行う場合、各レジスタを適切に設定して、必要に応じて割り込み処理を実装することにより、MSP430G2553マイコンでI2C通信を行うことができる。
また、各レジスタの設定は、通信モード、クロック周波数、スレーブアドレス等、アプリケーションの要件に応じて行う。
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
UCB0TXIE : USCI_B0送信割り込み有効ビット
- 0
- 割り込み無効
- 1
- 割り込み有効
UCB0RXIE : USCI_B0受信割り込み有効ビット
- 0
- 割り込み無効
- 1
- 割り込み有効
IFG2 : 割り込みフラグレジスタ2
UCB0TXIFG : USCI_B0送信割り込みフラグ
- 0
- 割り込みなし
- 1
- 送信バッファが空になり、新しいデータを書き込み可能
UCB0RXIFG : USCI_B0受信割り込みフラグ
- 0
- 割り込みなし
- 1
- 新しいデータが受信バッファに到着