先日、H8マイコンにPIC18F14K50から書き込みが出来なかったのでUSBシリアル変換ケーブルを借りてきて書き込みましたという記事を書きました。
このケーブル、業務に使用しているものなので返さなければいけないのと、やっていることは同じ筈なのに何故出来ないんだという疑問と、繋ぐ対象によってボーレートを書き換えていたのですが、「Automatic detection and calibration of the baud rate」という文字があるのが気になるのとでちょっと真剣にデータシートを見てみます。
参照するデータシートは、秋月通商のPIC18F14K50のページからダウンロード出来る「pic18f13k50_14k50.pdf」の16章(P177-P202)です。
日本語版はこちら
UART(汎用非同期送受信回路)は、調歩同期方式(非同期)によるシリアル信号をパラレル信号に変換したり、その逆方向の変換を行うための集積回路。RS-232C規格に準拠する信号レベルに変換するICと組み合わせて、外部機器とのインターフェースとして利用されるのが一般的。
これに、同期方式のシリアル信号を変換するための回路を追加したものがUSART。(Wikipedia)
UARTの動作はこちらのページが分かり易いです。エレラボドットコム
同期方式のシリアル通信は、比較的簡単な周辺デバイスとのデータ通信用として設計されているので、伝送制御手順を含むようなハイレベルの同期式通信に使うには無理がある。 USARTにブレーク信号の送受信とボーレートの自動検出が可能となったものがEUSART。 |
EUSARTモジュールの動作を制御するレジスタ
・TXSTA(送信状態/制御)レジスタ
・RCSTA(受信状態/制御)レジスタ
・BAUDCTL(baudレート制御)レジスタ
EUSARTの動作モードにかかわらず、RX/DTおよびTX/CKピンに対応するTRIS制御ビットは「1」にセットする。
EUSARTの制御により、ピン設定は必要に応じて入力から出力に自動的に変更される。
EUSART非同期モード
ボーレートの構成例
EUSART非同期トランスミッタ
TSRにはソフトウェアから直接はアクセスできず、送信バッファ(TXREGレジスタ)からデータを取得する。
EUSARTトランスミッタを非同期モードとして有効化するには3つの制御ビットを以下のように設定する。
・TXEN=1 EUSARTのトランスミッタ回路が有効になる
・SYNC=0 EUSARTが非同期モードになる
・SPEN=1 EUSARTが有効になり、TX/CK I/Oピンが自動的に出力に設定される。
TX/CKピンをアナログ周辺モジュールと共有している場合、対応するANSELビットをクリアしてアナログI/O機能を無効にする必要がある。
SPENビットをセットすると、対応するTRISビットの状態やEUSARTレシーバが有効か無効かにかかわらず、RX/DT I/Oピンは自動的に入力として設定される。RX/DTピンのデータは通常のPORT読み出しで読み出せるが、PORTラッチのデータ出力は禁止される。TXENイネーブルビットをセットすると、TXIFトランスミッタ割り込みフラグがセットされる。
データの送信
TXREGレジスタにデータを書き込むと送信が開始する。
これが最初の文字の場合、またはTSR内に以前の文字が全く残っていない場合、TXREGのデータがただちにTSRレジスタに転送される。
TSR内に以前の文字が一部でも残っている場合、その文字のストップビットが送信されるまで新しい文字データはTXREGに保持される。
TXREG内に残っている文字は、ストップビット送信直後の1Tcyの期間にTSRに転送される。
TXREGからTSRにデータが転送されると、その直後にスタートビット、データビット、ストップビットのシーケンス送信が開始する。
送信データの極性
送信データの極性は、BAUDCONレジスタのCKTXPビットで制御できる。
このビットが既定値「0」の場合、送信アイドル/データビットは正論理。
「1」にセットすると送信データが反転し、送信アイドル/データビットは負論理になる。
CKTXPビットで送信データの極性を制御できるのは、非同期モードの場合のみ。
同期モードでは、CKTXPビットの機能は異なる。
送信割り込みフラグ
EUSARTトランスミッタが有効で、かつ送信する文字がTXREGに格納されていない場合は常に、PIR1レジスタのTXIF割り込みフラグビットがセットされる。
つまり、TXIFビットがクリアされるのは、TSRに何らかの文字がある時に新しい送信文字がTXREGに格納された場合のみ。
TXIFフラグビットは、TXREGへの書き込みの直後にはクリアされない。
TXIFは、書き込みを実行してから2つ目の命令サイクルで有効になる。
TXREGへの書き込み直後にTXIFをポーリングすると、正しい結果が得られない。
TXIFビットは読み出し専用で、ソフトウェアでセットまたはクリアすることはできない。
PIE1レジスタのTXIE割り込みイネーブルビットをセットするとTXIF割り込みが許可される。
ただし、TXREGが空になるとTXIEイネーブルビットの状態に関係なくTXIFフラグビットがセットされる。
データの送信時に割り込みを使用するには、引き続きデータを送信する場合のみTXIEビットをセットする。
送信する最後のデータをTXREGに書き込んだら、TXIE割り込みイネーブルビットをクリアする。
TSRのステータス
TXSTAレジスタのTRMTビットがTSRレジスタの状態を示す。
このビットは読み出し専用。
TRMTビットは、TSRレジスタが空になるとセットされ、TXREGからTSRレジスタに文字が転送されるとクリアされる。
TRMTビットは、TSRレジスタから全てのビットがシフト出力されるまでクリアされたまま。
このビットには割り込みロジックが接続されていないため、TSRの状態を調べるにはユーザが明示的にこのビットをポーリングするひつようがある。
TSRレジスタはデータメモリにマッピングされていないため、ユーザからはアクセスできない。
9ビット文字の送信 省略
非同期送信の実行手順
1.目標のボーレートに合わせて、SPBRGH:SPBRGレジスタペア、BRGHビット、BRG16ビットを初期化する(「EUSART baud レート ジェネレータ(BRG)」参照。
2.SYNCビットをクリアし、SPENビットをセットして非同期シリアルポートを有効にする。
3.9ビット送信を行う場合、TX9制御ビットをセットする。レシーバ側でアドレス検出を有効に設定している場合、9ビット目をセットすると下位8ビットはアドレスと見なされる。
4.送信データの極性を反転する場合、CKTXP制御ビットをセットする。
5.TXEN制御ビットをセットして、送信を有効にする。これにより、TXIF割り込みビットがセットされる。
6.割り込みを使用する場合、TXIE割り込みイネーブルビットをセットする。INTCONレジスタのGIEおよびPEIEビットもセットされていれば、割り込みがただちに発生する。
7.9ビット送信を選択した場合、9ビット目をTX9Dデータビットに格納する。
8.TXREGレジスタに8ビットのデータを書き込むと、送信が開始する。
EUSART非同期レシーバ
RX/DTピンで受信したデータでデータ復元ブロックを駆動する。
データ復元ブロックの実体は、ボーレートの16倍の速度で動作する高速シフタ。
一方、シリアル受信シフトレジスタ(RSR)はビットレートで動作する。
文字を構成する8ビットまたは9ビット全てがシフト入力されたら、ただちに2文字のFIFOメモリに転送される。
このFIFOがバッファの役割を果たすため、2文字までは完全に受信が可能で、3文字目の受信が完了するまでにソフトウェアでEUSARTレシーバへのサービスを開始すれば良い。
FIFOとRSRレジスタは、ソフトウェアから直接アクセスできない。
受信データへのアクセスには、RCREGレジスタを使用する。
レシーバの有効化
EUSARTレシーバを非同期モードとして有効化するには、3つの制御ビットを以下のように設定する。
・CREN=1 EUSARTのレシーバ回路が有効になる。
・SYNC=0 EUSARTが非同期モードになる
・SPEN=1 EUSARTが有効になる。
RX/DT I/Oピンは、対応するTRIS制御ビットをセットして入力として設定しておく。
RX/DTピンをアナログ周辺モジュールと共用している場合、対応するANSELビットをクリアしてアナログI/O機能を無効にする。
SPENビットをセットすると、対応するTRISビットの状態やEUSARTトランシーバが有効か無効かにかかわらず、TX/CK I/Oピンは自動的に出力として設定される。
PORTラッチは出力ドライバから切断されるため、TX/CKピンを汎用出力として使用することはできない。
データの受信
レシーバのデータ復元回路は、最初のビットの立ち下がりエッジで文字の受信を開始する。
最初のビット(ステータスビット)は常に「0」。
データ復元回路はスタートビットの中央まで1/2ビットの期間をカウントし、そのビットがまだ「0」かどうかをチェックする。
「0」でない場合、データ復元回路はエラーを生成せずに文字の受信を中止し、スタートビットの立ち下がりエッジの検出を再開する。
スタートビット「0」のチェックに成功した場合、データ復元回路は次のビットの中央までさらに1ビットの期間をカウントする。
次にこのビットを多数決回路でサンプリングし、その結果(「0」または「1」)をRSRにシフトする。
以後、この動作を繰り返して全てのデータビットをサンプリングしRSRにシフトする。
最後の1ビットの期間を計測して、そのレベルをサンプリングする。
これはストップビットで常に「1」。
ストップビットの位置でデータ復元回路が「0」をサンプリングした場合、この文字に対するフレーミングエラーがセットされる。
それ以外の場合、この文字のフレーミングエラーはクリアされる。
フレーミングエラーの詳細は「受信フレーミングエラー」参照
全てのデータビットとストップビットを受信したら、その直後にRSR内の文字をEUSART受信FIFOに転送し、PIR1レジスタのRCIF割り込みフラグビットをセットする。
RCREGレジスタを読み出すと、FIFOから先頭の文字が出力される。
受信FIFOがオーバーランした場合、オーバーラン条件が解消されるまで、それ以降の文字は受信されない。
オーバーランエラーの詳細は「受信オーバーランエラー」参照
受信データの極性
受信データの極性は、BAUDCONレジスタのDTRXPビットで制御できる。
このビットが既定値「0」の場合、受信アイドル/データビットは正論理になる。
DTRXPビットを「1」にセットすると受信データが反転し、受信アイドル/データビットは負論理になる。
DTRXPビットで受信データの極性を制御できるのは、非同期モードの場合のみ。
同期モードでは、DTRXPビットの機能は異なる。
受信割り込み
EUSARTレシーバが有効で、受信FIFO内に読み出していない文字がある場合は常に、PIR1レジスタのRCIF割り込みフラグビットがセットされる。
RCIF割り込みフラグビットは読み出し専用。
RCIF割り込みを許可するには、以下のビットをセットする。
・PIE1レジスタのRCIE割り込みイネーブルビット
・INTCONレジスタのPEIE周辺割り込みイネーブルビット
・INTCONレジスタのGIEグローバル割り込みイネーブルビット
FIFO内に読み出していない文字が残っている場合、これら割り込みイネーブルビットの状態に関係なくRCIF割り込みフラグビットがセットされる。
受信フレーミングエラー 省略
受信オーバーランエラー 省略
9ビット文字の受信 省略
EUSARTは9ビット文字の受信をサポートする。
RCSTAレジスタのRX9ビットをセットすると、EUSARTは1文字の受信につき9ビットをRSRにシフト入力する。
RCSTAレジスタのRX9Dビットには、受信FIFOの先頭にある、読み出されていない文字の9ビット目(最上位データビット)を格納する。
受信FIFOバッファから9ビットデータを読み出す場合、RCREGの下位8ビットより前にRX9Dデータを読み出す。
アドレス検出 省略
非同期受信の実行手順
1.目標のボーレートに合わせて、SPBRGH:SPBRGレジスタペア、BRGHビット、BRG16ビットを初期化する(「EUSART baud レート ジェネレータ(BRG)」参照
2.SPENビットおよびRX/DTピンのTRISビットをセットして、シリアルポートを有効にする。非同期モードの場合、SYNCビットをクリアする。
3.割り込みを使用する場合、RCIE割り込みイネーブルビットをセットし、INTCONレジスタのGIEおよびPEIEビットもセットする。
4.9ビット受信を行う場合、RX9ビットをセットする。
5.受信データの極性を反転する場合、DTRXPビットをセットする。
6.CRENビットをセットして、受信を有効にする。
7.RSRから受信バッファの文字が転送されると、RCIF割り込みフラグビットがセットされる。RCIE割り込みイネーブルビットもセットしている場合、割り込みが発生する。
8.RCSTAレジスタを読み出してエラーフラグを取得する。9ビットデータ受信を有効にしている場合、9ビット目のデータビットも読み出す。
9.RCREGレジスタを読み出し、受信バッファから受信済みデータの下位8ビットを取得する。
10.オーバーランが発生した場合、CRENレシーバイネーブルビットをクリアしてOERRフラグをクリアする。
9ビットアドレス検出モードの実行手順 省略
非同期モードのクロック精度 省略
EUSART baud レート ジェネレータ(BRG)
非同期および同期モードをサポートするための専用の8ビットまたは16ビットタイマ。
既定値では、BRGは8ビットモードで動作する。BAUDCONレジスタのBRG16ビットをセットすると、16ビットモードを選択できる。
baudレートタイマはフリーラン動作で、その周期はSPBRGH:SPBRGレジスタペアで決定する。
非同期モードでは、TXSTAレジスタのBRGHビットとBAUDCONレジスタのBRG16ビットによってbaudレート周期の乗数が決まる。
同期モードではBRGHビットは無視される。
自動baudレート検出
自動baudレート検出(ABD)モードでは、BRGへのクロックが逆方向になる。
BRGが入力RX信号にクロックを供給するのではなく、RX信号がBRGのタイミングを生成する。
baudレートジェネレータを使用して、LINバスの同期文字である55h(ASCII「U」)の周期を測定する。
この文字は、ストップビットのエッジを含め5つの立ち上がりエッジがあるのが特徴。
BAUDCONレジスタのABDENビットをセットすると、自動baudレート校正シーケンスが開始する。
ABDシーケンスの実行中、EUSARTステートマシンはアイドルのまま保持される。
スタートビット直後の受信ラインの最初の立ち上がりエッジで、SPBRGがBRGカウンタクロックを使用してカウントを開始する。
5つ目の立ち上がりエッジは、8番目のビット周期の最後にRXピンで発生する。この時点で、SPBRGH:SPBRGレジスタペア内には正しいBRG周期を累計した値が格納されており、ABDENビットは自動的にクリアされ、RCIF割り込みフラグがセットされる。
RCIF割り込みフラグをクリアするには、RCREGに対して読み出しを実行する必要がある。RCREGの内容は破棄する。
SPBRGHレジスタを使用しないモードで校正を行う場合、SPBRGHレジスタの00hをユーザがチェックすれは、SPBRGレジスタがオーバーフローしていないことを確認できる。
BRGの自動baudレートクロックは、BRG16ビットとBRGHビットによって決まる。
ABDモードでは、SPBRGHおよびSPBRGレジスタはBRG16ビットの設定に関係なく16ビットカウンタとして使用する。
baudレート周期の校正時、SPBRGHおよびSOBRGレジスタはBRGベースクロックレートの1/8のクロックで動作する。
こうして得られたバイトの計算値は、最高クロック時の平均ビット時間に等しくなる。
ABDENビットとWUEビットを両方セットした場合、自動baudレート検出はブレーク文字直後のバイトで実行される。
(「ブレークによる自動ウェイクアップ」参照)
入力文字のbaudレートが選択したBRGクロック源のレンジ内となるように、ユーザの責任で設定する。オシレータ周波数とEUSARTのbaudレートの組み合わせによっては、使用できないものもある。
自動baudレートプロセスでは、自動baudレートカウンタが1からカウントを開始する。精度を重視する場合、自動baudレートシーケンスの完了時にSPBRGH:SPBRGレジスタペアから1を引く。
自動baudレートのオーバーフロー
自動baudレート検出時、RXピンで5つ目の立ち上がりエッジを検出する前にbaudレートカウンタがオーバーフローすると、BAUDCONレジスタのABDOVFビットセットされる。
ABDOVFビットは、カウンタの値がSPBRGH:SPBRGレジスタペアの16ビットに格納できる最大カウントを超えたことを示す。
ABDOVFがセットされた後も、カウンタはRXピンで5つ目の立ち上がりエッジを検出するまでカウントを継続する。
RXピンで5つ目の立ち上がりエッジを検出すると、ハードウェアがRCIF割り込みフラグをセットし、BAUDCONレジスタのABDENビットをクリアする。
その後、RCREGレジスタを読み出すとRCIFフラグをクリアできる。
BAUDCONレジスタのABDOVFフラグは、ソフトウェアで直接クリアできる。
RCIFフラグがセットされる前に自動baudレート検出を終了するには、ABDENビットをクリアしてからBAUDCONレジスタのABDOVFビットをクリアする。
ABDOVFビットを先にクリアしないと、ABDOVFビットはセットされたままとなる。
ブレークによる自動ウェイクアップ 省略
ブレーク文字のシーケンス 省略
以上データシートの抜粋でした。
参考にされる場合は必ずサイトから最新版を入手して最新版のデータシートを参考にして下さい。
(。・ω・)ノ゙