細 文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{… |
|||
| (同じ利用者による、間の5版が非表示) | |||
| 13行目: | 13行目: | ||
<br> | <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> | <br><br> | ||
| 124行目: | 163行目: | ||
== UCB0TXBUF : USCI_B0送信バッファレジスタ == | == UCB0TXBUF : USCI_B0送信バッファレジスタ == | ||
==== UCB0TXBUF : USCI_B0送信バッファレジスタとは ==== | |||
UCB0TXBUFレジスタは、送信するデータを1バイトずつ書き込むレジスタである。<br> | UCB0TXBUFレジスタは、送信するデータを1バイトずつ書き込むレジスタである。<br> | ||
このレジスタにデータを書き込むと、自動的に送信が開始される。<br> | このレジスタにデータを書き込むと、自動的に送信が開始される。<br> | ||
| 140行目: | 180行目: | ||
一般的には、<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> | ||
== UCB0RXBUF : USCI_B0受信バッファレジスタ == | == UCB0RXBUF : USCI_B0受信バッファレジスタ == | ||
==== UCB0RXBUF : USCI_B0受信バッファレジスタとは ==== | |||
受信したデータを読み出すレジスタである。<br> | 受信したデータを読み出すレジスタである。<br> | ||
新しいデータを受信すると、<code>UCB0RXIFG</code>フラグがセットされる。<br> | 新しいデータを受信すると、<code>UCB0RXIFG</code>フラグがセットされる。<br> | ||
| 166行目: | 269行目: | ||
どちらの方法を使用するかは、アプリケーションの要件や設計に依存する。<br> | どちらの方法を使用するかは、アプリケーションの要件や設計に依存する。<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> | <br><br> | ||
== IE2 : 割り込み有効化レジスタ2 == | == IE2 : 割り込み有効化レジスタ2 == | ||
==== UCB0TXIE : USCI_B0送信割り込み有効ビット ==== | 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 | * 0 | ||
*: | *: USCI_A0送信割り込みを無効化 | ||
* 1 | * 1 | ||
*: | *: USCI_A0送信割り込みを有効化 | ||
<br> | <br> | ||
==== | ==== URXIE1 : USART1 受信割り込み有効ビット (4ビット目) ==== | ||
* 0 | * 0 | ||
*: | *: USART1受信割り込みを無効化 | ||
* 1 | * 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> | <br><br> | ||
== IFG2 : 割り込みフラグレジスタ2 == | == IFG2 : 割り込みフラグレジスタ2 == | ||
==== UCB0TXIFG : USCI_B0送信割り込みフラグ ==== | IFG2レジスタは、対応する割り込みイベントが発生したかどうかを示すフラグビットを含む。<br> | ||
<br> | |||
IFG2レジスタの各ビットの詳細を以下に示す。<br> | |||
<br> | |||
==== UCB0RXIFG : USCI_B0受信割り込みフラグ (0ビット目) ==== | |||
* 0 | |||
*: 割り込みイベントなし | |||
* 1 | |||
*: USCI_B0受信割り込みイベントが発生 | |||
*: 新しいデータが受信バッファに到着 | |||
<br> | |||
==== UCB0TXIFG : USCI_B0送信割り込みフラグ (1ビット目) ==== | |||
* 0 | * 0 | ||
*: | *: 割り込みイベントなし | ||
* 1 | * 1 | ||
*: USCI_B0送信割り込みイベントが発生 | |||
*: 送信バッファが空になり、新しいデータを書き込み可能 | *: 送信バッファが空になり、新しいデータを書き込み可能 | ||
<br> | <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 | * 0 | ||
*: | *: 割り込みイベントなし | ||
* 1 | * 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> | <br><br> | ||
{{#seo: | |||
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki | |||
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 | |||
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux | |||
|image=/resources/assets/MochiuLogo_Single_Blue.png | |||
}} | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:MSP430]] | [[カテゴリ:MSP430]] | ||