Я построил простую систему 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:
Я пробовал следующее:
Удалил Тератерм и переустановил
Установлен Realterm
Установлен гипертерминал
Пробовал со всеми 3. Никаких изменений в поведении. :(
19.2 kBd
, а выборка на38.4 kBd
на стороне программного обеспечения показывает правильное поведение, я бы предположил, что ваш аппаратный модуль работает с удвоенной частотой. На какой частоте был сгенерирован UARTlite? - person Paebbels   schedule 11.11.2015