несоответствие скорости передачи между AXI-Uartlite и Teraterm

Я построил простую систему Microblaze на Kintex 7 на плате Avnet MMP2. Я использую IP-адрес Uartlite (v2.0) в этой системе и общаюсь с ПК с помощью Teraterm (v4.85). Скорость передачи для компонента Uartlite должна быть зафиксирована на определенном уровне на этапе проектирования. Я выбрал для своего дизайна 19200 бит / с. Я написал очень простое приложение, которое отправляет 6 последовательных "At" на ПК через Teraterm, затем получает символ ascii из консоли Teraterm и распечатывает его. Проблема в том, что для каждого "At" Teraterm отображает только один 'Ç' на консоли. Параметры передачи следующие:

19200 бит / с; 8 бит данных; 1 стоповый бит; Нет паритета; Нет управления потоком

Однако после долгой царапины в голове, проб и ошибок я обнаружил, что если я изменю скорость передачи в Teraterm на 38400 бит / с, я получаю желаемое поведение, то есть я получаю "At"s на консоли, получаю символ с консоли и печатаю обратно.

Насколько я знаю код (который на самом деле очень простой), я не менял скорость передачи. Но почему-то я отправляю данные со скоростью, превышающей указанную. Используемая частота составляет 100 МГц. Поскольку скорость передачи ДОЛЖНА быть указана на этапе проектирования, как вообще возможно достичь более высокой скорости передачи? Что я сделал не так?

Код выглядит так:

#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;
}

РЕДАКТИРОВАТЬ:

Сегодня я попытался снизить скорость до 9600 бод на IP-ядре UARTlite, регенерировал битовый поток и снова запустил. Тот же результат. Если я установлю скорость передачи Teraterm на 9600, это не сработает. Teraterm предоставляет возможность скорости 14400 бод. Я использовал это. Я получаю 12 символов, но тарабарщина. Если я ровно удвою его до 19200, он работает отлично. Я также попробую с другими скоростями передачи и обновлю. Пожалуйста помоги.!! Это все еще основная часть моего дизайна. Изображение ниже для справки:

введите описание изображения здесь

РЕДАКТИРОВАТЬ2:

Я пробовал следующее:

  1. Удалил Тератерм и переустановил

  2. Установлен Realterm

  3. Установлен гипертерминал

Пробовал со всеми 3. Никаких изменений в поведении. :(


person Vinay Madapura    schedule 11.11.2015    source источник
comment
Какая скорость передачи настроена для модуля UARTlite?   -  person Paebbels    schedule 11.11.2015
comment
@Paebbels Я выбрал 19200 бит / с.   -  person Vinay Madapura    schedule 11.11.2015
comment
Поэтому, если обе стороны (аппаратное и программное) работают на 19.2 kBd, а выборка на 38.4 kBd на стороне программного обеспечения показывает правильное поведение, я бы предположил, что ваш аппаратный модуль работает с удвоенной частотой. На какой частоте был сгенерирован UARTlite?   -  person Paebbels    schedule 11.11.2015
comment
Аппаратное обеспечение использует тактовую частоту 100 МГц. Он генерируется IP-ядром мастера синхронизации.   -  person Vinay Madapura    schedule 11.11.2015


Ответы (1)


нашел причину странного поведения. На этапе проектирования это была ошибка с моей стороны. В соответствии с моим предыдущим дизайном мастер синхронизации ожидает 100 МГц на входе и предназначен для получения 100 МГц на выходе (деление не выполняется). Мое ядро ​​UARTLite также ожидает тактовой частоты 100 МГц и применяет соответствующие значения делителя для создания скорости передачи 19200 бод. Но плата обеспечивает тактовую частоту 200 МГц. Clk_wizard предполагает, что это 100 МГц, и передает часы без какого-либо деления, и цепочка продолжается до UARTLite. Здесь UARTLite делит clk 200 МГц на число, сгенерированное для clk 100 МГц. Таким образом, я передаю с удвоенной скоростью.

В любом случае, спасибо за уделенное время.

person Vinay Madapura    schedule 13.11.2015