Flip-fl0p 4 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Продолжаю в свободное от работы время изучать шину I2C. Особых проблем при написании логики работы SLAVE устройства я не встретил. За одним маленьким исключением. Линии SDA и SCL подтянуты к питанию, т.е линия постоянно в лог. 1. Все SLAVE устройства "висящие" на этих линиях находятся Z состоянии и подключены по типу "монтажное И". Читаю кучу мануалов, но просветления не наступило. Как правильно описать пин в Quartuse для реализации подключения по схеме "монтажное И", да ещё и с Z состоянием. Вопросов как описать Z состояние у меня нет. Пугает то, что ПЛИС для выдачи в линию лог. нуля, должна "придавить" эту линию к земле. Что по сути будет короткое замыкание... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Приветствую! ... Вопросов как описать Z состояние у меня нет. Пугает то, что ПЛИС для выдачи в линию лог. нуля, должна "придавить" эту линию к земле. Что по сути будет короткое замыкание... С какой это стати КЗ? assign SDA = (sda_oe_n==1'b0) ? 1'b0 : 1'bz; Тоесть пин либо в Z (висит в воздухе) либо в 0. К VCC никогда не подключается, вот поэтому и нужны внешние резисторы на VCC. Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Я бы даже сказал что внешние резисторы как раз и делают чтобы не было КЗ. Линию не подключают к питанию напрямую, а подключают через резистор на нем и будет все падать, когда слейв затянет линию в 0, и никакого КЗ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 16 марта, 2017 Опубликовано 16 марта, 2017 (изменено) · Жалоба Приветствую! С какой это стати КЗ? assign SDA = (sda_oe_n==1'b0) ? 1'b0 : 1'bz; Тоесть пин либо в Z (висит в воздухе) либо в 0. К VCC никогда не подключается, вот поэтому и нужны внешние резисторы на VCC. Успехов! Rob. Ну кончено ! Как я мог забыть ! У нас же ток пойдет от источника, через подтягивающие резисторы, через токоограничивающий резистор на макетной плате, в пин, а затем в землю. И таким образом линия линия станет нулём. Хм... Вроде логично. Возник вопрос тогда, как правильнее моделировать на VHDL линию подтянутую к питанию ? Написал модуль тестбенча, которые генерирует сигналы SDI и SCL (по сути написал Master'a выдающий нужные мне значения). Соответственно если мастер присваивает линиям SDI и SCL лог. 1, а Slave присваивает им лог.0 я получаю закономерные X при моделировании, поскольку так устроена разрешающая функция в VHDL для типа STD_LOGIC. Присваивать этим линиям значение слабой единицы, т.е "Н" - то-же не самая лучшая идея. Поскольку Slave устройство в итоге вместо нормальных данных (единицы и нули) принимает значения H. И в итоге регистр вместо байта B"1111_1111" содержит B"HHHH_HHHH". Думаю, что правильнее либо писать собственную функцию разрешения. Либо функцию, которая из "H" значения делает лог единицу. Как бы вы смоделировали это ? Изменено 16 марта, 2017 пользователем Flip-fl0p Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба а чего бы не поставить туда логическое И, которым данная схема и является изначально? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба а чего бы не поставить туда логическое И, которым данная схема и является изначально? К сожалению не совсем понял Вас... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 16 марта, 2017 Опубликовано 16 марта, 2017 · Жалоба Приветствую! Думаю, что правильнее либо писать собственную функцию разрешения. Либо функцию, которая из "H" значения делает лог единицу. Как бы вы смоделировали это ? Library UNISIM; use UNISIM.vcomponents.all; -- PULLUP: I/O Pullup -- Xilinx HDL Libraries Guide, version 2014.1 PULLUP_inst : PULLUP port map ( O => O -- 1-bit output: Pullup output (connect directly to top-level port) ); Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 марта, 2017 Опубликовано 17 марта, 2017 · Жалоба К сожалению не совсем понял Вас... я бы писал драйвер I2C который выдает на выход 1 и 0, а не 0 и Z. Потом уже в топовом модуле я бы 1 и 0 развел бы на внешнюю ногу правильно. А симулил работу именно драйвера, объединяя их выходы по И, если надо несколько Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexadmin 0 17 марта, 2017 Опубликовано 17 марта, 2017 · Жалоба Хочу задать наводящий вопрос: коллеги, вы в курсе что I2C и I2S - разные интерфейсы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flip-fl0p 4 17 марта, 2017 Опубликовано 17 марта, 2017 · Жалоба Хочу задать наводящий вопрос: коллеги, вы в курсе что I2C и I2S - разные интерфейсы? Теперь в курсе :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться