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

124行目: 124行目:


== UCB0TXBUF : USCI_B0送信バッファレジスタ ==
== UCB0TXBUF : USCI_B0送信バッファレジスタ ==
==== UCB0TXBUF : USCI_B0送信バッファレジスタとは ====
UCB0TXBUFレジスタは、送信するデータを1バイトずつ書き込むレジスタである。<br>
UCB0TXBUFレジスタは、送信するデータを1バイトずつ書き込むレジスタである。<br>
このレジスタにデータを書き込むと、自動的に送信が開始される。<br>
このレジスタにデータを書き込むと、自動的に送信が開始される。<br>
140行目: 141行目:
一般的には、<code>UCB0TXIFG</code>フラグを確認する、または、送信完了割り込みを使用して前のデータの送信が完了したことを確認した後に次のデータを書き込むことにより、<br>
一般的には、<code>UCB0TXIFG</code>フラグを確認する、または、送信完了割り込みを使用して前のデータの送信が完了したことを確認した後に次のデータを書き込むことにより、<br>
データの送信タイミングを適切に制御できる。<br>
データの送信タイミングを適切に制御できる。<br>
<br>
==== サンプルコード ====
以下の例では、I2C通信において、スレーブアドレスを0x48に設定して、マスターデバイスからのリクエストに応じてデータを送信している。<br>
<br>
I2C通信の送信割り込みを設定する手順を、以下に示す。<br>
# GPIOの設定
#: P1.6およびP1.7をI2Cピン (UCB0SCLとUCB0SDA) として設定する。
# USCI_B0の設定
#: I2Cモード、同期モード、スレーブアドレスを設定する。
# 送信割り込みの有効化
#: IE2レジスタの<code>UCB0TXIE</code>ビットを設定する。
# CPUをオフにして、割り込みを有効化する。
<br>
送信割り込みが発生する時、<code>USCI0TX_ISR</code>割り込みサービスルーチンが呼び出される。<br>
この中で、配列transmitDataから次のデータを読み出して、UCB0TXBUFレジスタに書き込む。<br>
これにより、データの送信が自動的に開始される。<br>
<br>
全てのデータの送信が完了すると、送信割り込みを無効化する。<br>
マスターデバイスからリクエストを受信すると、スレーブアドレスの一致により、送信割り込みが発生して、データの送信が自動的に開始される。<br>
<syntaxhighlight lang="c">
#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;                            // 送信完了後、送信割り込みを無効化
    }
}
</syntaxhighlight>
<br><br>
<br><br>