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_PR7DataRdyUARTx() 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したあと初期メッセージを出力
次に受信待ちとなって、受信した文字を判定してそれぞれの処理を実行
しています。
実際に上記プログラムを動作させたときのハイパーターミナルの表示内容
は下図のようになります。