Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
  • Страница:
  • 1

ТЕМА: UART loopback для Марсохода2

UART loopback для Марсохода2 11 года 1 мес. назад #1923

  • alman
  • alman аватар Автор темы
  • Не в сети
  • Завсегдатай
  • Завсегдатай
  • Сообщений: 263
  • Спасибо получено: 41
Здравствуйте, коллеги.

В "Первом примере для платы Марсоход2" есть интересный момент - замкнуты контакты FTDI_BD0 и FTDI_BD1, вследствие чего принятые данные отправляются назад. Это очень хорошее решение, но для реальных проектов нужно немного больше.

Я взял из проекта Altor32 for Marsohod2 вот этот файл altor32\trunk\rtl\peripheral\uart.v и попробовал сделать loopback, чтобы все принятые данные отправлялись назад. Сделано это было следующим образом:

http://img-fotki.yandex.ru/get/9155/28696123.3/0_91481_f6a21667_orig

Однако, ожидаемого результата не получил - данные даже не принимаются.
Вот пример кода
`define SERIAL_PORT

module test_wires(
	input wire i_clk,
	input wire reset,
	input wire key1,
	// Output led control
	output wire led0,
	output wire led1,	
	output wire led2,
	output wire led3,
	// Data lines
	input wire serial_rx,
	output wire serial_tx
);


wire ready;
wire busy;
wire send;
wire [7:0] rx_byte, tx_byte;

assign led3 = !(reset & key1);

`ifdef SERIAL_PORT

// ==============================================
// Делитель частоты с 100 мГц до 5 мГц
// ==============================================
wire serial_clk;

clock u_clock(
	.inclk0(i_clk),
	.c0(serial_clk)
);

// ==============================================
// Установка последовательного порта
// ==============================================
uart u_serial(
    .clk_i(serial_clk), 
    .rst_i(reset),
    // Status
    .tx_busy_o(busy), 
    .rx_ready_o(ready),
    // Data
    .data_i(rx_byte), 
    .wr_i(ready),
    .data_o(tx_byte),
    .rd_i(1), 
    // UART pins
    .rxd_i(serial_rx), 
    .txd_o(serial_tx) 
);


assign tx_byte = rx_byte;
assign led0 = rx_byte[0];
assign led1 = rx_byte[1];
assign led2 = rx_byte[2];

`else
	assign serial_tx = serial_rx;
	assign led2 = led2 ^ serial_rx;
`endif

endmodule

Параметры делителя частоты:
ВНИМАНИЕ: Спойлер!


Небольшое исправление в uart.v
parameter  [31:0]    UART_DIVISOR = 128;

Исходил из того, что тактовая частота на входе PIN_25 равна 100мГц. По идее, после деления частоты на 20, на вход clk_i модуля uart податся 5 мГц.
Константу UART_DIVISOR подсмотрел в другом проекте, опубликованном на форуме Марсохода. Вот что сказано в коментарии тому к коду:

//скорость приема и передачи определяется этой константой
//она рассчитана из исх. тактовой частоты 5Mhz и желаемой скорости 38400
//как 5000000/38400 = 130
parameter RCONST = 128;


К сожалению, ни одного байта не было принято, хотя, если соединить FTDI_BD0 и FTDI_BD1 (без использования UART), то данные передаются.

Пожалуйста, помогите разобраться и решить проблему.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от alman.

Re: UART loopback для Марсохода2 11 года 1 мес. назад #1924

  • alman
  • alman аватар Автор темы
  • Не в сети
  • Завсегдатай
  • Завсегдатай
  • Сообщений: 263
  • Спасибо получено: 41
Ура! Заработало! Кто бы мог подумать, что вход на сброс надо подавать в инверсии?!!
Кстати, а почему необходиимо инвертировать сигналы от кнопок (PIN_22 и PIN23)?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Последнее редактирование: от alman.

Re: UART loopback для Марсохода2 11 года 1 мес. назад #1925

  • Falcon
  • Falcon аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Осваиваюсь на форуме
  • Сообщений: 31
  • Спасибо получено: 8
То же на кнопках первый раз напоролся. Так как классика жанра это привязка к GUN
Смотрите на схему включения этих кнопок. И все станет ясно.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
Время создания страницы: 0.088 секунд
Работает на Kunena форум