MSP430F149 - UART

2025年12月15日 (月) 22:56時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == UART (Universal Asynchronous Receiver / Transmitter) (汎用非同期送受信機) は、シリアル通信の一種であり、データを1ビットずつ送受信する。<br> <br> * 非同期通信 *: 送信側と受信側が別々のクロックを使用して、あらかじめ設定されたボーレート (通信速度) に基づいてデータを送受信する。 *: <br> * データフォーマット *: スタートビット、データビッ…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

概要

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通信を行っている。
主な設定手順は以下の通りである。

  1. ウォッチドッグタイマを停止する。
  2. クロックを設定する。(この例では、FLLを使用してDCOを約2[MHz]に設定)
  3. P3SELレジスタを設定して、P3.4とP3.5をUSART0の送受信ピンとして使用できるようにする。
  4. ME1レジスタでUSART0の送信と受信を有効化する。
  5. U0CTLレジスタでSWRSTビットを立てて、USART0をリセット状態にする。
  6. U0CTLレジスタでデータ長、パリティ、ストップビットを設定する。
  7. U0TCTLレジスタでクロックソース (SMCLK) を選択する。
  8. U0BR0、U0BR1レジスタでボーレートを設定する。
  9. U0MCTLレジスタでモジュレーションを設定する。
  10. SWRSTビットをクリアして、USARTをリセットから解除する。
  11. 必要に応じて、受信割り込みを有効化する。


これにより、USART0が9600[bps]のUART通信を行えるように設定される。


ボーレート計算

MSP430F149のUSARTモジュールでは、ボーレートは以下に示す式で計算される。

 

BRCLK : USARTのクロックソース (通常はSMCLK) の周波数
N : 分周比


Nの値は、U0BR0とU0BR1レジスタ(16ビット値)で設定される。

例えば、SMCLK = 2[MHz]で9600[bps]のボーレートを得るには、以下のように計算する。

# 計算例:
 


整数値に丸めて、N = 208とする。
この時、実際のボーレートは以下のようになる。

<math>\mbox{ 実 際 の ボ ー レ ー ト } = \dfrac{2000000}{208} = 9615 \, \mbox{[bps]}


これは、設定値 9600[bps]に対して約0.16%の誤差となる。
一般的に、ボーレート誤差は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通信を行う場合は、以下の手順に従う。

  1. シリアルポートの接続
    マイコンのUART送信ピン (TX) をPCのシリアル受信ピン (RX) に接続する。
    マイコンのUART受信ピン (RX) をPCのシリアル送信ピン (TX) に接続する。
    マイコンとPCのグラウンド (GND) を接続する。
    MSP430F149でUSART0を使用する場合は、P3.4 (UTXD0) と P3.5 (URXD0) を使用する。

  2. シリアルポートの設定
    ターミナルを開いて、シリアルポートを設定する。
    stty -F <デバイスファイルのパス> <ボーレート> <データ長> <ストップビット長> <パリティビットの有無>

    例: stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb

    /dev/ttyUSB0は、使用するシリアルポートのデバイスファイル名を入力する。(環境に応じて適切なデバイスファイル名に変更すること)
    9600は、ボーレートを表す。(マイコン側の設定と一致させる)
    cs8は、データ長を8ビットに設定する。
    -cstopbは、ストップビットを1ビットに設定する。
    -parenbは、パリティビットを無効にする。

  3. 通信の確立
    catコマンドを使用して、シリアルポートを読み書きする。
    シリアルポートからの入力を受信して、ターミナルに表示する。
    cat <デバイスファイルのパス>
    例: cat /dev/ttyUSB0

    別のターミナルを開いて、echoコマンドおよびcatを使用して、シリアルポートに書き込む。
    これにより、シリアルポートにテキストが送信される。
    echo "Hello, MSP430!" > <デバイスファイルのパス>

  4. 通信の確認
    マイコン側で受信処理が正しく実装されている場合、送信したテキストがマイコンで受信される。
    マイコン側で送信処理が正しく実装されている場合、マイコンから送信されたデータがターミナルに表示される。


※注意
シリアルポートのデバイスファイル名 (/dev/ttyUSB0等) は、環境によって異なる場合がある。
ls /dev/tty*コマンドを実行して、利用可能なシリアルポートを確認すること。
ボーレートやデータフォーマット等の設定は、マイコン側の設定と一致している必要がある。

一部のLinuxディストリビューションでは、シリアルポートへのアクセス権限が必要な場合があるため、適切な権限を設定すること。