UARTモジュールの使い方


 dsPIC30Fシリーズ内蔵のUARTモジュールの使い方について説明しています。

【内部構成】

dsPIC内蔵のUARTモジュールの内部構成は下図のようになっています。




この構成は、これまでのUSARTと異なり、同期式の機能が省かれ、単純な全二重の
非同期式通信機能だけになっています。
その代わり、パリティビットの自動生成とチェック機能、ストップビットのビット数の設定
機能などが追加されています。

さらにLINプロトコルに対応させるため、ブレークによる送信停止機能と、自動ボーレート
検出のため、受信信号が直接入力キャプチャモジュールにも接続されています。

テスト用に、ループバック機能も追加されていて、折り返しのテストが可能になっています。

さらにアドレス検出機能もあって、複数デバイス接続の場合に、アドレス指定で送受信
することができるようになっています。


【関連SFR】

UARTモジュールを使うために設定が必要なSFRは下記となっています。
非同期式モードだけなので、すっきりした設定内容になっています。




送受信データに関するSFRは下記となります。9ビットモードのときだけ上位バイトが
関連します。




割り込み制御用のレジスタは下記となりますが、送信と受信全く独立のものと
なっています。





【C言語での使い方】

C30コンパイラのPeripheral Librariesで用意されているタイマ1の組み込み関数は
下表のようになっています。
下記関数を使うためには、「uart.h」をインクルードする必要があります。
またプロジェクトにデバイス用のライブラリファイル、例えば「libp30f4012.a」という
ライブラリファイルをLIBに追加する必要があります。
デバイスによりUARTが2組内蔵されているmのがあります。下表でxの部分は1か2と
なります。1組だけのものは1となります。

関数名 書  式 機  能
OpenUARTx() void OpenUARTx(
   unsigned int config1,
   unsigned int config2,
   unsigned int ubrg);
UARTモジュールの動作モードの設定
config1にはUxMODEレジスタ用の下記パラメータを指定する
(1)モジュールの動作
  UART_EN
  UART_DIS
(2)Idle Mode時の動作
  UART_IDLE_CON
  UART_IDLE_STOP
(3)使用ピン指定
  UART_ALTRX_ALTTX
  UART_RX_TX
(4)STARTでウェイクアップ動作
  UART_EN_WAKE
  UART_DIS_WAKE
(5)ループバック動作
  UART_EN_LOOPBACK
  UART_DIS_LOOPBACK
(6)Input Captureへの入力
  UART_EN_ABAUD
  UART_DIS_ABAUD
(7)パリティとデータ長指定
  UART_NO_PAR_9BIT
  UART_ODD_PAR_8BIT
  UART_EVEN_PAR_8BIT
  UART_NO_PAR_8BIT
(8)ストップビット長
  UART_2STOPBITS
  UART_1STOPBIT

config2にはUxSTAレジスタ用の下記パラメータを指定する
(1)送信割り込みタイミング指定
  UART_INT_TX_BUF_EMPTY
  UART_INT_TX
(2)ブレーク指定
  UART_TX_PIN_NORMAL
  UART_TX_PIN_LOW
(3)送信使用
  UART_TX_ENABLE
  UART_TX_DISABLE
(4)受信割り込みタイミング指定
  UART_INT_RX_BUF_FUL
  UART_INT_RX_3_4_FUL
  UART_INT_RX_CHAR
(5)アドレス一致機能
  UART_ADR_DETECT_EN
  UART_ADR_DETECT_DIS
(6)オーバーランエラービットクリア
  UART_RX_OVERRUN_CLEAR

ubrgには下記値を設定

 ubrg = (Fcy÷(16×BAUD))−1
CloseUARTx() void CloseUARTx(void); UARTモジュールをオフとする
ConfigIntUARTx() void ConfigIntUARTx(
   unsigned int config);
UARTの割り込みの設定をする
configには下記パラメータを設定
(1)受信割り込み許可禁止
  UART_RX_INT_EN
  UART_RX_INT_DIS
(2)受信割り込みレベル
  UART_RX_INT_PR0
  UART_RX_INT_PR1
   ----
  UART_RX_INT_PR7
(3)送信割り込み許可禁止
  UART_TX_INT_EN
  UART_TX_INT_DIS
(4)送信割り込みレベル
  UART_TX_INT_PR0
  UART_TX_INT_PR1
   ----
  UART_TX_INT_PR7
DataRdyUARTx() char DataRdyUARTx(void); 受信バッファの状態を返す
 1:データあり  0:空
ReadUARTx()
getcUARTx()
unsigned int ReadUARTx(void);
unsigned int getcUARTx(void);
受信バッファのデータを読み出す
WriteUARTx()
putcUARTx()
void WriteUARTx(
   unsigend int data);
void putcUARTx(
   unsigned int data);
送信バッファにデータ(data)を書き込む
自動的に送信開始
getsUARTx() unsigned int getsUARTx(
   unsigned int length,
   unsigend int *buffer,
   unsigned int data_wait);
指定したバッファに指定文字数だけ文字列を受信して格納する
length:受信文字数
buffer:格納バッファのポインタ
data_wait:受信待ちタイムアウト値N
      (19×N−1命令サイクル)
putsUARTx() void putsUARTx(
   unsigend int *buffer);
文字列を送信する
buffer:送信文字列のポインタ
   終了はNULL文字



【使用例】

実際にUARTモジュールを使った例題です。
下記では最初にCommand=とメッセージを出力したあと入力受信待ちとなり、1文字データを
受信する都度AかBかを判定し、Aであれば80文字のASCII文字を、Bであればアルファベット
を送り返します。

まず最初はUART初期設定用のパラメータ定義と、出力メッセージデータの定義
を行う宣言部です。また復帰改行だけを出力する関数も独立に用意しました。




次がメイン関数部分で、UARTをsOpenしたあと初期メッセージを出力
次に受信待ちとなって、受信した文字を判定してそれぞれの処理を実行
しています。




実際に上記プログラムを動作させたときのハイパーターミナルの表示内容
は下図のようになります。








    目次ページへ