📢 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> | ||