SVX日記
2004-08-25(Wed) PICのUSART機能の翻訳(送信の巻)
少々手抜きではあるが、今日はPIC16F648AのUSARTの項の送信側の翻訳を載せておく。なにぶん、まだ訳しただけで、実践してないので誤訳もあるかもしれんが、例によって翻訳品質は保障しない。体裁もいいかげんなので、受信側の翻訳が揃ったあたりで、いずれコッソリ直しておくつもりである。では、どーぞ。
12.0 汎用同期/非同期通信(USART)機能
汎用同期/非同期通信(USART)は、シリアルインタフェイスやSCIとも呼ばれており、端末装置やパソコンのような周辺機器との全二重非同期通信、もしくはA/DまたはD/A変換ICやシリアルEEPROMのような周辺機器との半二重同期通信に用いられます。
USARTは以下のモードを選択できます:
・非同期通信モード(全二重)
・マスタ同期通信モード(半二重)
・スレーブ同期通信モード(半二重)
RB2/TX/CKピン、RB1/RX/DTピンを汎用同期/非同期通信に用いる場合、SPENビット(RCSTA<7>)とTRISB<2:1>ビットを設定する必要があります。
図12-1に送信状態/制御レジスタ(TXSTA)、図12-2に受信状態/制御レジスタ(RCSTA)の詳細を示します。
図12-1 TXSTA: 送信状態/制御レジスタ(アドレス98h)
bit 7 | CSRC: クロック供給元選択ビット 非同期通信モード 設定不要 同期通信モード 1 = マスタモード(クロックはBRGにより内部で生成) 0 = スレーブモード(クロックは外部から供給) |
bit 6 | TX9: パリティ付き9ビット送信モード設定ビット 1 = パリティ付き9ビット送信モードに設定 0 = パリティなし8ビット送信モードに設定 |
bit 5 | TXEN: 送信許可ビット(下記注参照) 1 = 送信許可 0 = 送信禁止 |
bit 4 | SYNC: USARTモード選択ビット 1 = 同期通信モード 0 = 非同期通信モード |
bit 3 | 未実装: 常に'0'が読み出される |
bit 2 | BRGH: 高速ボーレートモード選択ビット 非同期通信モード 1 = 高速ボーレートモード 0 = 低速ボーレートモード 同期通信モード 使用しない |
bit 1 | TRMT: TSR(内部送信バッファ)状態ビット 0 = TSRは空 1 = TSRは使用中 |
bit 0 | TX9D: パリティビット(送信データの9ビット目を設定) |
図12-2 RCSTA: 受信状態/制御レジスタ(アドレス18h)
bit 7 | SPEN: シリアルポート設定ビット (TRISB<2:1>を設定する時は、RB1/RX/DTピンとRB2/TX/CKピンをシリアルポートとして設定する) 1 = シリアルポートは有効 0 = シリアルポートは無効 |
bit 6 | RX9: パリティ付き9ビット受信モード設定ビット 1 = パリティ付き9ビット受信モードに設定 0 = パリティなし8ビット受信モードに設定 |
bit 5 | SREN: 1バイト受信モード設定ビット 非同期通信モード: 設定不要 マスタ同期通信モード: 1 = 1バイト受信モードを有効 0 = 1バイト受信モードを無効 このビットは受信完了時にクリアされる。 スレーブ同期通信モード: 使用しない |
bit 4 | CREN: 連続受信モード設定モード 非同期通信モード: 1 = 連続受信を有効 0 = 連続受信を無効 同期通信モード: 1 = CRENがクリアされるまで連続受信を有効(SRENはCRENに上書きされる) 0 = 連続受信を無効 |
bit 3 | ADEN: アドレス検出設定ビット 非同期受信モード(RX9=1:パリティ付き9ビット受信モード): 1 = アドレス検出を有効、RSR<8>がセットされている場合、受信バッファの割り込みとロード が有効になる(訳注:?意味不明?) 0 = アドレス検出を無効、全てのデータは受信され、9番目のビットはパリティビットとして使用される 非同期受信モード(RX9=0:パリティなし8ビット受信モード): 使用しない 同期モード: 使用しない |
bit 2 | FERR: フレームエラービット 1 = フレームエラー発生(RCREGレジスタを読み、次のデータを正しく受信することで更新される) 0 = フレームエラー発生なし |
bit 1 | OERR: オーバーランエラービット 1 = オーバーランエラー発生(CRENビットをクリアすることによりクリアされる) 0 = オーバーランエラー発生なし |
bit 0 | RX9D: パリティビット(受信データの9ビット目) |
12.1 USARTボーレートジェネレーター(BRG)
BRGは8ビットのボーレートジェネレータで、非同期通信モードと同期通信モードの双方で利用されます。ボーレートの設定はSPBRGレジスタによって行いますが、非同期通信モードを用いる場合はBRGHビット(TXSTA<2>)の設定も影響します(同期通信モードでは影響しません)。表12-1に、USARTの各モード(ただし、クロックを内部で生成する場合)における、ボーレートの計算式を示します。
本式に、必要なボーレートとFOSCを与えることにより、SPBRGレジスタに設定すべき値(近似値)と、ボーレートの誤差が計算されます。
例12-1に、以下の状況における、ボーレートの誤差の計算例を示します:
FOSC = 16 MHz
Desired Baud Rate = 9600
BRGH = 0
SYNC = 0
RXピンの状態(High/Low)取得は、3回のRB1/RX/DTピンのサンプリング結果から多数決で行われます。BRGHビット(TXSTA<2>)がオフ(低ボーレートモード)の場合、サンプリングは16倍クロック(図12-1)の7,8,9番目の立ち下りタイミングで行われます。一方、BRGHビット(TXSTA<2>)がオン(高ボーレートモード)の場合、サンプリングは4倍クロック(図12-2,3を参照)の最初のクロックの立ち下り後、次の次の4倍クロックが立ち上げる前までの間に、3クロックタイミングで行われます。
12.2 USART非同期通信モード
このモードではstandard non-return-tozero(NRZ)フォーマット(スタートビット+8(9)データビット+ストップビット)によって通信が行われます。データビットは8ビットが一般的で、8ビットのボーレートジェネレータが生成するボーレート周波数に乗せ、LSb側から送受信されます。USARTの送信ポートと受信ポートは機能的に独立していますが、データフォーマットとボーレートは共通になっています。ボーレートジェネレータはBRGHビット(TXSTA<2>)の設定により、16倍または64倍クロックを生成します。パリティビットは自動的に照合されませんので、必要であればソフト側でチェックしなければなりません。なお、非同期通信モードはPICがスリープモードの間、停止します。
非同期通信モードに設定するには、SYNCビット(TXSTA<4>)をオフにします。
USART非同期通信モジュールは、以下の要素から成り立っています。
・ボーレートジェネレーター
・サンプリング回路
・送信ポート
・受信ポート
12.2.1 USART非同期通信送信ポート
USART送信ポートのブロックダイアグラムを図12-5に示します。
送信ポートの主役はシフト送信レジスタ(TSR)です。
ソフトウェア側で送信データを読み書き送信バッファ(TXREG)に設定しておくと、自動的にTXREGからTSRにデータが転送され、送信が開始されます。転送は直前の送信データのストップビットの送信直後(データが存在する場合)のタイミングに、1インストラクションサイクルで行われます。転送が完了するとTXREGレジスタは空になり、TXIFフラグ(PIR1<4>)がセットされます。事前にTXIEビット(PIE1<4>)を設定しておくと、この時点で割り込みを発生することもできます。なお、TXIFフラグは割り込み発生の有無に関わらず変化し、次のデータをTXREGレジスタに書き込むと自動的にクリアされます(ユーザが直接クリアすることはできません)。
TXIFフラグがTXREGレジスタの状態を示すのに対し、TRMTフラグ(TXSTA<1>)はTSRレジスタの状態を示します。TRMFフラグは読み出し専用で、セットしてある場合にTSRレジスタが空の状態であることを示しますが、フラグ変化により割り込みを発生することはできませんので、必要に応じてソフトウェア側で確認する必要があります。
注意1: TSRレジスタはメモリにマップされていないので、ユーザが直接操作することはできません。
2: TXIFフラグは、TXENを送信許可に設定している場合のみ有効です。
TXENビット(TXSTA<5>)をセットすることにより、データの送信が可能になりますが、正確にはTXREGレジスタにデータを書き込み、ボーレートジェネレータ(BRG)がクロックを発生する(図12-5)までは送信は行われません。逆に、先にTXREGレジスタに書き込み後、TXENビットをセットしてもよいでしょう。通常、送信開始時はTSRレジスタは空の状態なので、TXREGレジスタへの送信データを書き込んだ瞬間、送信データはTSRへ転送され、TXREGはすぐ空に戻ります。図12-7は連続送信が行われる様子です。なお、送信中にTXENビットをクリアすると、送信は中断され送信ポートはリセット、RB2/TX/CKピンはHigh状態に戻ります。
パリティ付き9ビット送信を行う場合、TX9ビット(TXSTA<6>)をセットし、パリティビットはTX9D(TXSTA<0>)に書き込んでおきますが、書き込みはTXREGレジスタに8ビットの送信データを書き込む前に済ませておく必要があります。これは、TXREGにデータを書き込んだ瞬間にTSRレジスタに転送(TSRが空の場合)される場合があるためで、この場合、不正なパリティビットがTSRレジスタに転送されてしまうからです。
非同期通信モードに設定する場合は、以下の順序で行います。
1. RB2/TX/CKピンとRB1/RX/DTピンを同期/非同期通信用の送受信ピンとして設定するため、TRISB<1>ビットをセット、TRISB<2>ビットをクリアします。
2. 望むボーレートが得られるようにSPBRGレジスタを設定します。高速ボーレートモードを利用する場合は、BRGHビットもセットします(12.1節 USARTボーレートジェネレータ(BRG)参照)。
3. SYNCビットをクリアし、SPENビットをセットすることで、非同期通信モードに設定します。
4. 割り込みを利用する場合は、TXIEビットをセットします。
5. パリティ付き9ビット送信を利用する場合、TX9ビットをセットします。
6. TXENビットをセットし(TXIFもセットされる)ことにより送信許可の状態にします。
7. パリティ付きの9ビット送信を利用する場合、パリティビットをTX9Dに書き込みます。
8. TXREGレジスタにデータを書き込むと送信が開始されます。