ラズパイ3でベアメタル - その4:シリアル通信(UART)でエコーバック(割り込みなし)

今回は、前回のプログラムに文字受信を追加して、
PCからラズパイ3へ送信した文字をそのまま送り返す(エコーバック)
を作ってみます。


なお、Raspberry Pi 3で64bitベアメタル(bare metal)プログラミングを試してみる
本シリーズの目次はコチラです。


1. 新たに使用するレジスタ

PCから送信されたデータをRaspberry Pi 3で受信する必要があるので、
今回新たにUARTの受信の機能を使用します。


UARTで受信したデータを取得するまでの流れは以下のとおりです。
1. 受信FIFOのチェック
2. 受信FIFOからデータを取り出す


今回登場するレジスタは以下の記事で書いたものと同じです。(LSRとIO)

1.1. 受信FIFOのチェック

受信FIFOのチェックにも、送信FIFOチェックで使用したLSRを使います。


LSRのData ready(以降、RX_RDY)ビット(ビット0)は、
「少なくとも1文字(1バイト)は受信FIFOにデータがある」場合に1になるビットなので、
「LSRのTX_RDYビットが1である」場合は受信FIFOからデータを取り出せる事がわかります。

1.2. 受信FIFOからデータを取り出す

送信で使用したIOレジスタを読み出すと受信FIFOからデータを取り出せます。

2. ソースコード(エコーバックプログラム)

エコーバックプログラムのソースコードは以下のとおりです。

#define MU_IO		(*(volatile unsigned int *)0x3f215040)
#define MU_LSR		(*(volatile unsigned int *)0x3f215054)
#define MU_LSR_TX_IDLE	(1U << 6)
#define MU_LSR_TX_EMPTY	(1U << 5)
#define MU_LSR_RX_RDY	(1U << 0)

int main(void)
{
	volatile char ch;

	while (1) {
		while (!(MU_LSR & MU_LSR_RX_RDY));
		ch = (char)MU_IO;

		while (!(MU_LSR & MU_LSR_TX_IDLE) && !(MU_LSR & MU_LSR_TX_EMPTY));
		MU_IO = (unsigned int)ch;
	}

	return 0;
}

3. 動作確認

試し方は前回の記事と同じです。


今回のプログラムはエコーバックなので、
PC側で実行している端末アプリ(TeraTerm等)上で入力した文字が、
そのまま表示されます。