Перейти к содержанию

WorldMaster

Members
  • Постов

    8
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Мурманск

Электроника

  • Стаж в электронике
    3-5 лет
  • Сфера радиоэлектроники
    Микроконтроллеры

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

Достижения WorldMaster

Новичок

Новичок (1/14)

  • 10 лет  на форуме
  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Здравствуйте. Есть задача подружить плис и USB мост FT601. Пишу на VHDL. Вроде бы сделал чтобы ПЛИС писал данные в порт и с компа запрашиваю их. Но есть какие то непонятные нюансы. Вот сам код модуля отправки: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.numeric_std.all; use work.types_package.all; entity USB_BRIDGE is port ( in_clk : in std_logic; txe_n : in std_logic; rxf_n: in std_logic; wr_n: out std_logic; BE : inout std_logic_vector(3 downto 0):=(others=>'Z'); DATA_1 : inout std_logic_vector(7 downto 0):=(others=>'Z'); DATA_2 : inout std_logic_vector(7 downto 0):=(others=>'Z'); DATA_3 : inout std_logic_vector(7 downto 0):=(others=>'Z'); DATA_4 : inout std_logic_vector(7 downto 0):=(others=>'Z'); Rst: in std_logic; -- ресет PC_WriteData: out std_logic; -- комп отправил данные в прибор PC_ReadData: out std_logic; -- комп запрашивает данные от прибора RW:in std_logic; -- чтение или запись ChNum: in std_logic_vector(7 downto 0); -- номер канала tranfer_enable: in std_logic; -- сигнал на начало взаимодействия busy: out std_logic; -- сообщает что модуль занят transaction_complete: out std_logic; -- сообщает что транзакция успешно завершена LED_OT: out std_logic := '0'; rx_buffer : out DataBuffer; tx_buffer : in DataBuffer ); end USB_BRIDGE; -- тут описываем логику работы ячейки architecture logic of USB_BRIDGE is signal state: bridge_mode := Idle; signal outled : std_logic; begin process(in_clk, Rst) variable bytes_cnt: integer :=0; -- счетчик принятых или отправленных байт variable active_work: task_type := Idle; VARIABLE outFifoStatus: unsigned(3 DOWNTO 0) :="0000"; VARIABLE inFifoStatus: unsigned(3 DOWNTO 0):="0000"; variable waitBulk: integer :=0; variable timeout: integer :=0; variable BE_state : std_logic_vector(3 downto 0):=(others=>'0'); variable DATA_1_state : std_logic_vector(7 downto 0):=(others=>'0'); variable DATA_2_state : std_logic_vector(7 downto 0):=(others=>'0'); variable DATA_3_state : std_logic_vector(7 downto 0):=(others=>'0'); variable DATA_4_state : std_logic_vector(7 downto 0):=(others=>'0'); begin if Rst = '1' then --LED_OT <= '1'; bytes_cnt := 0; wr_n <='1'; if rxf_n = '1' then BE_state := (others=>'1'); DATA_1 <=(others=>'1'); DATA_2 <= (others=>'Z'); -- чтобы можно было прочитать надо обязательно выставлять Z DATA_3 <= (others=>'1'); DATA_4 <= (others=>'1'); outFifoStatus := unsigned(DATA_2(7 DOWNTO 4)); if outFifoStatus /= "1111" then -- значит пришли данные которые нужно считать PC_WriteData <='1'; else PC_WriteData <='0'; end if; inFifoStatus:=unsigned(DATA_2(3 DOWNTO 0)); if inFifoStatus /= "1111" then -- значит шина свободна для записи PC_ReadData <='1'; else PC_ReadData <='0'; end if; else PC_WriteData <='0'; PC_ReadData <='0'; end if; busy <= '0'; transaction_complete <= '0'; active_work := Idle; state <= Idle; elsif rising_edge( in_clk) then case state is when Idle => busy <= '1'; PC_WriteData <= '0'; PC_ReadData <= '0'; if tranfer_enable = '1' then -- выставляем нужные параметры на линиях и ждем начало окна передачи -- command phase if RW = '0' then DATA_1 <= x"01"; BE_state := "0000"; -- read active_work := ReadUSB; else DATA_1 <= x"01"; BE_state := "0001"; -- write active_work := WriteUSB; end if; wr_n <= '0'; -- flag to ready bytes_cnt := 0; state <= Transfer1; end if; when Transfer1 => if txe_n = '1' then DATA_1 <= (others=>'1'); DATA_2 <= (others=>'Z'); DATA_3 <= (others=>'1'); DATA_4 <= (others=>'1'); BE_state := "1111"; state <= Transfer; bytes_cnt:=0; end if; when Transfer => -- ждем начало окна и начинаем прием данных if rxf_n = '0' then timeout :=0; waitBulk:=0; --LED_OT <= '0'; if bytes_cnt < 1020 then DATA_1 <= x"ae"; DATA_2 <= x"ba"; DATA_3 <= x"cf"; DATA_4 <= x"fa"; BE_state := "1111"; -- count of valid bytes for 4 blocks bytes_cnt := bytes_cnt + 1; else state <= WaitEndBulk; wr_n <= '1'; end if; elsif waitBulk = 0 then wr_n <= '1'; state <= WaitEndBulk; -- turn around end if; when WaitEndBulk => DATA_1 <=(others=>'1'); DATA_2 <= (others=>'Z'); DATA_3 <= (others=>'1'); DATA_4 <= (others=>'1'); BE_state := (others=>'1'); state <= Complete; -- готово when Complete => transaction_complete <= '1'; busy <= '0'; end case; end if; BE <= BE_state; end process; end architecture; Вроде бы работает но данные приходят на комп очень странно:. первые 4 байта стабильно приходят значения линий на момент командной фазы. [0] 0xff byte [1] 0xfe byte [2] 0xff byte [3] 0xff byte [4] 0x00 byte [5] 0x00 byte [6] 0x00 byte [7] 0x00 byte [8] 0x00 byte [9] 0x00 byte [10] 0x00 byte [11] 0x00 byte [12] 0x00 byte [13] 0x00 byte [14] 0x00 byte [15] 0x00 byte затем нули.. Если повторить несколько раз чтение то однажды приходят правильные данные, но опять также с 4 байта. [0] 0xff byte [1] 0xfe byte [2] 0xff byte [3] 0xff byte [4] 0xae byte [5] 0xba byte [6] 0xcf byte [7] 0xfa byte [8] 0xae byte [9] 0xba byte [10] 0xcf byte [11] 0xfa byte [12] 0xae byte [13] 0xba byte [14] 0xcf byte [15] 0xfa byte [16] 0xae byte [17] 0xba byte [18] 0xcf byte [19] 0xfa byte [20] 0xae byte Вот даташит есть на мост https://www.ftdichip.com/old2020/Support/Documents/DataSheets/ICs/DS_FT600Q-FT601Q IC Datasheet.pdf Вот диаграмма: Может я в коде ошибся?? Буду благодарен любой помощи. Спасибо.
  2. Помогите кто нибудь с ремонтом аппарата. Проблема такая: Принесли сварочник fubag in 176 номер платы 63962 ind5 с проблемой "не включается". Что было и когда никто не знает. В ходе осмотра были обнаружены следующие проблемы: Были повреждены дорожки, пробиты диоды и транзисторы. Транзисторы звонятся накоротко. Диод показывает разрыв. На картинке показал что было повреждено. Диод GS1M заменил. Дорожку запаял и переход восстановил проволочкой. А по остальным деталям запара. Плата покрыта лаком. После удаления лака напрочь исчезла маркировка. Даже под микроскопом невозможно определить тип транзисторов и диода. Со схемой тоже проблема. Как будто 176 никогда и не было в ремонтах. Либо у него сверхсекретная схема. Говорят что он близнец Gysmi, подкинули схемку, но расположение нужного участка отличается. Помогите кто чем может. Спасибо.
×
×
  • Создать...