реклама на сайте
подробности

 
 
> Как сделать мост I2C на Xilinx?
syoma
сообщение Apr 6 2014, 10:27
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Народ извините, в VHDL и Verilog ни бум бум, а надо пару строчек кода придумать.

Короче есть шина i2c, назовем ее А, которая одним концом (SCL, SDA) подключена к пинам FPGA, а на других висят несколько периферии - тактовый генератор, датчики температуры и питания. FPGA вроде как мастер.

Но также есть и еще одна I2C шина B, концы которой заведены на эту же FPGA, и которая управляется внешним МК. Помимо самой ФПГА на этой шине тоже висит еще несколько устройств.

В общем для того, чтобы не лепить в ПЛИСине I2C мастер, а потом еще и I2C слейв и как-то эмулировать все это дело, появилось желание просто каким-то образом закоротить SDA и SCL пины этих двух шин через FPGA. Вопрос собственно в бинаправленности SDA.
Т.е. по идее логика должна быть такой, что по умолчанию SDA пины обеих шин в ПЛИС - это входы. На них будет высокий уровень. Если на одном из входов появляется низкий уровень, то другой переключается на выход и тоже начинает генерить ноль.

В общем логика я думаю понятно. Вопрос в том - можно ли такое реализовать малой кровью и как? Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Bad0512
сообщение Apr 6 2014, 12:50
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(syoma @ Apr 6 2014, 17:27) *
Народ извините, в VHDL и Verilog ни бум бум, а надо пару строчек кода придумать.

Короче есть шина i2c, назовем ее А, которая одним концом (SCL, SDA) подключена к пинам FPGA, а на других висят несколько периферии - тактовый генератор, датчики температуры и питания. FPGA вроде как мастер.

Но также есть и еще одна I2C шина B, концы которой заведены на эту же FPGA, и которая управляется внешним МК. Помимо самой ФПГА на этой шине тоже висит еще несколько устройств.

В общем для того, чтобы не лепить в ПЛИСине I2C мастер, а потом еще и I2C слейв и как-то эмулировать все это дело, появилось желание просто каким-то образом закоротить SDA и SCL пины этих двух шин через FPGA. Вопрос собственно в бинаправленности SDA.
Т.е. по идее логика должна быть такой, что по умолчанию SDA пины обеих шин в ПЛИС - это входы. На них будет высокий уровень. Если на одном из входов появляется низкий уровень, то другой переключается на выход и тоже начинает генерить ноль.

В общем логика я думаю понятно. Вопрос в том - можно ли такое реализовать малой кровью и как? Спасибо.

Задачка не такая простая как кажется на первый взгляд. Надо как минимум парсить протокол I2C и переключать tri-state буфера в пинах в соответствии с протоколом. Если делать без парсинга, т.е "по-тупому" - будет deadlock.
Go to the top of the page
 
+Quote Post
Victor®
сообщение Apr 6 2014, 17:37
Сообщение #3


Lazy
******

Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76



Цитата(Bad0512 @ Apr 6 2014, 15:50) *
Задачка не такая простая как кажется на первый взгляд. Надо как минимум парсить протокол I2C и переключать tri-state буфера в пинах в соответствии с протоколом. Если делать без парсинга, т.е "по-тупому" - будет deadlock.


Абсолютно верно.
ТС надо мультимастер. Проще всего IP-core.
На OpenCores.org должно быть их.

2-й вариант (без мультимастеров) - использовать дополнительные пины (по одному на ПЛИС и МК) для
обмена статусом. Линия имеет подтяжку на питание. Если никто обмен не делает линия в 3-м состоянии
Тот кто хочет вылезти на линию смотрит уровень. Если 1 - интерфейс свободен, можно его брать. Мастер
на линию статуса ставит 0 и начинает обмен по И2Ц. Второе устройство не имеет прави вылазить, т.к. 0 на статусной линии.

Как-то так.

Можно упростить если использовать по 2 сигнала на ФПГА и МК.


--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
Go to the top of the page
 
+Quote Post
Bad0512
сообщение Apr 7 2014, 00:37
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650



Цитата(Victor® @ Apr 7 2014, 00:37) *
Абсолютно верно.
ТС надо мультимастер. Проще всего IP-core.
На OpenCores.org должно быть их.

2-й вариант (без мультимастеров) - использовать дополнительные пины (по одному на ПЛИС и МК) для
обмена статусом. Линия имеет подтяжку на питание. Если никто обмен не делает линия в 3-м состоянии
Тот кто хочет вылезти на линию смотрит уровень. Если 1 - интерфейс свободен, можно его брать. Мастер
на линию статуса ставит 0 и начинает обмен по И2Ц. Второе устройство не имеет прави вылазить, т.к. 0 на статусной линии.

Как-то так.

Можно упростить если использовать по 2 сигнала на ФПГА и МК.

Судя по описанию ТС, мастер в итоге у него будет всего один, то есть SCK можно тупо прокинуть от мастера на вторую шину.
Проблема в том, что направление линии SDA меняется в зависимости от чтения-записи и чтения ACK при разных операциях.
Поэтому и надо парсить протокол чтобы в соответствии с этим переключать направление SDA от мастера к вторичной шине и обратно.
В принципе одна стейт-машина, не так уж и сложно, но мозг включить придётся.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Apr 7 2014, 01:02
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Bad0512 @ Apr 7 2014, 04:37) *
Поэтому и надо парсить протокол чтобы в соответствии с этим переключать направление SDA от мастера к вторичной шине и обратно.
В принципе одна стейт-машина, не так уж и сложно, но мозг включить придётся.

Вообще стандартно ситуация разруливается так:
либо дешифрируется адрес и адреса делятся на две зоны. Первая зона адресов относится к одной шине, вторая - к другой. Соотв. переключение и выбор шин определяются адресами...
либо по ответному сигналу. Расширитель интерфейса ждет ответного сигнала, а данные задерживает. И только получив ответный сигнал от абонента шины переключает шину на ввод и передает данные к мастеру. Причем ждать ответный сигнал расширитель должен больше, чем от самого медленного абонента, который находится до расширителя..


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 20:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016