首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AXI-Uartlite与Teraterm的波纹失配

AXI-Uartlite与Teraterm的波纹失配
EN

Stack Overflow用户
提问于 2015-11-11 15:07:07
回答 1查看 1.3K关注 0票数 0

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

19200 bps;8数据位;1停止位;无奇偶校验;无流控制

然而,经过大量的抓取、尝试和错误之后,我发现如果我将Teraterm中的baudrate更改为38400 bps,我就会得到所需的行为,即在控制台上获得"At"s,从控制台获取一个字符并将其打印回来。

据我所知,代码(这是非常简单的),我没有改变波德率。但是不知怎么的,我发送数据的速度比指定的速率要快。所用的时钟是100兆赫。既然波德率必须在设计阶段指定,那么如何才能达到更高的波特率呢?我做错了什么?

代码是这样的:

代码语言:javascript
复制
#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. 已安装实期
  3. 已安装的超级终端

三次都试过了。行为没有改变。:(

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-13 10:16:33

找到了这种奇怪行为的原因。这是我在设计阶段的一个错误。根据我以前的设计,时钟向导期望100 my作为输入,并被设计成在输出端产生100 my(不进行分割)。我的UARTLite核心还期望有一个100 My的时钟,并应用相关的分频器值来生成19200的波特率。但董事会提供200兆赫。clk_wizard假设它是100 The,不需要任何分割就通过时钟,并且链一直持续到UARTLite。这里,UARTLite将200 200MHz除以它为100 200MHz生成的数字。因此,我正以双倍的速度转移。

不管怎样,谢谢你给我时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33653445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档