UARTモジュールを使ってみる。
とりあえず、Lチカのコードに継ぎ足してみた。
仕様はこんな感じ↓。
LED点灯時にASCIIの”A(0x41)”を送信し、LED消灯時にASCIIの”B(0x42)”を送信する。
TXDとRXDはFPGA内でループバックするようにトップモジュールでつないだので、送信した上記のデータはそのまま受信することになる。
受信した結果をJTAG_UARTでコンソールに表示する。
ソースコードは以下。
- #include <stdio.h>
- //#include <stdint.h>
- #include "system.h"
- #include "altera_avalon_pio_regs.h"
- #include "altera_avalon_uart_regs.h"
- #include "altera_avalon_jtag_uart_regs.h"
- #include "sys/alt_sys_wrappers.h"
- int main()
- {
- printf("Hello from Nios II!\n");
- char cBuf;
- while (1) {
- IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0xFF);
- IOWR_ALTERA_AVALON_UART_TXDATA(IO_UART_BASE, 0x41);
- cBuf = IORD_ALTERA_AVALON_UART_TXDATA(IO_UART_BASE);
- IOWR_ALTERA_AVALON_JTAG_UART_DATA(JTAG_UART_BASE, cBuf);
- usleep(500000);
- IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE, 0x00);
- IOWR_ALTERA_AVALON_UART_TXDATA(IO_UART_BASE, 0x42);
- cBuf = IORD_ALTERA_AVALON_UART_TXDATA(IO_UART_BASE);
- IOWR_ALTERA_AVALON_JTAG_UART_DATA(JTAG_UART_BASE, cBuf);
- usleep(500000);
- }
- return 0;
- }
PIOと同じ要領で、レジスタライト、リードの関数を使って、データ送信、受信をする。
(送信:#define IOWR_ALTERA_AVALON_UARTTTXDATA(base, data))
(受信:#define IORD_ALTERA_AVALON_UART_RXDATA(base))
結果は以下。
想定通りに動いていた!
が、よくよく考えると、送信受信ともにバッファがないので、文字列を扱おうと思ったら、割り込み使って効率よく転送する必要がある。。。
なので、今度はこっちを試してみる。