【问题标题】:baudrate mismatch between AXI-Uartlite and TeratermAXI-Uartlite 和 Teraterm 之间的波特率不匹配
【发布时间】:2015-11-13 18:16:33
【问题描述】:

我在 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 在控制台上只显示一个'Ç'。传输参数如下:

19200 基点; 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,它就完美了。我也会尝试其他波特率并更新。请帮忙。!!这仍然是我设计的基本部分。下图供参考:

EDIT2:

我尝试了以下方法:

  1. 卸载 Teraterm 并重新安装

  2. 已安装 Realterm

  3. 安装的超级终端

尝试了所有 3。行为没有变化。 :(

【问题讨论】:

  • UARTlite 模块配置的波特率是多少?
  • @Paebbels 我选择了 19200 bps。
  • 因此,如果双方(硬件和软件)都在19.2 kBd 工作并且在软件端以38.4 kBd 采样显示正确的行为,我会假设您的硬件模块以双倍频率运行。 UARTlite 生成的频率是多少?
  • 硬件使用 100MHz 轴时钟。它由时钟向导 IP 内核生成。

标签: c xilinx uart baud-rate microblaze


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 2020-05-12
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 2013-12-30
    相关资源
    最近更新 更多