• 検索結果がありません。

データ受信 - USART受信部

ドキュメント内 mega88.pdf (ページ 132-135)

PIND 6 PIND 5 PIND 4 PIND 3 PIND 2 PIND 1

24. USART (Universal Synchronous Asynchronous Receiver Transceiver)

24.8. データ受信 - USART受信部

USART受信部はUSART制御/状態レジスタB(UCSRnB)で受信許可(RXEN)ビットに1を書くことにって許可されます。受信部が許可され ると、RXDnピンの標準ピン動作はUSARTによって無視され、受信部の直列入力としての機能を与えられます。何か直列受信が行われ 得る前に一度はボーレート、フレーム形式、動作種別が設定されなければなりません。同期動作が使用される場合、XCKnピンのクロックは転 送クロックとして使用されます。

24.8.1. 5~8ビット データ フレーム受信

受信部は有効な開始ビットを検出する時にデータ受信を開始します。開始ビットに続く各ビットはボーレートまたはXCKnクロックで採取され、フ レームの最初の停止ビットが受信されるまで受信シフト レジスタ内へシフトされます。第2停止ビットは受信部によって無視されます。最初の停 止ビットが受信されると(換言すると、受信シフト レジスタに完全なフレームが存在すると)、このシフト レジスタの内容は受信緩衝部内へ移され ます。受信緩衝部はUSARTデータ レジスタ(UDRn)I/O位置を読むことによって読めます。8ビット未満のフレームを使用するとき、UDRnから 読むデータの上位ビットは0で覆われます。

次のコード例はUSART制御/状態レジスタA(UCSRnA)の受信完了(RXC)フラグのポーリングを基準とした簡単なUSART受信関数を示しま す。この関数が使用され得る前にUSARTが初期化されなければなりません。

アセンブリ言語プログラム例

USART_Rx: SBIS UCSRnA,RXC ;受信完了でスキップ

RJMP USART_Rx ;受信完了待機

;

IN R16,UDRn ;受信データ取得

RET ;呼び出し元へ復帰

C言語プログラム例

unsigned char USART_Receive(void) {

while ( !(UCSRnA & (1<<RXC)) ); /* 受信完了待機 */

return UDRn; /* 受信データ取得 */

}

この関数は緩衝部を読んで値を戻す前に、RXCフラグの検査によって受信緩衝部にデータが存在するのを単純に待ちます。

24.8.2. 9ビット データ フレーム受信

9ビット データが使用される場合(UCSZ2~0=111)、USARTデータ レジスタ(UDRn)から下位バイトを読むのに先立って第9ビットがUSART制御 /状態レジスタB(UCSRnB)の受信データ ビット8(RXB8)ビットから読まれなければなりません。この規則はフレーミング異常(FE)、オーバーラン発 生(DOR)、パリティ誤り(UPE)状態フラグにも適用されます。USART制御/状態レジスタA(UCSRnA)から状態情報を読み、その後にUDRn からデータを読んでください。UDRn I/O位置を読むことが受信FIFO緩衝部の状態を切り替え、その結果、FIFO内に保管される RXB8,FE,DOR,UPEビット全てが切り替わります。

次のコード例は9ビット データと状態ビット両方を扱う簡単なUSART受信関数を示します。

アセンブリ言語プログラム例

USART_Rx: SBIS UCSRnA,RXC ;受信完了でスキップ

RJMP USART_Rx ;受信完了待機

;

IN R18,UCSRnA ;状態フラグ取得

IN R17,UCSRnB ;受信第9ビット取得

IN R16,UDRn ;受信データ取得

ANDI R18,(1<<FE)|(1<<DOR)|(1<<UPE) ;受信異常検査

BREQ USART_Rx_V ;異常なしで分岐

;

LDI R17,-1 ;異常で-1値設定

LDI R16,-1 ;

USART_Rx_V: LSR R17 ;RXB8ビットをビット0位置へ移動

ANDI R17,$01 ;RXB8ビットのみ有効

RET ;呼び出し元へ復帰

C言語プログラム例

unsigned int USART_Receive(void) {

unsigned char status, resh, resl; /* 一時変数定義 */

while ( !(UCSRnA & (1<<RXC)) ); /* 受信完了待機 */

status = UCSRnA; /* 状態フラグ取得 */

resh = UCSRnB; /* 受信第9ビット取得 */

resl = UDRn; /* 受信データ取得 */

if ( status & ((1<<FE)|(1<<DOR)|(1<<UPE)) ) return -1; /* 受信異常で-1値設定/復帰 */

resh = (resh>>1) & 0x01; /* RXB8ビットのみ有効最下位へ */

return ((resh<<8) | resl); /* 結果9ビット データ取得/復帰 */

}

この受信関数例は何か評価を行う前に、全てのI/Oレジスタをレジスタ ファイルに読みます。これは読まれた緩衝部位置が可能な限り早く 新規データを自由に受け入れできるため、最適な受信緩衝部利用になります。

関連リンク 14頁の「コード例について」

24.8.3. 受信完了フラグと割り込み

USART受信部には受信部の状態を示す1つのフラグがあります。

USART受信完了(RXC)フラグは未読データが受信緩衝部に存在するかを示します。このフラグは受信緩衝部に未読データが存在する時 に1で、受信緩衝部が空の(換言すると、何も未読データを含まない)時に0です。受信部が禁止される場合(RXEN=0)、受信緩衝部が破 棄され、その結果としてRXCフラグは0になります。

USART制御/状態レジスタB(UCSRnB)でUSART受信完了割り込み許可(RXCIE)ビットが設定(1)されると、(全割り込みが許可されていれ ば)RXCフラグが設定(1)されている限り、USART受信完了割り込みが実行されます。割り込み駆動データ受信が使用されるとき、受信完 了割り込みルーチンはRXCフラグを解除(0)するためにUSARTデータ レジスタ(UDRn)から受信したデータを読まなければならず、さもなけれ ば一旦割り込みルーチンを終了しても新しい割り込みが(継続的に)起きます。

24.8.4. 受信異常フラグ

USART受信にはフレーミング異常(FE)、データ オーバーラン発生(DOR)、パリティ誤り(UPE)の3つの異常フラグがあります。これら全てはUSART 制御/状態レジスタA(UCSRnA)を読むことでアクセスできます。異常フラグに対する共通点は異常状態を示しているフレームと共に受信緩衝 部に配置されることです。異常フラグが緩衝されるため、USARTデータ レジスタ(UDRn)I/O位置を読むことが緩衝部読み出し位置を切り 替えるので、UCSRnAは受信緩衝部(UDRn)の前に読まれなければなりません。異常フラグに対するその他の共通点はソフトウェアがこの フラグ位置へ書き込みを行うことによって変更できないことです。しかし、将来のUSART(機能)実装の上位互換性のため、UCSRnAが 書かれるとき、全てのフラグは0に設定されなければなりません。異常フラグはどれも割り込みを生成できません。

フレーミング異常(FE)フラグは受信緩衝部に格納された、次に読み込み可能なフレームの第1停止ビットの状態を示します。FEフラグは停止 ビットが正しく(Highとして)読まれた時に0で、停止ビットが不正(Low)だった時にFEフラグは1です。このビットは同期外れ状態の検出、中 断状態検出、規約での操作に使用できます。受信部が最初(第1)以外の全停止ビットを無視するため、FEフラグはUSART制御/状態レ ジスタC(UCSRnC)の停止ビット選択(USBS)ビット設定によって影響を及ぼされません。将来のデバイスとの共通性のため、UCSRnAに書く とき、常にこのビットを0に設定してください。

データ オーバーラン発生(DOR)フラグは受信緩衝部が一杯状態のためのデータ消失を示します。データ オーバーランは受信緩衝部(2フレーム)が 一杯で、(次の)新規フレーム データが受信シフト レジスタで待っており、(更に次の)新規開始ビットが検出される時に起きます。DORフラグが 設定(1)なら、最後にUDRnから読んだフレームと次にUDRnから読むフレーム間で1つ以上の直列フレームが失われます。将来のデバイスとの 共通性のため、UCSRnAに書く時は常にこのビットに0を書いてください。DORフラグは受信されたデータがシフト レジスタから受信緩衝部へ 正常に移動された時に解除(0)されます。

パリティ誤り(UPE)フラグは受信緩衝部内の次のフレームで受信時にパリティ異常があったことを示します。パリティ検査が許可されていない場 合、UPEフラグは常に0が読めます。将来のデバイスとの共通性のため、UCSRnAに書くとき、常にこのビットを0に設定してください。より 多くの詳細については「パリティ ビットの計算」と下の「パリティ検査器」をご覧ください。

24.8.5. パリティ検査器

パリティ検査器はUSART制御/状態レジスタC(UCSRnC)のパリティ種別上位ビット(UPM1)が1を書かれる時に活性(有効)です。実行される べきパリティ検査の形式(偶数または奇数)はUCSRnC.UPM0ビットによって選択されます。許可されると、パリティ検査器は到着フレーム内の データ ビットのパリティを計算し、その結果と(受信)直列フレーム内のパリティ ビットを比較します。検査の結果は受信データ、停止ビットと共に受 信緩衝部に格納されます。その後USART制御/状態レジスタA(UCSRnA)のパリティ誤り(UPE)フラグはフレームにパリティ異常があるかを検査 するため、ソフトウェアによって読むことができます。

UPEフラグは受信緩衝部から読まれ得る次フレームで受信時にパリティ異常があり、その時点でパリティ検査が許可されていた(UPM1=1)場 合に設定(1)されます。このビットはUSARTデータ レジスタ(UDRn)が読まれるまで有効です。

24.8.6. 受信の禁止

送信部と対照的に受信部の禁止は即時です。従って受信進行中のデータは失われます。禁止される(即ち、USART制御/状態レジスタ B(UCSRnB)のUSART受信許可(RXEN)ビットが0を書かれる)と、受信部はもはやRXDnポート ピンの標準機能を無効にしません。受信 FIFO緩衝部は受信部が禁止されると破棄されます。緩衝部内の残データは失われます。

24.8.7. 受信緩衝部の破棄

受信FIFO緩衝部は受信が禁止されると破棄(換言すると、緩衝部は内容を空に)されます。未読データは失われます。例えば異常状 態のため、通常動作中に緩衝部が破棄されなければならない場合、USART制御/状態レジスタA(UCSRnA)の受信完了(RXC)フラグが 解除(0)されるまでUSARTデータ レジスタ(UDRn)I/O位置を読んでください。

次のコード例は受信緩衝部の破棄方法を示します。

アセンブリ言語プログラム例

USART_Flush: SBIS UCSRnA,RXC ;未読データありでスキップ

RET ;未読データなしで復帰

;

IN R16,UDRn ;データ受信

RJMP USART_Flush ;未読データなしまで継続

C言語プログラム例

void USART_Flush(void) {

unsigned char dummy; /* 一時変数定義 */

while ( !(UCSRnA & (1<<RXC)) ) dummy=UDRn; /* 未読データ読み捨て */

}

関連リンク 14頁の「コード例について」

ドキュメント内 mega88.pdf (ページ 132-135)