AXI-Uartlite和Teraterm之间的波特率不匹配

时间:2015-11-11 15:07:08

标签: c xilinx uart baud-rate microblaze

我在Avnet的MMP2板上的Kintex 7上构建了一个简单的Microblaze系统。我在这个系统中使用Uartlite(v2.0)IP并使用Teraterm(v4.85)与PC通信。 Uartlite组件的波特率必须在设计阶段固定为特定值。我为我的设计选择了19200 bps。我写了一个非常简单的应用程序,它通过Teraterm将6个连续的"At"发送到PC,然后从Teraterm控制台获取一个ascii字符并打印出来。问题是,对于每个"At",Teraterm在控制台上只显示一个'Ç'。传输参数如下:

  

19200 bps; 8个数据位; 1个停止位;没有平价;没有流量控制

然而,经过大量的头痛和试验和错误之后,我发现如果我将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] != '\0')
                    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,那就完美了。我也将尝试其他波特率并更新。请帮忙。!!这仍然是我设计的基本部分。以下图片供参考:

enter image description here

EDIT2:

我尝试了以下内容:

  1. 卸载Teraterm并重新安装

  2. 已安装的Realterm

  3. 已安装超级终端

  4. 全部尝试3.行为没有变化。 :(

1 个答案:

答案 0 :(得分:0)

找到了奇怪行为的原因。 在设计阶段我的身边出现了错误。根据我之前的设计,Clocking向导需要100MHz作为输入,并且设计为在输出端产生100MHz(不进行任何分割)。我的UARTLite内核还需要一个100MHz的时钟,并应用相关的分频器值来产生19200的波特率。但是该板提供200MHz的频率。 clk_wizard假定它是100MHz并且没有任何除法地传递时钟,并且链继续直到UARTLite。在这里,UARTLite将200MHz clk与它为100MHz clk生成的数字相除。因此,我的转速是双倍的。

无论如何,谢谢你的时间。