AXI-Uartlite 和 Teraterm 之间的波特率不匹配
baudrate mismatch between AXI-Uartlite and Teraterm
我在 Avnet 的 MMP2 板上的 Kintex 7 上构建了一个简单的 Microblaze 系统。我在此系统中使用 Uartlite (v2.0) IP,并使用 Teraterm (v4.85) 与 PC 通信。 Uartlite 组件的波特率必须在设计阶段固定为特定值。我为我的设计选择了 19200 bps。我编写了一个非常简单的应用程序,它通过 Teraterm 向 PC 发送 6 个连续的 "At"
s,然后从 Teraterm 控制台获取一个 ascii 字符并打印相同的字符。问题是,对于每个 "At"
,Teraterm 在控制台上只显示一个 'Ç'
。 t运行任务参数如下:
19200 bps; 8 data bits; 1 stop bit; No parity; No Flow-control
然而,经过大量的摸索和反复试验之后,我发现如果我将 Teraterm 中的波特率更改为 38400 bps,我会得到所需的行为,即,我会得到 "At"
s控制台,从控制台获取一个字符并将其打印回来。
据我所知的代码(真的很简单),我没有改变波特率。但不知何故,我以比指定速率更快的速率发送数据。使用的时钟是100MHz。由于波特率必须在设计阶段指定,如何才能达到更高的波特率呢?我做错了什么?
代码如下:
#include <stdio.h>
#include "platform.h"
#include "xgpio_l.h"
#include "xintc_l.h"
#include "xparameters.h"
#include "xuartlite_l.h"
#define MAX_UART_BUFFER_LENGTH 16
u8 uart_rx_data = 0;
int main()
{
init_platform();
//Init GPIOs
//dip switch port as input
XGpio_WriteReg(XPAR_AXI_GPIO_0_BASEADDR, XGPIO_TRI_OFFSET, 0xFFFFFFFF);
char count_data = 0x0F;
while(1)
{
unsigned int dip_gpio_data = XGpio_ReadReg(XPAR_AXI_GPIO_0_BASEADDR, XGPIO_DATA_OFFSET) & 0x000000FF;
if(dip_gpio_data == 0)
{
u8 send_data[MAX_UART_BUFFER_LENGTH] = "AtAtAtAtAtAt";
u8 i = 0 ;
for (i = 0; i < MAX_UART_BUFFER_LENGTH; i++)
{
if(send_data[i] != '[=10=]')
XUartLite_SendByte(XPAR_AXI_UARTLITE_0_BASEADDR, send_data[i]);
else
break;
}
//Rx something from Teraterm
uart_rx_data = XUartLite_RecvByte(XPAR_AXI_UARTLITE_0_BASEADDR);
//Send same thing back
XUartLite_SendByte(XPAR_AXI_UARTLITE_0_BASEADDR, uart_rx_data);
XUartLite_SendByte(XPAR_AXI_UARTLITE_0_BASEADDR, '\n');
XUartLite_SendByte(XPAR_AXI_UARTLITE_0_BASEADDR, '\r');
}
}
return 0;
}
编辑:
今天,我尝试将 UARTlite IP 内核的波特率降低到 9600,重新生成比特流并再次 运行。同样的结果。如果我将 Teraterm 的波特率设置为 9600,它不起作用。 Teraterm 提供了 14400 波特率的选项。我用过这个。我得到 12 个字符,但是乱码。如果我恰好将它加倍到 19200,它就可以完美运行。我也会尝试使用其他波特率并进行更新。请帮忙。!!这仍然是我设计的基本部分。下图供参考:
编辑2:
我尝试了以下方法:
已卸载 Teraterm 并重新安装
已安装 Realterm
已安装超级终端
尝试了所有 3 个。行为没有变化。 :(
找到了奇怪行为的原因。
这是我在设计阶段的一个错误。根据我之前的设计,时钟向导期望 100MHz 作为输入,并设计为在输出端产生 100MHz(未进行除法)。我的 UARTLite 内核也需要 100MHz 的时钟,并应用相关的分频器值来生成 19200 的波特率。但是开发板提供的是 200MHz。 clk_wizard 假定它是 100MHz 并且不加任何分频地传递时钟,并且链继续直到 UARTLite。这里 UARTLite 将 200MHz 时钟除以它为 100MHz 时钟生成的数字。因此我以双倍的速度传输。
无论如何,谢谢你的时间。
我在 Avnet 的 MMP2 板上的 Kintex 7 上构建了一个简单的 Microblaze 系统。我在此系统中使用 Uartlite (v2.0) IP,并使用 Teraterm (v4.85) 与 PC 通信。 Uartlite 组件的波特率必须在设计阶段固定为特定值。我为我的设计选择了 19200 bps。我编写了一个非常简单的应用程序,它通过 Teraterm 向 PC 发送 6 个连续的 "At"
s,然后从 Teraterm 控制台获取一个 ascii 字符并打印相同的字符。问题是,对于每个 "At"
,Teraterm 在控制台上只显示一个 'Ç'
。 t运行任务参数如下:
19200 bps; 8 data bits; 1 stop bit; No parity; No Flow-control
然而,经过大量的摸索和反复试验之后,我发现如果我将 Teraterm 中的波特率更改为 38400 bps,我会得到所需的行为,即,我会得到 "At"
s控制台,从控制台获取一个字符并将其打印回来。
据我所知的代码(真的很简单),我没有改变波特率。但不知何故,我以比指定速率更快的速率发送数据。使用的时钟是100MHz。由于波特率必须在设计阶段指定,如何才能达到更高的波特率呢?我做错了什么?
代码如下:
#include <stdio.h>
#include "platform.h"
#include "xgpio_l.h"
#include "xintc_l.h"
#include "xparameters.h"
#include "xuartlite_l.h"
#define MAX_UART_BUFFER_LENGTH 16
u8 uart_rx_data = 0;
int main()
{
init_platform();
//Init GPIOs
//dip switch port as input
XGpio_WriteReg(XPAR_AXI_GPIO_0_BASEADDR, XGPIO_TRI_OFFSET, 0xFFFFFFFF);
char count_data = 0x0F;
while(1)
{
unsigned int dip_gpio_data = XGpio_ReadReg(XPAR_AXI_GPIO_0_BASEADDR, XGPIO_DATA_OFFSET) & 0x000000FF;
if(dip_gpio_data == 0)
{
u8 send_data[MAX_UART_BUFFER_LENGTH] = "AtAtAtAtAtAt";
u8 i = 0 ;
for (i = 0; i < MAX_UART_BUFFER_LENGTH; i++)
{
if(send_data[i] != '[=10=]')
XUartLite_SendByte(XPAR_AXI_UARTLITE_0_BASEADDR, send_data[i]);
else
break;
}
//Rx something from Teraterm
uart_rx_data = XUartLite_RecvByte(XPAR_AXI_UARTLITE_0_BASEADDR);
//Send same thing back
XUartLite_SendByte(XPAR_AXI_UARTLITE_0_BASEADDR, uart_rx_data);
XUartLite_SendByte(XPAR_AXI_UARTLITE_0_BASEADDR, '\n');
XUartLite_SendByte(XPAR_AXI_UARTLITE_0_BASEADDR, '\r');
}
}
return 0;
}
编辑:
今天,我尝试将 UARTlite IP 内核的波特率降低到 9600,重新生成比特流并再次 运行。同样的结果。如果我将 Teraterm 的波特率设置为 9600,它不起作用。 Teraterm 提供了 14400 波特率的选项。我用过这个。我得到 12 个字符,但是乱码。如果我恰好将它加倍到 19200,它就可以完美运行。我也会尝试使用其他波特率并进行更新。请帮忙。!!这仍然是我设计的基本部分。下图供参考:
编辑2:
我尝试了以下方法:
已卸载 Teraterm 并重新安装
已安装 Realterm
已安装超级终端
尝试了所有 3 个。行为没有变化。 :(
找到了奇怪行为的原因。 这是我在设计阶段的一个错误。根据我之前的设计,时钟向导期望 100MHz 作为输入,并设计为在输出端产生 100MHz(未进行除法)。我的 UARTLite 内核也需要 100MHz 的时钟,并应用相关的分频器值来生成 19200 的波特率。但是开发板提供的是 200MHz。 clk_wizard 假定它是 100MHz 并且不加任何分频地传递时钟,并且链继续直到 UARTLite。这里 UARTLite 将 200MHz 时钟除以它为 100MHz 时钟生成的数字。因此我以双倍的速度传输。
无论如何,谢谢你的时间。