MochiuWiki : SUSE, EC, PCB
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
MSP430G2553 - I2Cのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
MSP430G2553 - I2C
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == I2C通信プロトコルでは、データは8ビット単位で送信される。<br> <br> I2C通信でデータを送受信する場合、以下に示すようなデータフォーマットが使用される。<br> # スタートコンディション # スレーブアドレス (7ビット) + 読み取り / 書き込みビット (1ビット) # データバイト(8ビット) # ACKまたはNACKビット # 複数のデータバイトを送信する場合は、手順3と4を繰り返す。 # ストップコンディション <br> I2C通信を行う場合、各レジスタを適切に設定して、必要に応じて割り込み処理を実装することにより、MSP430G2553マイコンでI2C通信を行うことができる。<br> <br> また、各レジスタの設定は、通信モード、クロック周波数、スレーブアドレス等、アプリケーションの要件に応じて行う。<br> <br><br> == I2C通信の速度 == I2C通信の速度は、標準モードとファストモードの2種類が一般的に使用されている。<br> <br> * 標準モード (Standard mode) *: 通信速度: 100 [kbit/s] *: 標準モードは、I2Cバスの基本的な速度である。 *: 多くのデバイスがこの速度をサポートしている。 *: 長距離の通信や、ノイズの多い環境での通信に適している。 *: <br> * ファストモード (Fast mode) *: 通信速度: 400 [kbit/s] *: ファストモードは、標準モードの4倍の速度で通信を行う。 *: 高速な通信が必要な場合に使用される。 *: 短距離の通信や、ノイズの少ない環境での通信に適している。 *: <br> これらの他にも、以下に示すような高速モードが存在する。<br> * ファストモードプラス (Fast mode plus) *: 通信速度: 1 [Mbit/s] *: I2Cバージョン 2.0で追加された。 *: ファストモードの2.5倍の速度で通信を行う。 *: <br> * ハイスピードモード (High-speed mode) *: 通信速度: 3.4 [Mbit/s] *: I2Cバージョン 3.0で追加された。 *: 非常に高速な通信が可能であるが、特殊なハードウェアが必要である。 *: <br> * ウルトラファストモード (Ultra Fast mode) *: 通信速度: 5 [Mbit/s] *: I2Cバージョン 4.0で追加された。 *: ハイスピードモードを上回る高速通信が可能である。 <br> 実際のアプリケーションでは、接続されるデバイスのサポートする速度、通信距離、ノイズ環境等を考慮して、適切な通信速度を選択する必要がある。<br> 多くの場合、標準モードやファストモードが使用されており、これらの速度で十分な性能が得られる。<br> <br> 高速モードを使用する場合は、適切なプルアップ抵抗の選択や配線の設計に注意が必要となる。<br> <br> また、デバイスの仕様を確認して、対応する通信速度を選択することが重要である。<br> <br><br> == UCB0CTL1レジスタ == ==== UCB0CTL1レジスタの概要 ==== USCI_B0 (Universal Serial Communication Interface, module B0) モジュールの制御レジスタの1つである。<br> このレジスタは、I2C通信やSPI通信等のシリアル通信プロトコルの設定や動作を制御するために使用される。<br> <br> 主な機能と設定は以下の通りである。<br> * クロック源の選択 (UCSSEL) *: <code>UCSSEL</code>ビットを使用して、USCI_B0モジュールのクロック源を選択する。 *: ACLK、SMCLK、または外部クロックから選択可能です。 *: <br> * 同期モード選択 (UCMODE) *: <code>UCMODE</code>ビットを使用して、同期式通信プロトコル (I2C、SPI) を選択する。 *: マスター / スレーブモード選択 (UCMST) *: <code>UCMST</code>ビットを使用して、USCI_B0モジュールをマスターまたはスレーブとして設定する。 *: <br> * データビット数の設定 (UC7BIT) *: <code>UC7BIT</code>ビットを使用して、データ長を7ビットまたは8ビットに設定する。 *: <br> * クロック位相とポラリティの設定 (UCCKPH, UCCKPL) *: <code>UCCKPH</code>ビットと<code>UCCKPL</code>ビットを使用して、SPIモードでのクロック位相とポラリティを設定する。 *: <br> * ソフトウェアリセット (UCSWRST) *: <code>UCSWRST</code>ビットを使用して、USCI_B0モジュールをリセットする。 <br> これらの設定を適切に行うことにより、目的のシリアル通信プロトコルを実装して、他のデバイスとの通信を確立することができる。<br> UCB0CTL1レジスタは、USCI_B0モジュールの動作を細かく制御するための重要なレジスタの1つである。<br> <br> UCB0CTL1レジスタは、I2C通信だけでなく、SPI通信でも使用される。<br> USCI_B0モジュールは、I2C通信とSPI通信の両方の通信プロトコルをサポートしているため、UCB0CTL1レジスタには両方のプロトコルに関連する設定が含まれている。<br> I2C通信に関連するビットは以下の通りである。<br> * UCTR * UCTXSTT * UCTXSTP <br> ==== UCB0CTL1レジスタの重要なビット ==== <code>UCB0CTL1</code>レジスタには、I2C通信モードで使用される3つの重要なビットがある。<br> <br> 以下に示すビットは、I2C通信におけるデータの送受信や、スタート・ストップコンディションの制御に使用される。<br> マスターモードでは、<code>UCTXSTP</code>ビット、および、<code>UCTXSTT</code>ビットを適切に設定することにより、I2C通信のタイミングを制御できる。<br> スレーブモードでは、<code>UCTR</code>ビットを設定することにより、データの送信または受信を指定できる。<br> <br> ==== UCTR (Transmit / Receive Mode) ==== このビットは、I2Cスレーブモードでのデータの送受信方向を制御する。<br> * 0 *: 受信モード (スレーブはマスターからデータを受信) * 1 *: 送信モード (スレーブはマスターにデータを送信) <br> ==== UCTXSTT (Transmit START Condition) ==== このビットを<code>1</code>に設定する場合と、マスターモードでI2Cバスにスタートコンディションを送信する。<br> <br> <u>スタートコンディションは、データ転送の開始を示すために使用する。</u><br> * 0 *: 影響なし * 1 *: I2Cバスにスタートコンディションを送信 <br> ==== UCTXSTP (Transmit STOP Condition) ==== このビットを<code>1</code>に設定する場合、マスターモードでI2Cバスにストップコンディションを送信する。<br> <br> <u>ストップコンディションは、データ転送の終了を示すために使用する。</u><br> * 0 *: 影響なし * 1 *: I2Cバスにストップコンディションを送信 <br><br> == UCB0CTL0 : USCI_B0制御レジスタ0 == ==== UCSYNC : 同期モード有効ビット (I2Cモードの選択) ==== * 0 *: 非同期モード (UART通信) * 1 *: 同期モード (I2C、SPI通信) <br> ==== UCMODE : モード選択ビット (I2Cモードの選択) ==== * 00 *: 3線式SPI (UCxSIMO、UCxSOMI、UCxCLK) * 01 *: 4線式SPI (UCxSIMO、UCxSOMI、UCxCLK、UCxSTE) * 10 *: I2Cモード * 11 *: 予約済み <br> ==== UCMST : マスター / スレーブモード選択ビット ==== * 0 *: スレーブモード * 1 *: マスターモード <br> ==== UCTR : 送信 / 受信モード選択ビット (I2Cモードでのみ使用) ==== 応答確認の有効化を行うビットである。<br> * 0 *: 受信モード * 1 *: 送信モード <br><br> == UCB0BR0, UCB0BR1 : USCI_B0ボーレートレジスタ == <code>UCB0CLK</code>レジスタ、<code>UCB0BR0</code>レジスタ、<code>UCB0BR1</code>の3つのレジスタを組み合わせて、I2Cの通信速度を設定する。<br> <math>\mbox{ 通 信 速 度 } = \dfrac{\mbox{UCB0CLK}}{(\mbox{UCB0BR0} + \mbox{UCB0BR1} \times 256)}</math><br> <br><br> == UCB0I2CSA : USCI_B0 I2Cスレーブアドレスレジスタ == スレーブモードでは、自身のスレーブアドレスを設定する。<br> マスターモードでは、通信するスレーブデバイスのアドレスを設定する。<br> <br><br> == UCB0TXBUF : USCI_B0送信バッファレジスタ == ==== UCB0TXBUF : USCI_B0送信バッファレジスタとは ==== UCB0TXBUFレジスタは、送信するデータを1バイトずつ書き込むレジスタである。<br> このレジスタにデータを書き込むと、自動的に送信が開始される。<br> <br> データを送信する時、UCB0TXBUFレジスタが空になるのを待つ必要は無い。<br> <br> I2C通信では、以下のような手順でデータを送信する。<br> # UCB0TXBUFレジスタにデータを書き込む。 # 書き込まれたデータが自動的に送信される。 # 送信が完了すると、<code>UCB0TXIFG</code>フラグがセットされる。 # 次のデータを送信する場合は、<code>UCB0TXIFG</code>フラグをクリアして、再度、<code>UCB0TXBUF</code>レジスタにデータを書き込む。 <br> つまり、1バイトずつデータを送信することができるため、UCB0TXBUFレジスタが空になるのを待つ必要は無い。<br> ただし、前のデータの送信が完了する前に新しいデータを書き込んでしまうと、データが上書きされてしまうため、注意が必要である。<br> <br> 一般的には、<code>UCB0TXIFG</code>フラグを確認する、または、送信完了割り込みを使用して前のデータの送信が完了したことを確認した後に次のデータを書き込むことにより、<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> == UCB0RXBUF : USCI_B0受信バッファレジスタ == ==== UCB0RXBUF : USCI_B0受信バッファレジスタとは ==== 受信したデータを読み出すレジスタである。<br> 新しいデータを受信すると、<code>UCB0RXIFG</code>フラグがセットされる。<br> <br> UCB0RXBUFレジスタは、I2C通信で受信したデータを格納するレジスタであり、8ビット幅を持つ。<br> I2C通信では、データは8ビット (1バイト) 単位で送受信される。<br> <br> マスターデバイスから1バイトのデータが送信されて、スレーブデバイス (MSP430G2553の場合) がそのデータを受信する時、以下の動作が行われる。<br> # 受信した1バイトのデータがUCB0RXBUFレジスタに格納される。 # <code>UCB0RXIFG</code> (USCI_B0受信割り込みフラグ) がセットされる。 <br> したがって、UCB0RXBUFレジスタは1バイト単位でデータを受信して、<code>UCB0RXIFG</code>フラグは1バイトの受信が完了したことを示す。<br> <br> <code>UCB0RXIFG</code>フラグがセットされることにより、新しいデータが受信されたことを示す。<br> このフラグは、ソフトウェアで明示的にクリアする必要がある。<br> <br> 一般的に、<code>UCB0RXIFG</code>フラグがセットされたことを検出するには、以下に示す2つの方法がある。<br> * ポーリング方式 *: <code>UCB0RXIFG</code>フラグを定期的に確認して、セットされたらデータを読み出す。 * 割り込み方式 *: <code>UCB0RXIE</code> (USCI_B0受信割り込み有効ビット) を有効にしておき、<code>UCB0RXIFG</code>フラグがセットされたら割り込みが発生するようにする。 <br> どちらの方法を使用するかは、アプリケーションの要件や設計に依存する。<br> ただし、割り込み方式を使用する場合は、適切な割り込みハンドラを実装する必要がある。<br> <br> ==== サンプルコード ==== 以下の例では、MSP430G2553でI2C通信の受信割り込みを使用している。<br> スレーブアドレスを0x48に設定して、マスターデバイスからのデータを受信している。<br> <br> I2C通信の受信割り込みを設定する手順を、以下に示す。<br> # GPIOの設定 #: P1.6およびP1.7をI2Cピン (UCB0SCLとUCB0SDA) として設定する。 # USCI_B0の設定 #: I2Cモード、同期モード、スレーブアドレスを設定する。 # 受信割り込みの有効化 #: IE2レジスタの<code>UCB0RXIE</code>ビットを設定する。 # CPUをオフにして、割り込みを有効化する。 <br> 受信割り込みが発生する時、<code>USCI0RX_ISR</code>割り込みサービスルーチンが呼び出される。<br> この割り込みサービスルーチン内で、<code>UCB0RXBUF</code>レジスタから受信データを読み出して、変数receivedDataに格納する。<br> その後、<code>UCB0RXIFG</code>フラグをクリアして、次の受信割り込みに備える。<br> <br> マスターデバイスからデータを受信すると、変数receivedDataにデータが格納されるため、メインループまたは他の関数からこの変数にアクセスすることにより、受信したデータを処理できる。<br> <syntaxhighlight lang="c"> #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; // 受信割り込みフラグをクリア } </syntaxhighlight> <br><br> == IE2 : 割り込み有効化レジスタ2 == IE2レジスタは、様々な割り込みソースの割り込みを有効または無効にするために使用する。<br> <br> IE2レジスタの各ビットを設定することにより、対応する割り込みソースの割り込みを有効または無効にできる。<br> 例えば、<code>UCB0RXIE</code>ビットを<code>1</code>に設定すると、USCI_B0モジュールの受信割り込みが有効になる。<br> <br> 割り込みを使用する場合、対応する割り込みサービスルーチン (ISR) を定義する必要がある。 (ISRは、割り込みが発生した時に実行される関数)<br> <br> また、IE2レジスタと併せて、対応する割り込みフラグレジスタ (IFG2) も確認することが重要である。<br> IFG2レジスタは、割り込みの発生状況を示すフラグビットを含んでいる。<br> 割り込みが発生すると、対応するフラグビットが設定される。<br> ISR内で適切な処理を行った後、フラグビットをクリアする必要がある。<br> <br> IE2レジスタの各ビットの詳細を以下に示す。<br> <br> ==== UCB0RXIE : USCI_B0受信割り込み有効ビット (0ビット目) ==== * 0 *: USCI_B0受信割り込みを無効化 * 1 *: USCI_B0受信割り込みを有効化 <br> ==== UCB0TXIE : USCI_B0送信割り込み有効ビット (1ビット目) ==== * 0 *: USCI_B0送信割り込みを無効化 * 1 *: USCI_B0送信割り込みを有効化 <br> ==== UCA0RXIE : USCI_A0 受信割り込み有効ビット (2ビット目) ==== * 0 *: USCI_A0受信割り込みを無効化 * 1 *: USCI_A0受信割り込みを有効化 <br> ==== UCA0TXIE : USCI_A0 送信割り込み有効ビット (3ビット目) ==== * 0 *: USCI_A0送信割り込みを無効化 * 1 *: USCI_A0送信割り込みを有効化 <br> ==== URXIE1 : USART1 受信割り込み有効ビット (4ビット目) ==== * 0 *: USART1受信割り込みを無効化 * 1 *: USART1受信割り込みを有効化 <br> ==== UTXIE1 : USART1 送信割り込み有効ビット (5ビット目) ==== * 0 *: USART1送信割り込みを無効化 * 1 *: USART1送信割り込みを有効化 <br> ==== 予約済み (Reserved) (6ビット目) ==== 予約済みのビットは、一般的には、以下のようなガイドラインに従う。<br> * 読み取り時 *: 予約済みビットの値は未定義であるため、読み取った値に依存するようなコードを書くべきではない。 * 書き込み時 *: 予約済みビットには、常に0を書き込むようにする。 *: 将来的に、これらのビットが新しい機能に割り当てられた場合、0を書き込んでおくことにより、予期しない動作を防ぐことができる。 <br> 例えば、IE2レジスタの6ビット目に値を書き込む場合は、次のように記述する。<br> このように記述することにより、予約済みビットに0を書き込むことで、将来の互換性を維持することができる。<br> <syntaxhighlight lang="c"> IE2 = (IE2 & ~BIT6) | (0 << 6); // IE2.6 に0を書き込む </syntaxhighlight> <br> ==== BTIE : Basic Timer 割り込み有効ビット (7ビット目) ==== * 0 *: Basic Timer割り込みを無効化 * 1 *: Basic Timer割り込みを有効化 <br><br> == IFG2 : 割り込みフラグレジスタ2 == IFG2レジスタは、対応する割り込みイベントが発生したかどうかを示すフラグビットを含む。<br> <br> IFG2レジスタの各ビットの詳細を以下に示す。<br> <br> ==== UCB0RXIFG : USCI_B0受信割り込みフラグ (0ビット目) ==== * 0 *: 割り込みイベントなし * 1 *: USCI_B0受信割り込みイベントが発生 *: 新しいデータが受信バッファに到着 <br> ==== UCB0TXIFG : USCI_B0送信割り込みフラグ (1ビット目) ==== * 0 *: 割り込みイベントなし * 1 *: USCI_B0送信割り込みイベントが発生 *: 送信バッファが空になり、新しいデータを書き込み可能 <br> ==== UCA0RXIFG : USCI_A0受信割り込みフラグ (2ビット目) ==== * 0 *: 割り込みイベントなし * 1 *: USCI_A0受信割り込みイベントが発生 <br> ==== UCA0TXIFG : USCI_A0送信割り込みフラグ (3ビット目) ==== * 0 *: 割り込みイベントなし * 1 *: USCI_A0送信割り込みイベントが発生 <br> ==== URXIFG1 : USART1 受信割り込みフラグ (4ビット目) ==== * 0 *: 割り込みイベントなし * 1 *: USART1受信割り込みイベントが発生 <br> ==== UTXIFG1 : USART1 送信割り込みフラグ (5ビット目) ==== * 0 *: 割り込みイベントなし * 1 *: USART1送信割り込みイベントが発生 <br> ==== 予約済み (Reserved) (6ビット目) ==== <br> ==== BTIFG : Basic Timer 割り込みフラグ (7ビット目) ==== * 0 *: 割り込みイベントなし * 1 *: Basic Timer割り込みイベントが発生 <br> 上記の各フラグビットは、対応する割り込みイベントが発生すると自動的に<code>1</code>にセットされる。<br> 例えば、USCI_B0モジュールでデータを受信する時、<code>UCB0RXIFG</code>ビットがセットされる。<br> <br> 割り込みサービスルーチン (ISR) 内で割り込みイベントを処理した後、対応するフラグビットを手動でクリアする必要がある。<br> <u>フラグビットをクリアしない場合、ISRが繰り返し呼び出されることになることに注意する。</u><br> <br> フラグビットをクリアするには、一般的に、フラグビットに<code>1</code>を書き込む。<br> 例えば、<code>UCB0RXIFG</code>ビットをクリアするには、次のように記述する。<br> <syntaxhighlight lang="c"> UCB0RXIFG &= ~BIT0; // UCB0RXIFGビットをクリア </syntaxhighlight> <br> <u>割り込みを使用する場合は、IE2レジスタで対応する割り込みを有効にして、IFG2レジスタでフラグビットを確認およびクリアすることが重要である。</u><br> これにより、割り込みイベントを適切に処理して、システムを安定して動作させることができる。<br> <br><br> __FORCETOC__ [[カテゴリ:MSP430]]
MSP430G2553 - I2C
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse