以前の記事で、FT232HLを使ったパソコンとNiosのシリアル通信をやってみました。
以前はNiosからのデータ送信時、送信バッファのステータスチェックをせず、単純にwait時間入れていました。
今回は、送信バッファのステータスチェック方法がわかったので、まとめておきます。
Niosのレジスタ
以下はAltera(Intel)のデータシートに記載されていた、”UART Core Register Map”です。


これより、送信バッファのステータスチェックは、statusレジスタのtrdyビットで確認できるようです。
修正したソースコード
まず、以前の記事のソースコードです。
void Send_LED(unsigned char buf) { unsigned char LED[] = {'L','E','D'}; int i; for(i=0;i<sizeof(LED);i++){ IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, LED[i]); usleep(1000); } IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, buf); }
IOWR_ALTERA_AVALON_UART_TXDATA関数で1byte分のデータを送信バッファにセットして、その後、usleep関数でデータ送信が完了するまで待っていました。
これを以下のように変更して、送信バッファのステータスチェックを行いました。
void Send_LED(unsigned char buf) { unsigned char LED[] = {'L','E','D'}; int i; unsigned int rdy; for(i=0;i<sizeof(LED);i++){ rdy = 0; IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, LED[i]); while(1){ rdy = IORD_ALTERA_AVALON_UART_STATUS(UART_0_BASE) & ALTERA_AVALON_UART_STATUS_TRDY_MSK; if(rdy) break; } } IOWR_ALTERA_AVALON_UART_TXDATA(UART_0_BASE, buf); }
while(1)の中で、ステータスレジスタを読んで、trdyビットのチェックをしています。trdyビットが’1’になったら、送信バッファが空になったので、送信データをセットしています。
まとめ
単純にwait時間で送信バッファが空になるのを待つより、送信バッファのステータスチェックをすることで、少しはまともなプログラムに近づいたかもしれません。
でも、送信バッファが空になるまで無駄な待ち時間があることには変わりないので、そこはまだまだ改良の余地あり。
この待ち時間中に別の処理ができるようになるのが理想です。
あと、今回でNiosのレジスタの見方がちょっと理解できたような気がします。