SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|

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 7CSRC: クロック供給元選択ビット
非同期通信モード
 設定不要
同期通信モード
 1 = マスタモード(クロックはBRGにより内部で生成)
 0 = スレーブモード(クロックは外部から供給)
bit 6TX9: パリティ付き9ビット送信モード設定ビット
 1 = パリティ付き9ビット送信モードに設定
 0 = パリティなし8ビット送信モードに設定
bit 5TXEN: 送信許可ビット(下記注参照)
 1 = 送信許可
 0 = 送信禁止
bit 4SYNC: USARTモード選択ビット
 1 = 同期通信モード
 0 = 非同期通信モード
bit 3未実装: 常に'0'が読み出される
bit 2BRGH: 高速ボーレートモード選択ビット
非同期通信モード
 1 = 高速ボーレートモード
 0 = 低速ボーレートモード
同期通信モード
 使用しない
bit 1TRMT: TSR(内部送信バッファ)状態ビット
 0 = TSRは空
 1 = TSRは使用中
bit 0TX9D: パリティビット(送信データの9ビット目を設定)
注: 同期モードではTXENはSREN/CRENに上書きされる

  図12-2 RCSTA: 受信状態/制御レジスタ(アドレス18h)

bit 7SPEN: シリアルポート設定ビット
(TRISB<2:1>を設定する時は、RB1/RX/DTピンとRB2/TX/CKピンをシリアルポートとして設定する)
 1 = シリアルポートは有効
 0 = シリアルポートは無効
bit 6RX9: パリティ付き9ビット受信モード設定ビット
 1 = パリティ付き9ビット受信モードに設定
 0 = パリティなし8ビット受信モードに設定
bit 5SREN: 1バイト受信モード設定ビット
非同期通信モード:
 設定不要
マスタ同期通信モード:
 1 = 1バイト受信モードを有効
 0 = 1バイト受信モードを無効
 このビットは受信完了時にクリアされる。
スレーブ同期通信モード:
 使用しない
bit 4CREN: 連続受信モード設定モード
非同期通信モード:
 1 = 連続受信を有効
 0 = 連続受信を無効
同期通信モード:
 1 = CRENがクリアされるまで連続受信を有効(SRENはCRENに上書きされる)
 0 = 連続受信を無効
bit 3ADEN: アドレス検出設定ビット
非同期受信モード(RX9=1:パリティ付き9ビット受信モード):
 1 = アドレス検出を有効、RSR<8>がセットされている場合、受信バッファの割り込みとロード
が有効になる(訳注:?意味不明?)
 0 = アドレス検出を無効、全てのデータは受信され、9番目のビットはパリティビットとして使用される 非同期受信モード(RX9=0:パリティなし8ビット受信モード):
 使用しない
同期モード:
 使用しない
bit 2FERR: フレームエラービット
 1 = フレームエラー発生(RCREGレジスタを読み、次のデータを正しく受信することで更新される)
 0 = フレームエラー発生なし
bit 1OERR: オーバーランエラービット
1 = オーバーランエラー発生(CRENビットをクリアすることによりクリアされる)
0 = オーバーランエラー発生なし
bit 0RX9D: パリティビット(受信データの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

  例12-1: ボーレートの誤差の計算例

  画像の説明

  遅めのボーレートを利用する場合でも、高速ボーレートモード(BRGH=1)を利用するという手もあります。式FOSC/(16(x+1))を用いた方がボーレートの誤差を抑えられることがあるからです。

  SPBRGレジスタに新しい値を書き込むとボーレートジェネレータのタイマはリセット(またはクリア)されますので、ボーレートの変更はタイマのオーバフローを待たずに行われます。

  画像の説明

  画像の説明

  画像の説明

  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レジスタにデータを書き込むと送信が開始されます。

  画像の説明

  画像の説明

  よく考えたら、周辺機器は通常サーバなわけで、受信してから送信することが多い。つーことは受信を先に翻訳すべきであったな。ま、近々受信側も翻訳する予定である。では。