センサーを使用して、そこから値を読み取っています。uart_lite
ザイリンクス EDK を追加し、そのピンをボードの GPIO にマップしました。PS (Zynq PS) クロックは 50Mhz/100Mhz/200Mhz です。UART の RX から 115200 ボー レートで 2 ストップ ビットと偶数パリティでデータを受信しています。
ドキュメントで提供されているレジスタを使用して UART を使用しています。ctrl_reg
、stat_reg
、RX_reg
、 の4 つのレジスタがありますTX_reg
。これらを使用して、データの受信と送信を行うように uart を構成できます。のドキュメントuartlite
はこちらです。
現在、データを受け取って Teraterm で印刷しようとしています。
UART を正しいモードとそのレジスタに設定するコードを次に示します。
#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
#include "xil_io.h"
#include "sleep.h"
#define UART_BASE XPAR_AXI_UARTLITE_0_BASEADDR
#define RX_FIFO_REG UART_BASE + 0x00
#define TX_FIFO_REG UART_BASE + 0x04
#define STAT_REG UART_BASE + 0x08
#define CTRL_REG UART_BASE + 0x0C
// Control Register
#define ENA_INTR 27
#define RST_RXFIFO 30
#define RST_TXFIFO 31
// Control Register
// xsp module
unsigned int *pAddr;
#define RS_DXEN 0
#define RS_UART_OUI 1
#define RS_HF_OUT 2
#define RS_RXEN_BAR 3
#define RS_TE_485 4
unsigned int Setting;
// xsp module
unsigned int *pData1, *pData2, *pData3, *pData4;
unsigned int RxStat = 0;
unsigned int RxData = 0;
int main()
{
init_platform();
pAddr = XPAR_UART_IP_0_BASEADDR;
// RS485 RX Mode
Setting = ( 0<<RS_TE_485 | 0<<RS_RXEN_BAR | 1<<RS_HF_OUT | 1<<RS_UART_OUI | 0<<RS_DXEN );
// RS485 TX Mode
//Setting = ( 0<<RS_TE_485 | 1<<RS_RXEN_BAR | 1<<RS_HF_OUT | 1<<RS_UART_OUI | 1<<RS_DXEN );
*pAddr = Setting;
// Control Register
pData1 = CTRL_REG;
*pData1 = (1<<ENA_INTR)|(1<RST_RXFIFO)|(1<RST_TXFIFO);
pData2 = RX_FIFO_REG;//FIFO REG;
pData3 = STAT_REG;//STAT_REG;
pData4 = TX_FIFO_REG; // TX_FIFO_REG
while (1) {
xil_printf("success");
xil_printf("0x%X\r\n",*pData2);
}
return 0;
}
したがって、while ループは継続的に実行して値を出力する必要がありますが、18 バイトを出力した後にのみ停止しますか?? しかし、私の出力は次のようになります:
これが私のデバッグの試みです: