Hatena::ブログ(Diary)

へにゃぺんて@日々勉強のまとめ

2016-05-29

ラズパイ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等)上で入力した文字が、

そのまま表示されます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元