|
Как сделать мост I2C на Xilinx? |
|
|
|
Apr 6 2014, 10:27
|
Профессионал
    
Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368

|
Народ извините, в VHDL и Verilog ни бум бум, а надо пару строчек кода придумать.
Короче есть шина i2c, назовем ее А, которая одним концом (SCL, SDA) подключена к пинам FPGA, а на других висят несколько периферии - тактовый генератор, датчики температуры и питания. FPGA вроде как мастер.
Но также есть и еще одна I2C шина B, концы которой заведены на эту же FPGA, и которая управляется внешним МК. Помимо самой ФПГА на этой шине тоже висит еще несколько устройств.
В общем для того, чтобы не лепить в ПЛИСине I2C мастер, а потом еще и I2C слейв и как-то эмулировать все это дело, появилось желание просто каким-то образом закоротить SDA и SCL пины этих двух шин через FPGA. Вопрос собственно в бинаправленности SDA. Т.е. по идее логика должна быть такой, что по умолчанию SDA пины обеих шин в ПЛИС - это входы. На них будет высокий уровень. Если на одном из входов появляется низкий уровень, то другой переключается на выход и тоже начинает генерить ноль.
В общем логика я думаю понятно. Вопрос в том - можно ли такое реализовать малой кровью и как? Спасибо.
|
|
|
|
|
 |
Ответов
|
Apr 6 2014, 12:50
|
Знающий
   
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Apr 6 2014, 17:37
|

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
|
|
|
|
|
Apr 7 2014, 00:37
|
Знающий
   
Группа: Свой
Сообщений: 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 от мастера к вторичной шине и обратно. В принципе одна стейт-машина, не так уж и сложно, но мозг включить придётся.
|
|
|
|
|
Apr 7 2014, 01:02
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(Bad0512 @ Apr 7 2014, 04:37)  Поэтому и надо парсить протокол чтобы в соответствии с этим переключать направление SDA от мастера к вторичной шине и обратно. В принципе одна стейт-машина, не так уж и сложно, но мозг включить придётся. Вообще стандартно ситуация разруливается так: либо дешифрируется адрес и адреса делятся на две зоны. Первая зона адресов относится к одной шине, вторая - к другой. Соотв. переключение и выбор шин определяются адресами... либо по ответному сигналу. Расширитель интерфейса ждет ответного сигнала, а данные задерживает. И только получив ответный сигнал от абонента шины переключает шину на ввод и передает данные к мастеру. Причем ждать ответный сигнал расширитель должен больше, чем от самого медленного абонента, который находится до расширителя..
--------------------
www.iosifk.narod.ru
|
|
|
|
Сообщений в этой теме
syoma Как сделать мост I2C на Xilinx? Apr 6 2014, 10:27 Maverick Цитата(syoma @ Apr 6 2014, 13:27) Народ и... Apr 6 2014, 10:53 ZASADA в свое время распаралеливал шину I2C, ничего сложн... Apr 6 2014, 16:25 andreichk http://www.fpga4fun.com/I2C.html
проверено на связ... Apr 6 2014, 17:49 alexadmin Что-то, мэтры, вы перемудрили. У автора совершенно... Apr 7 2014, 04:02 Bad0512 Цитата(alexadmin @ Apr 7 2014, 11:02) Что... Apr 7 2014, 06:37 syoma Я так подозреваю, что мне пытаются сказать, что в ... Apr 7 2014, 06:38 svss Любопытная тема. Есть всё:Цитата- Короче есть... Dec 8 2014, 07:16 egorman44 Если у Вас есть тактовая достаточно большая что-бы... Dec 8 2014, 08:12
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|