MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
MSP430F149 - UARTのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
MSP430F149 - UART
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == UART (Universal Asynchronous Receiver / Transmitter) (汎用非同期送受信機) は、シリアル通信の一種であり、データを1ビットずつ送受信する。<br> <br> * 非同期通信 *: 送信側と受信側が別々のクロックを使用して、あらかじめ設定されたボーレート (通信速度) に基づいてデータを送受信する。 *: <br> * データフォーマット *: スタートビット、データビット (通常8ビット)、パリティビット (オプション)、ストップビットで構成される。 *: <br> * ボーレート *: 通信速度のことであり、ビット/秒 (bps) で表現される。 *: 送信側と受信側で同じ設定が必要となる。 *: <br> * フロー制御 *: データの送受信を制御するために、ハードウェアまたはソフトウェアの手法を使用する。 *: <br> * 送受信バッファ *: 送信するデータと受信したデータを一時的に保持するバッファである。 <br> UARTは、マイコンとPC間、マイコン同士、または他の周辺機器との通信に広く利用されている。<br> UARTを使用する場合は、ボーレート、データフォーマット、フロー制御等の設定を適切に行う必要がある。<br> <br><br> == UART == ==== 非同期通信 ==== UARTは非同期通信方式を採用している。<br> 送信側と受信側が別々のクロックを使用して、データの送受信タイミングを同期させる必要がない。<br> <br> 送信側と受信側は、あらかじめ設定されたボーレート (通信速度) に基づいてデータを送受信する。<br> <br> ==== シリアル通信 ==== UARTは、データを1ビットずつ順番に送信するシリアル通信方式である。<br> 送信側は、データを1ビットずつ送信線 (TX) に送出して、受信側は、受信線 (RX) から1ビットずつデータを受信する。<br> <br> ==== データフォーマット ==== UARTでは、一般的に以下に示すようなデータフォーマットが使用されている。<br> <br> * スタートビット *: データの開始を示すビット (通常は0) * データビット *: 実際のデータを表すビット (通常は8ビット) * パリティビット *: エラー検出用のビット (偶数パリティ または 奇数パリティ) * ストップビット *: データの終了を示すビット (通常は1 または 2ビット) <br> ==== ボーレート ==== ボーレートは、UARTの通信速度を表す。<br> 単位は、ビット/秒 (bps) である。<br> <br> 一般的なボーレートには、9600[bps]、19200[bps]、38400[bps]、115200[bps]等がある。<br> 送信側と受信側は、同じボーレートに設定する必要がある。<br> <br> ==== フロー制御 ==== UARTでは、データの送受信を制御するためにフロー制御が使用される場合がある。<br> <br> * ハードウェアフロー制御 *: RTS (Request to Send) 信号 と CTS (Clear to Send) 信号を使用して、データの送受信を制御する。 * ソフトウェアフロー制御 *: XON / XOFF制御文字を使用して、データの送受信を制御する。 <br> ==== 送受信バッファ ==== UARTには、送信バッファと受信バッファが用意されている。<br> <br> 送信バッファは送信するデータを一時的に保持して、受信バッファは受信したデータを一時的に保持する。<br> バッファを使用することにより、データの送受信を効率的に行うことができる。<br> <br><br> == 耐ノイズ性 == UARTは、他の通信方式と比較して、ノイズの影響を比較的受けやすい通信方式である。<br> 以下に示す理由から、UARTはノイズに弱いといえる。<br> <br> * 単線通信 *: UARTは、送信線 (TX) と 受信線 (RX) の2本の信号線を使用して通信を行う。 *: ノイズの影響を受けると、データの誤りが発生しやすくなる。 *: <br> * 非同期通信 *: UARTは非同期通信方式を採用しているため、送信側と受信側のクロックが完全に同期していない。 *: ノイズの影響でデータのタイミングがずれると、通信エラーが発生する可能性がある。 *: <br> * 信号レベル *: UARTは、一般的にTTLレベル (0[V]~5[V]) や CMOSレベル (0[V]~3.3[V]) の信号レベルを使用する。 *: これらの信号レベルは、ノイズの影響を受けやすく、信号の品質が低下する可能性がある。 <br> ただし、UARTのノイズ耐性を向上させるためのいくつかの手法がある。<br> * シールドケーブルの使用 *: 通信線をシールドケーブルで保護することにより、外部ノイズの影響を軽減することができる。 *: <br> * 適切な信号レベルの選択 *: 通信距離や環境に応じて、適切な信号レベル (RS-232、RS-422、RS-485等) を選択することにより、ノイズの影響を軽減できる。 *: <br> * パリティビットの使用 *: パリティビットを使用することにより、通信エラーを検出して、データの整合性を確認できる。 *: <br> * フィルタの使用 *: ハードウェアまたはソフトウェアのフィルタを使用して、高周波ノイズを除去することができる。 <br> これらの手法を適切に組み合わせることにより、UARTのノイズ耐性を向上させることができる。<br> ただし、極端に高いノイズ環境下では、より高いノイズ耐性を持つ通信方式 (I2C、SPI、CAN等) の使用を検討する必要がある。<br> <br><br> == MSP430F149のUSARTモジュール == MSP430F149には、2つのUSART (Universal Synchronous/Asynchronous Receiver/Transmitter) モジュールが搭載されている。<br> <br> * USART0 *: 1つ目のUSARTモジュールである。 *: 送信ピン: P3.4 (UTXD0) *: 受信ピン: P3.5 (URXD0) *: <br> * USART1 *: 2つ目のUSARTモジュールである。 *: 送信ピン: P3.6 (UTXD1) *: 受信ピン: P3.7 (URXD1) <br> 各USARTモジュールは、UART(非同期)モード または SPI(同期)モードで動作させることができる。<br> UARTモードでは、シリアル通信を行うために必要な送信、受信、ボーレート設定、データフォーマット設定等の機能が提供される。<br> <br> ==== 主要なレジスタ ==== USARTモジュールは、以下の主要なレジスタで制御される。<br> <br> * 制御レジスタ *: U0CTL (USART0制御レジスタ) *: U1CTL (USART1制御レジスタ) *: USARTの動作モード、データ長、パリティ、ストップビット等を設定する。 *: <br> * 送信制御レジスタ *: U0TCTL (USART0送信制御レジスタ) *: U1TCTL (USART1送信制御レジスタ) *: クロックソース、送信許可等を設定する。 *: <br> * 受信制御レジスタ *: U0RCTL (USART0受信制御レジスタ) *: U1RCTL (USART1受信制御レジスタ) *: 受信エラーフラグ等を確認する。 *: <br> * ボーレート制御レジスタ *: U0BR0、U0BR1 (USART0ボーレートレジスタ) *: U1BR0、U1BR1 (USART1ボーレートレジスタ) *: ボーレートを設定する。 *: <br> * モジュレーション制御レジスタ *: U0MCTL (USART0モジュレーション制御レジスタ) *: U1MCTL (USART1モジュレーション制御レジスタ) *: ボーレート生成の精度を向上させるためのモジュレーションパターンを設定する。 *: <br> * 送受信バッファ *: U0TXBUF (USART0送信バッファ)、U0RXBUF (USART0受信バッファ) *: U1TXBUF (USART1送信バッファ)、U1RXBUF (USART1受信バッファ) *: 送受信するデータを格納する。 *: <br> * 割り込みフラグレジスタ *: IFG1 (USART0用: UTXIFG0、URXIFG0) *: IFG2 (USART1用: UTXIFG1、URXIFG1) *: 送信完了、受信完了の割り込みフラグを確認する。 <br><br> == UARTの設定 == UART通信の設定を行う場合、<code>U0CTL</code>レジスタ(USART0の場合)または <code>U1CTL</code>レジスタ(USART1の場合)を適切に設定する必要がある。<br> ただし、通信相手のデバイスも同じデータフォーマットを使用するように設定する必要があることに注意する。<br> <br> 以下の例では、USART0を使用した設定を示す。<br> USART1を使用する場合は、U0CTLを<u>U1CTL</u>に置き換える。<br> <br> * データ長 8ビット, パリティなし, 1ストップビット (8N1) <syntaxhighlight lang="c"> U0CTL &= ~PENA; // パリティなし U0CTL &= ~CHAR; // 8ビットデータ U0CTL &= ~SPB; // 1ストップビット </syntaxhighlight> <br> * データ長 8ビット, パリティなし, 2ストップビット (8N2) <syntaxhighlight lang="c"> U0CTL &= ~PENA; // パリティなし U0CTL &= ~CHAR; // 8ビットデータ U0CTL |= SPB; // 2ストップビット </syntaxhighlight> <br> * データ長 7ビット, パリティ付き, 1ストップビット (7E1) <syntaxhighlight lang="c"> U0CTL |= PENA; // パリティ付き U0CTL |= CHAR; // 7ビットデータ U0CTL &= ~SPB; // 1ストップビット U0CTL &= ~PEV; // 奇数パリティ(PEV=0で奇数、PEV=1で偶数) </syntaxhighlight> <br> または、偶数パリティの場合は以下のように設定する。<br> <syntaxhighlight lang="c"> U0CTL |= PENA; // パリティ付き U0CTL |= CHAR; // 7ビットデータ U0CTL &= ~SPB; // 1ストップビット U0CTL |= PEV; // 偶数パリティ </syntaxhighlight> <br><br> == サンプルコード == MSP430F149マイコンを使用して、UART通信を行うための手順を、以下に示す。<br> ターミナルソフト (PuTTY等) を使用して、設定したボーレート (以下の例では、9600[bps]) でシリアル通信を行う。<br> <br> * ハードウェアの接続: *: MSP430F149のP3.4 (UTXD0) を送信端子に接続する。 *: MSP430F149のP3.5 (URXD0) を受信端子に接続する。 <br> <syntaxhighlight lang="c"> #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) { // 通信処理を継続 } } </syntaxhighlight> <br> 上記のサンプルコードでは、USART0を使用してUART通信を行っている。<br> 主な設定手順は以下の通りである。<br> <br> # ウォッチドッグタイマを停止する。 # クロックを設定する。(この例では、FLLを使用してDCOを約2[MHz]に設定) # P3SELレジスタを設定して、P3.4とP3.5をUSART0の送受信ピンとして使用できるようにする。 # ME1レジスタでUSART0の送信と受信を有効化する。 # U0CTLレジスタでSWRSTビットを立てて、USART0をリセット状態にする。 # U0CTLレジスタでデータ長、パリティ、ストップビットを設定する。 # U0TCTLレジスタでクロックソース (SMCLK) を選択する。 # U0BR0、U0BR1レジスタでボーレートを設定する。 # U0MCTLレジスタでモジュレーションを設定する。 # SWRSTビットをクリアして、USARTをリセットから解除する。 # 必要に応じて、受信割り込みを有効化する。 <br> これにより、USART0が9600[bps]のUART通信を行えるように設定される。<br> <br><br> == ボーレートの計算 == MSP430F149のUSARTモジュールでは、ボーレートは以下に示す式で計算される。<br> <br> <math>\mbox{ ボ ー レ ー ト } = \dfrac{\mbox{BRCLK}}{\mbox{N}}</math> BRCLK : USARTのクロックソース (通常はSMCLK) の周波数 N : 分周比 <br> Nの値は、U0BR0とU0BR1レジスタ(16ビット値)で設定される。<br> <br> 例えば、SMCLK = 2[MHz]で9600[bps]のボーレートを得るには、以下のように計算する。<br> <br> # 計算例: <math>\mbox{N} = \dfrac{\mbox{BRCLK}}{\mbox{ ボ ー レ ー ト }} = \dfrac{2000000}{9600} \cong 208.33</math> <br> 整数値に丸めて、N = 208とする。<br> この時、実際のボーレートは以下のようになる。<br> <br> <math>\mbox{ 実 際 の ボ ー レ ー ト } = \dfrac{2000000}{208} = 9615 \, \mbox{[bps]}</math><br> <br> これは、設定値 9600[bps]に対して約0.16%の誤差となる。(9615 / 9600 = 1.00156...)<br> <u>一般的に、ボーレート誤差は2[%]以内であれば正常に通信できる。</u><br> <br> U0BR0とU0BR1の設定方法は以下の通りである。<br> <br> N = 208 = 0x00D0<br> U0BR0 = 0xD0 (下位8ビット)<br> U0BR1 = 0x00 (上位8ビット)<br> <br> 一般的なボーレートとクロック周波数の組み合わせを下表に示す。<br> <br> <center> {| class="wikitable" |- ! 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% |} </center> <br><br> == USART1の使用 == MSP430F149には、USART0に加えてUSART1も搭載されている。<br> USART1を使用する場合は、USART0と同様の手順で設定を行うが、レジスタ名とピン番号が異なる。<br> <br> * ピン配置 *: P3.6 (UTXD1) : 送信ピン *: P3.7 (URXD1) : 受信ピン *: <br> * レジスタ *: U1CTL : USART1制御レジスタ *: U1TCTL : USART1送信制御レジスタ *: U1RCTL : USART1受信制御レジスタ *: U1BR0、U1BR1 : USART1ボーレート制御レジスタ *: U1MCTL : USART1モジュレーション制御レジスタ *: U1TXBUF : USART1送信バッファ *: U1RXBUF : USART1受信バッファ *: <br> * 割り込みフラグ *: IFG2レジスタのUTXIFG1、URXIFG1ビット *: <br> * モジュール有効化 *: ME2レジスタのUTXE1、URXE1ビット <br> 以下の例では、USART1を使用している。<br> <syntaxhighlight lang="c"> #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) { // 通信処理を継続 } } </syntaxhighlight> <br> USART0とUSART1を同時に使用することも可能であり、これにより2つの独立したシリアル通信チャネルを持つことができる。<br> <br><br> == PCとのUART通信 == LinuxでマイコンとUART通信を行う場合は、以下の手順に従う。<br> <br> # シリアルポートの接続 #: マイコンのUART送信ピン (TX) をPCのシリアル受信ピン (RX) に接続する。 #: マイコンのUART受信ピン (RX) をPCのシリアル送信ピン (TX) に接続する。 #: マイコンとPCのグラウンド (GND) を接続する。 #: MSP430F149でUSART0を使用する場合は、P3.4 (UTXD0) と P3.5 (URXD0) を使用する。 #: <br> # シリアルポートの設定 #: ターミナルを開いて、シリアルポートを設定する。<br> #: <code>stty -F <デバイスファイルのパス> <ボーレート> <データ長> <ストップビット長> <パリティビットの有無></code> #: <br> #: 例: <code>stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb</code> #: <br> #: /dev/ttyUSB0は、使用するシリアルポートのデバイスファイル名を入力する。(環境に応じて適切なデバイスファイル名に変更すること) #: 9600は、ボーレートを表す。(マイコン側の設定と一致させる) #: cs8は、データ長を8ビットに設定する。 #: -cstopbは、ストップビットを1ビットに設定する。 #: -parenbは、パリティビットを無効にする。 #: <br> # 通信の確立 #: <code>cat</code>コマンドを使用して、シリアルポートを読み書きする。 #: シリアルポートからの入力を受信して、ターミナルに表示する。 #: <code>cat <デバイスファイルのパス></code> #: 例: <code>cat /dev/ttyUSB0</code> #: <br> #: 別のターミナルを開いて、<code>echo</code>コマンドおよび<code>cat</code>を使用して、シリアルポートに書き込む。 #: これにより、シリアルポートにテキストが送信される。 #: <code>echo "Hello, MSP430!" > <デバイスファイルのパス></code> #: <br> # 通信の確認 #: マイコン側で受信処理が正しく実装されている場合、送信したテキストがマイコンで受信される。 #: マイコン側で送信処理が正しく実装されている場合、マイコンから送信されたデータがターミナルに表示される。 <br> <u>※注意</u><br> <u>シリアルポートのデバイスファイル名 (/dev/ttyUSB0等) は、環境によって異なる場合がある。</u><br> <u><code>ls /dev/tty*</code>コマンドを実行して、利用可能なシリアルポートを確認すること。</u><br> <u>ボーレートやデータフォーマット等の設定は、マイコン側の設定と一致している必要がある。</u><br> <br> <u>一部のLinuxディストリビューションでは、シリアルポートへのアクセス権限が必要な場合があるため、適切な権限を設定すること。</u><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__ [[カテゴリ:MSP430]]
MSP430F149 - UART
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse