Jump to content

    
Sign in to follow this  
enzaime

приём данных по протоколу UART

Recommended Posts

Вопрос такой: у меня есть модуль вот такой: http://www.ebay.com/itm/FT232RL-3-3V-5-5V-...t-/141724029351 и ПЛИС вот такая: http://www.terasic.com.tw/cgi-bin/page/arc...lish&No=593 (cyclone iv)

Для uart модуля я установил на комп драйвер com порта http://www.ftdichip.com/Drivers/VCP.htm. Вроде бы всё работает ( при посылке данных светодиод на плате мигает ). Использую такую вот программку для передачи данных через com порт http://compt.ru/ru/index.php

Написал вот такой приёмник для ПЛИС:

-------------------------------------------------------------------------------


library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity reciver is
     port(
         clk : in STD_LOGIC;
         ftdi_txd : in STD_LOGIC;
         led : out STD_LOGIC_VECTOR(7 downto 0)
         );
end reciver;

--}} End of automatically maintained section

architecture arch of reciver is
signal state:natural:=0;  
signal bitcnt:natural:=0;
begin
    process(clk)
    begin        
        if(rising_edge(clk)) then 
            
            if(state=0) then
                if(ftdi_txd='0') then
                    state<=1;  
                    bitcnt<=0;
                end if;
            end if;    
            
            if(state=1) then 
                if(bitcnt<8) then
                    led(bitcnt)<=ftdi_txd;
                    bitcnt<=bitcnt+1;
                else
                    if(ftdi_txd='1') then
                        state<=0;
                    end if;         
                end if;
            end if;
            
        end if;
    end process;
     -- enter your statements here --

end arch;

приёмник писал из соображений таких: 1 старт бит ( низкий уровень ), 8 битов данных, 1 стоп бит ( высокий уровень )

 

частота clk 9600 гц ( получаю так: 50 Мгц делю на 5208 ). Получаю её вот так:

library IEEE;
use IEEE.STD_LOGIC_1164.all;

entity freq is
    generic(n:natural:=5208);
     port(
         clk : in STD_LOGIC;
         clk1 : out STD_LOGIC
         );
end freq;

--}} End of automatically maintained section

architecture arch of freq is
signal a:natural:=0;
begin    
    process(clk)
    begin        
        if(rising_edge(clk)) then
            if(a>=0 and a<n/2) then
                clk1<='1';          
            else
                if(a>=n/2 and a<n-1) then
                    clk1<='0';
                end if;
            end if;
            if(a>=n-1) then
                a<=0;
            else
                a<=a+1;
            end if;
        end if;
    end process;
     -- enter your statements here --

end arch;

 

Но в результате получаю беспорядочное мигание светодиодами ( радует только одно: мигают только при передаче, т.е. что-то правильное уже есть)

 

Подключаю так:

IMG_20160109_222009.jpg

контакт rx к ножке ПЛИС

Понимаю, что не имея перед глазами всех этих штук сложно найти ошибку, но может знает кто в чём может быть дело?

Перемычка в положении 3.3 вольта

 

Edited by enzaime

Share this post


Link to post
Share on other sites
Прежде всего, общие не соеденены.

Общие это vcc и gnd? Если про них, то и так всё работает ( что-то там светится ). Обновил фотку в первом сообщении (теперь в рабочем варианте (плата и модуль питаются от компа))

Share this post


Link to post
Share on other sites
Но в результате получаю беспорядочное мигание светодиодами ( радует только одно: мигают только при передаче, т.е. что-то правильное уже есть)

 

Понимаю, что не имея перед глазами всех этих штук сложно найти ошибку, но может знает кто в чём может быть дело?

1. Делаем перемычку Rx-Tx внутри ПЛИС и добиваемся устойчивой передачи и приема данных. Смотрим осциллом...

2. Переносим перемычку из ПЛИС на контакты разъема платы... и добиваемся устойчивой передачи и приема данных. Смотрим осциллом...

3. Подключаем переходник USB на UART к компьютеру. На переходнике Делаем перемычку Rx-Tx и добиваемся устойчивой передачи и приема данных со стороны компьютера..

4. Сравниваем диаграммы при передаче одинаковых кодов, например буквы U. Длительности импульсов должны быть одинаковыми...

 

На опекорес полно исходников UARTов, берем и смотрим коды.

При установке ИСЕ есть образцовые проекты - вэвйген. Там есть и UART.

 

Share this post


Link to post
Share on other sites

Рекомендую рабочий вариант с объяснениями:

A serial interface is a simple way to connect an FPGA to a PC. We just need a transmitter and receiver module

 

Правда, реализация на Verilog, но мне в свое время хорошо помог.

Share this post


Link to post
Share on other sites

1. Самая главная ошибка в том, что нет синхронизаторов на ftdi_txd. Этот сигнал является асинхронным для вашего приёмника. Т.е. его спад/фронт может прийти в момент считывания приёмником, а это приведёт к метастабильности всей схемы из-за несоблюдения setup/hold триггера. Изучайте CDC (Clock Domain Crossing), в сети море статей.

Например, по ссылке от shamrel в секции описания приёмника входной сигнал синхронизируется с помощью регистра RxD_sync. (правда, там на verilog, но сути не меняет).

 

2. Генерировать тактовый сигнал на логике - не самый удачный вариант. Это нужно использовать только в крайнем случае и с пониманием. А приёмник UART можно сделать и на 50мгц. Так можно будет точнее поймать перепад (1 -> 0), т.е. стартовый бит, а далее счётчиком отсчитать нужное число тактов, чтобы попасть на середину каждого информационного бита.

 

Общие это vcc и gnd? Если про них, то и так всё работает ( что-то там светится ). Обновил фотку в первом сообщении (теперь в рабочем варианте (плата и модуль питаются от компа))

3. Общая - земля. Всё и так работает видимо потому, что земля общая за счёт USB, который подключен к одному компьютеру. Но это не всегда будет работать, соединяйте землю нормально.

Edited by Inanity

Share this post


Link to post
Share on other sites

стоит проверить работоспособность FTDI и драйвера. бывает свежий драйвер порет чушь в порт из-за китайского клона. лечится установкой старого драйвера FTDI.

Share this post


Link to post
Share on other sites
стоит проверить работоспособность FTDI и драйвера. бывает свежий драйвер порет чушь в порт из-за китайского клона. лечится установкой старого драйвера FTDI.

Блин, я вчера так и сделал и всё заработало как часы. Как и должно быть. Причина вот: я сразу полез устанавливать скачанный драйвер, и лишь когда начал пробовать на другом компе устанавливать драйвера увидел, что при втыкании модуля он сам устанавливает нужные драйвера (видимо из своей внутренней памяти). В общем всё как всегда... Всем спасибо за участие, все свободны :biggrin:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this