「MSP430F149 - UART」の版間の差分
ページの作成:「== 概要 == UART (Universal Asynchronous Receiver / Transmitter) (汎用非同期送受信機) は、シリアル通信の一種であり、データを1ビットずつ送受信する。<br> <br> * 非同期通信 *: 送信側と受信側が別々のクロックを使用して、あらかじめ設定されたボーレート (通信速度) に基づいてデータを送受信する。 *: <br> * データフォーマット *: スタートビット、データビッ…」 |
|||
| 276行目: | 276行目: | ||
<br><br> | <br><br> | ||
== | == ボーレートの計算 == | ||
MSP430F149のUSARTモジュールでは、ボーレートは以下に示す式で計算される。<br> | MSP430F149のUSARTモジュールでは、ボーレートは以下に示す式で計算される。<br> | ||
<br> | <br> | ||
| 294行目: | 294行目: | ||
この時、実際のボーレートは以下のようになる。<br> | この時、実際のボーレートは以下のようになる。<br> | ||
<br> | <br> | ||
<math>\mbox{ 実 際 の ボ ー レ ー ト } = \dfrac{2000000}{208} = 9615 \, \mbox{[bps]}<br> | <math>\mbox{ 実 際 の ボ ー レ ー ト } = \dfrac{2000000}{208} = 9615 \, \mbox{[bps]}</math><br> | ||
<br> | <br> | ||
これは、設定値 9600[bps]に対して約0.16%の誤差となる。<br> | これは、設定値 9600[bps]に対して約0.16%の誤差となる。(9615 / 9600 = 1.00156...)<br> | ||
<u>一般的に、ボーレート誤差は2[%]以内であれば正常に通信できる。</u><br> | <u>一般的に、ボーレート誤差は2[%]以内であれば正常に通信できる。</u><br> | ||
<br> | <br> | ||
2025年12月15日 (月) 22:59時点における最新版
概要
UART (Universal Asynchronous Receiver / Transmitter) (汎用非同期送受信機) は、シリアル通信の一種であり、データを1ビットずつ送受信する。
- 非同期通信
- 送信側と受信側が別々のクロックを使用して、あらかじめ設定されたボーレート (通信速度) に基づいてデータを送受信する。
- データフォーマット
- スタートビット、データビット (通常8ビット)、パリティビット (オプション)、ストップビットで構成される。
- ボーレート
- 通信速度のことであり、ビット/秒 (bps) で表現される。
- 送信側と受信側で同じ設定が必要となる。
- フロー制御
- データの送受信を制御するために、ハードウェアまたはソフトウェアの手法を使用する。
- 送受信バッファ
- 送信するデータと受信したデータを一時的に保持するバッファである。
UARTは、マイコンとPC間、マイコン同士、または他の周辺機器との通信に広く利用されている。
UARTを使用する場合は、ボーレート、データフォーマット、フロー制御等の設定を適切に行う必要がある。
UART
非同期通信
UARTは非同期通信方式を採用している。
送信側と受信側が別々のクロックを使用して、データの送受信タイミングを同期させる必要がない。
送信側と受信側は、あらかじめ設定されたボーレート (通信速度) に基づいてデータを送受信する。
シリアル通信
UARTは、データを1ビットずつ順番に送信するシリアル通信方式である。
送信側は、データを1ビットずつ送信線 (TX) に送出して、受信側は、受信線 (RX) から1ビットずつデータを受信する。
データフォーマット
UARTでは、一般的に以下に示すようなデータフォーマットが使用されている。
- スタートビット
- データの開始を示すビット (通常は0)
- データビット
- 実際のデータを表すビット (通常は8ビット)
- パリティビット
- エラー検出用のビット (偶数パリティ または 奇数パリティ)
- ストップビット
- データの終了を示すビット (通常は1 または 2ビット)
ボーレート
ボーレートは、UARTの通信速度を表す。
単位は、ビット/秒 (bps) である。
一般的なボーレートには、9600[bps]、19200[bps]、38400[bps]、115200[bps]等がある。
送信側と受信側は、同じボーレートに設定する必要がある。
フロー制御
UARTでは、データの送受信を制御するためにフロー制御が使用される場合がある。
- ハードウェアフロー制御
- RTS (Request to Send) 信号 と CTS (Clear to Send) 信号を使用して、データの送受信を制御する。
- ソフトウェアフロー制御
- XON / XOFF制御文字を使用して、データの送受信を制御する。
送受信バッファ
UARTには、送信バッファと受信バッファが用意されている。
送信バッファは送信するデータを一時的に保持して、受信バッファは受信したデータを一時的に保持する。
バッファを使用することにより、データの送受信を効率的に行うことができる。
耐ノイズ性
UARTは、他の通信方式と比較して、ノイズの影響を比較的受けやすい通信方式である。
以下に示す理由から、UARTはノイズに弱いといえる。
- 単線通信
- UARTは、送信線 (TX) と 受信線 (RX) の2本の信号線を使用して通信を行う。
- ノイズの影響を受けると、データの誤りが発生しやすくなる。
- 非同期通信
- UARTは非同期通信方式を採用しているため、送信側と受信側のクロックが完全に同期していない。
- ノイズの影響でデータのタイミングがずれると、通信エラーが発生する可能性がある。
- 信号レベル
- UARTは、一般的にTTLレベル (0[V]~5[V]) や CMOSレベル (0[V]~3.3[V]) の信号レベルを使用する。
- これらの信号レベルは、ノイズの影響を受けやすく、信号の品質が低下する可能性がある。
ただし、UARTのノイズ耐性を向上させるためのいくつかの手法がある。
- シールドケーブルの使用
- 通信線をシールドケーブルで保護することにより、外部ノイズの影響を軽減することができる。
- 適切な信号レベルの選択
- 通信距離や環境に応じて、適切な信号レベル (RS-232、RS-422、RS-485等) を選択することにより、ノイズの影響を軽減できる。
- パリティビットの使用
- パリティビットを使用することにより、通信エラーを検出して、データの整合性を確認できる。
- フィルタの使用
- ハードウェアまたはソフトウェアのフィルタを使用して、高周波ノイズを除去することができる。
これらの手法を適切に組み合わせることにより、UARTのノイズ耐性を向上させることができる。
ただし、極端に高いノイズ環境下では、より高いノイズ耐性を持つ通信方式 (I2C、SPI、CAN等) の使用を検討する必要がある。
MSP430F149のUSARTモジュール
MSP430F149には、2つのUSART (Universal Synchronous/Asynchronous Receiver/Transmitter) モジュールが搭載されている。
- USART0
- 1つ目のUSARTモジュールである。
- 送信ピン: P3.4 (UTXD0)
- 受信ピン: P3.5 (URXD0)
- USART1
- 2つ目のUSARTモジュールである。
- 送信ピン: P3.6 (UTXD1)
- 受信ピン: P3.7 (URXD1)
各USARTモジュールは、UART(非同期)モード または SPI(同期)モードで動作させることができる。
UARTモードでは、シリアル通信を行うために必要な送信、受信、ボーレート設定、データフォーマット設定等の機能が提供される。
主要なレジスタ
USARTモジュールは、以下の主要なレジスタで制御される。
- 制御レジスタ
- U0CTL (USART0制御レジスタ)
- U1CTL (USART1制御レジスタ)
- USARTの動作モード、データ長、パリティ、ストップビット等を設定する。
- 送信制御レジスタ
- U0TCTL (USART0送信制御レジスタ)
- U1TCTL (USART1送信制御レジスタ)
- クロックソース、送信許可等を設定する。
- 受信制御レジスタ
- U0RCTL (USART0受信制御レジスタ)
- U1RCTL (USART1受信制御レジスタ)
- 受信エラーフラグ等を確認する。
- ボーレート制御レジスタ
- U0BR0、U0BR1 (USART0ボーレートレジスタ)
- U1BR0、U1BR1 (USART1ボーレートレジスタ)
- ボーレートを設定する。
- モジュレーション制御レジスタ
- U0MCTL (USART0モジュレーション制御レジスタ)
- U1MCTL (USART1モジュレーション制御レジスタ)
- ボーレート生成の精度を向上させるためのモジュレーションパターンを設定する。
- 送受信バッファ
- U0TXBUF (USART0送信バッファ)、U0RXBUF (USART0受信バッファ)
- U1TXBUF (USART1送信バッファ)、U1RXBUF (USART1受信バッファ)
- 送受信するデータを格納する。
- 割り込みフラグレジスタ
- IFG1 (USART0用: UTXIFG0、URXIFG0)
- IFG2 (USART1用: UTXIFG1、URXIFG1)
- 送信完了、受信完了の割り込みフラグを確認する。
UARTの設定
UART通信の設定を行う場合、U0CTLレジスタ(USART0の場合)または U1CTLレジスタ(USART1の場合)を適切に設定する必要がある。
ただし、通信相手のデバイスも同じデータフォーマットを使用するように設定する必要があることに注意する。
以下の例では、USART0を使用した設定を示す。
USART1を使用する場合は、U0CTLをU1CTLに置き換える。
- データ長 8ビット, パリティなし, 1ストップビット (8N1)
U0CTL &= ~PENA; // パリティなし
U0CTL &= ~CHAR; // 8ビットデータ
U0CTL &= ~SPB; // 1ストップビット
- データ長 8ビット, パリティなし, 2ストップビット (8N2)
U0CTL &= ~PENA; // パリティなし
U0CTL &= ~CHAR; // 8ビットデータ
U0CTL |= SPB; // 2ストップビット
- データ長 7ビット, パリティ付き, 1ストップビット (7E1)
U0CTL |= PENA; // パリティ付き
U0CTL |= CHAR; // 7ビットデータ
U0CTL &= ~SPB; // 1ストップビット
U0CTL &= ~PEV; // 奇数パリティ(PEV=0で奇数、PEV=1で偶数)
または、偶数パリティの場合は以下のように設定する。
U0CTL |= PENA; // パリティ付き
U0CTL |= CHAR; // 7ビットデータ
U0CTL &= ~SPB; // 1ストップビット
U0CTL |= PEV; // 偶数パリティ
サンプルコード
MSP430F149マイコンを使用して、UART通信を行うための手順を、以下に示す。
ターミナルソフト (PuTTY等) を使用して、設定したボーレート (以下の例では、9600[bps]) でシリアル通信を行う。
- ハードウェアの接続:
- MSP430F149のP3.4 (UTXD0) を送信端子に接続する。
- MSP430F149のP3.5 (URXD0) を受信端子に接続する。
#include <msp430.h>
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマを停止
// クロック設定 (例: DCOを使用、FLLで約2[MHz])
// 32.768kHz x 61 = 1999848 Hz (約2[MHz])
BCSCTL1 &= ~XTS; // LFXT1を低周波モードに設定
SCFQCTL = 60; // FLL乗数を設定 (N = 61)
SCFI0 = FLLD_1 | FN_2; // DCO範囲選択
// クロックが安定するまで待機
do {
IFG1 &= ~OFIFG;
for (int i = 0xFFFF; i > 0; i--);
} while (IFG1 & OFIFG);
// USART0のピン設定
P3SEL |= BIT4 + BIT5; // P3.4とP3.5をUSART0用に設定
// USART0をUARTモードに設定
ME1 |= UTXE0 + URXE0; // USART0の送信と受信を有効化
U0CTL |= SWRST; // USART0をリセット状態にする
// UART設定
U0CTL |= CHAR; // 8ビットデータ (CHAR=1で8ビット)
U0CTL &= ~PENA; // パリティなし
U0CTL &= ~SPB; // 1ストップビット
U0TCTL |= SSEL1; // SMCLKをクロックソースとして使用
// ボーレート設定: 9600[bps] (2[MHz] SMCLK時)
// ボーレート = BRCLK / N = 2000000 / 208 = 9615 bps
U0BR0 = 0xD0; // 下位バイト (208 = 0x00D0)
U0BR1 = 0x00; // 上位バイト
U0MCTL = 0x00; // モジュレーション設定
U0CTL &= ~SWRST; // USARTをリセットから解除
IE1 |= URXIE0; // 受信割り込みを有効化 (オプション)
// 送信例
while (!(IFG1 & UTXIFG0)); // 送信バッファが空になるまで待機
U0TXBUF = 'H'; // 文字 'H' を送信
// 受信例
while (!(IFG1 & URXIFG0)); // 受信バッファにデータが入るまで待機
char receivedChar = U0RXBUF; // 受信データを読み込み
// メインループ
while(1) {
// 通信処理を継続
}
}
上記のサンプルコードでは、USART0を使用してUART通信を行っている。
主な設定手順は以下の通りである。
- ウォッチドッグタイマを停止する。
- クロックを設定する。(この例では、FLLを使用してDCOを約2[MHz]に設定)
- P3SELレジスタを設定して、P3.4とP3.5をUSART0の送受信ピンとして使用できるようにする。
- ME1レジスタでUSART0の送信と受信を有効化する。
- U0CTLレジスタでSWRSTビットを立てて、USART0をリセット状態にする。
- U0CTLレジスタでデータ長、パリティ、ストップビットを設定する。
- U0TCTLレジスタでクロックソース (SMCLK) を選択する。
- U0BR0、U0BR1レジスタでボーレートを設定する。
- U0MCTLレジスタでモジュレーションを設定する。
- SWRSTビットをクリアして、USARTをリセットから解除する。
- 必要に応じて、受信割り込みを有効化する。
これにより、USART0が9600[bps]のUART通信を行えるように設定される。
ボーレートの計算
MSP430F149のUSARTモジュールでは、ボーレートは以下に示す式で計算される。
BRCLK : USARTのクロックソース (通常はSMCLK) の周波数
N : 分周比
Nの値は、U0BR0とU0BR1レジスタ(16ビット値)で設定される。
例えば、SMCLK = 2[MHz]で9600[bps]のボーレートを得るには、以下のように計算する。
# 計算例:
整数値に丸めて、N = 208とする。
この時、実際のボーレートは以下のようになる。
これは、設定値 9600[bps]に対して約0.16%の誤差となる。(9615 / 9600 = 1.00156...)
一般的に、ボーレート誤差は2[%]以内であれば正常に通信できる。
U0BR0とU0BR1の設定方法は以下の通りである。
N = 208 = 0x00D0
U0BR0 = 0xD0 (下位8ビット)
U0BR1 = 0x00 (上位8ビット)
一般的なボーレートとクロック周波数の組み合わせを下表に示す。
| SMCLK周波数 | ボーレート | N | U0BR1 | U0BR0 | 実際のボーレート | 誤差 |
|---|---|---|---|---|---|---|
| 1[MHz] | 9600bps | 104 | 0x00 | 0x68 | 9615bps | 0.16% |
| 1[MHz] | 19200bps | 52 | 0x00 | 0x34 | 19231bps | 0.16% |
| 2[MHz] | 9600bps | 208 | 0x00 | 0xD0 | 9615bps | 0.16% |
| 2[MHz] | 19200bps | 104 | 0x00 | 0x68 | 19231bps | 0.16% |
| 2[MHz] | 115200bps | 17 | 0x00 | 0x11 | 117647bps | 2.13% |
| 8[MHz] | 9600bps | 833 | 0x03 | 0x41 | 9604bps | 0.04% |
| 8[MHz] | 19200bps | 417 | 0x01 | 0xA1 | 19185bps | -0.08% |
| 8[MHz] | 115200bps | 69 | 0x00 | 0x45 | 115942bps | 0.64% |
USART1の使用
MSP430F149には、USART0に加えてUSART1も搭載されている。
USART1を使用する場合は、USART0と同様の手順で設定を行うが、レジスタ名とピン番号が異なる。
- ピン配置
- P3.6 (UTXD1) : 送信ピン
- P3.7 (URXD1) : 受信ピン
- レジスタ
- U1CTL : USART1制御レジスタ
- U1TCTL : USART1送信制御レジスタ
- U1RCTL : USART1受信制御レジスタ
- U1BR0、U1BR1 : USART1ボーレート制御レジスタ
- U1MCTL : USART1モジュレーション制御レジスタ
- U1TXBUF : USART1送信バッファ
- U1RXBUF : USART1受信バッファ
- 割り込みフラグ
- IFG2レジスタのUTXIFG1、URXIFG1ビット
- モジュール有効化
- ME2レジスタのUTXE1、URXE1ビット
以下の例では、USART1を使用している。
#include <msp430.h>
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマを停止
// クロック設定(USART0の例と同じ)
BCSCTL1 &= ~XTS;
SCFQCTL = 60;
SCFI0 = FLLD_1 | FN_2;
do {
IFG1 &= ~OFIFG;
for (int i = 0xFFFF; i > 0; i--);
} while (IFG1 & OFIFG);
// USART1のピン設定
P3SEL |= BIT6 + BIT7; // P3.6とP3.7をUSART1用に設定
// USART1をUARTモードに設定
ME2 |= UTXE1 + URXE1; // USART1の送信と受信を有効化
U1CTL |= SWRST; // USART1をリセット状態にする
// UART設定
U1CTL |= CHAR; // 8ビットデータ
U1CTL &= ~PENA; // パリティなし
U1CTL &= ~SPB; // 1ストップビット
U1TCTL |= SSEL1; // SMCLKをクロックソースとして使用
// ボーレート設定: 9600[bps] (2[MHz] SMCLK時)
U1BR0 = 0xD0;
U1BR1 = 0x00;
U1MCTL = 0x00;
U1CTL &= ~SWRST; // USARTをリセットから解除
IE2 |= URXIE1; // 受信割り込みを有効化 (オプション)
// 送信例
while (!(IFG2 & UTXIFG1)); // 送信バッファが空になるまで待機
U1TXBUF = 'A'; // 文字 'A' を送信
// メインループ
while(1) {
// 通信処理を継続
}
}
USART0とUSART1を同時に使用することも可能であり、これにより2つの独立したシリアル通信チャネルを持つことができる。
PCとのUART通信
LinuxでマイコンとUART通信を行う場合は、以下の手順に従う。
- シリアルポートの接続
- マイコンのUART送信ピン (TX) をPCのシリアル受信ピン (RX) に接続する。
- マイコンのUART受信ピン (RX) をPCのシリアル送信ピン (TX) に接続する。
- マイコンとPCのグラウンド (GND) を接続する。
- MSP430F149でUSART0を使用する場合は、P3.4 (UTXD0) と P3.5 (URXD0) を使用する。
- シリアルポートの設定
- ターミナルを開いて、シリアルポートを設定する。
stty -F <デバイスファイルのパス> <ボーレート> <データ長> <ストップビット長> <パリティビットの有無>- 例:
stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb - /dev/ttyUSB0は、使用するシリアルポートのデバイスファイル名を入力する。(環境に応じて適切なデバイスファイル名に変更すること)
- 9600は、ボーレートを表す。(マイコン側の設定と一致させる)
- cs8は、データ長を8ビットに設定する。
- -cstopbは、ストップビットを1ビットに設定する。
- -parenbは、パリティビットを無効にする。
- ターミナルを開いて、シリアルポートを設定する。
- 通信の確立
catコマンドを使用して、シリアルポートを読み書きする。- シリアルポートからの入力を受信して、ターミナルに表示する。
cat <デバイスファイルのパス>- 例:
cat /dev/ttyUSB0 - 別のターミナルを開いて、
echoコマンドおよびcatを使用して、シリアルポートに書き込む。 - これにより、シリアルポートにテキストが送信される。
echo "Hello, MSP430!" > <デバイスファイルのパス>
- 通信の確認
- マイコン側で受信処理が正しく実装されている場合、送信したテキストがマイコンで受信される。
- マイコン側で送信処理が正しく実装されている場合、マイコンから送信されたデータがターミナルに表示される。
※注意
シリアルポートのデバイスファイル名 (/dev/ttyUSB0等) は、環境によって異なる場合がある。
ls /dev/tty*コマンドを実行して、利用可能なシリアルポートを確認すること。
ボーレートやデータフォーマット等の設定は、マイコン側の設定と一致している必要がある。
一部のLinuxディストリビューションでは、シリアルポートへのアクセス権限が必要な場合があるため、適切な権限を設定すること。