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

USARTのデータ受信

ドキュメント内 mega8U2.pdf (ページ 100-103)

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

18. USART

18.7. USARTのデータ受信

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

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

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

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

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

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

RJMP USART_Rx ;受信完了待機

;

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

RET ;呼び出し元へ復帰

C言語プログラム例

unsigned char USART_Receive(void) {

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

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

}

注: 5頁の「コード例」をご覧ください。

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

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

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

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

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

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

RJMP USART_Rx ;受信完了待機

;

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

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

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

ANDI R18,(1<<FEn)|(1<<DORn)|(1<<UPEn) ;受信異常検査

BREQ USART_Rx_V ;異常なしで分岐

;

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

LDI R16,-1 ;

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

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

RET ;呼び出し元へ復帰

C言語プログラム例

unsigned int USART_Receive(void) {

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

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

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

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

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

if ( status & ((1<<FEn)|(1<<DORn)|(1<<UPEn)) ) return -1; /* 受信異常で-1値設定/復帰 */

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

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

}

注: 5頁の「コード例」をご覧ください。

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

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

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

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

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

102

ATmega8U2/16U2/32U2

18.7.4. 受信異常フラグ

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

UCSRnAが書かれるとき、全てのフラグは0に設定されなければなりません。異常フラグはどれも割り込みを生成できません。

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

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

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

18.7.5. パリティ検査器

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

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

18.7.6. 受信の禁止

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

18.7.7. 受信緩衝部の破棄

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

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

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

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

;

IN R16,UDRn ;データ受信

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

C言語プログラム例

void USART_Flush(void) {

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

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

}

注: 5頁の「コード例」をご覧ください。

ドキュメント内 mega8U2.pdf (ページ 100-103)