|
Мультиплексирование I2C шины, Внешняя + внутренний core на обшие выходы |
|
|
|
Nov 28 2008, 08:29
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Есть определенное устройство куда подается I2C со внешнего мастера для загрузки setupa в "приемник в данном устройстве. В устройстве есть FPGA в котором помимо всего прочего будет I2C master core, который тоже должен иметь возможность загружать "приемник". Внешние SDA, SCL подключены к FPGA и коммутируются на выходные (из FPGA) SDA_FPGA, SCL_FPGA. Идея коммутации в том что когда устройство подключено к внешнему "драйверу", I2C идет от него, проходит через FPGA и выходит на SDA_FPGA, SCL_FPGA которые в свою очередь идут на "приемник". Когда-же устройство работает в stand-alone режиме - SDA_FPGA, SCL_FPGA драйвятся внутренним I2C master coreом. Вопрос: как правильно определить SDA_FPGA, SCL_FPGA ? По идее, согласно I2C - они оба - open drain, соотв. должны иметь pull-ups. Но I/O FPGA с которым работаю не имеют open-drain настройки (есть pull-up/down, keep, none). SDA ессно inout, но как определить пины ?
Какой совет ?
Спасибо.
|
|
|
|
|
Nov 28 2008, 08:41
|
Местный
  
Группа: Свой
Сообщений: 224
Регистрация: 22-06-04
Из: Новосибирск
Пользователь №: 87

|
Цитата(Саша Z @ Nov 28 2008, 12:29)  Есть определенное устройство куда подается I2C со внешнего мастера для загрузки setupa в "приемник в данном устройстве. В устройстве есть FPGA в котором помимо всего прочего будет I2C master core, который тоже должен иметь возможность загружать "приемник". Внешние SDA, SCL подключены к FPGA и коммутируются на выходные (из FPGA) SDA_FPGA, SCL_FPGA. Идея коммутации в том что когда устройство подключено к внешнему "драйверу", I2C идет от него, проходит через FPGA и выходит на SDA_FPGA, SCL_FPGA которые в свою очередь идут на "приемник". Когда-же устройство работает в stand-alone режиме - SDA_FPGA, SCL_FPGA драйвятся внутренним I2C master coreом. Вопрос: как правильно определить SDA_FPGA, SCL_FPGA ? По идее, согласно I2C - они оба - open drain, соотв. должны иметь pull-ups. Но I/O FPGA с которым работаю не имеют open-drain настройки (есть pull-up/down, keep, none). SDA ессно inout, но как определить пины ?
Какой совет ?
Спасибо. Такой настройки и не надо, что есть open drain - на выход выдается либо '0' либо третье состояние т.е. 'Z'. Реализуется это через логику и использование разрешение выхода I/O FPGA. Когда выходной сигнал '0' то разрешается выход и выдается '0', а когда '1' выход запрещается.
|
|
|
|
|
Nov 29 2008, 15:28
|
Знающий
   
Группа: Свой
Сообщений: 552
Регистрация: 29-02-08
Пользователь №: 35 481

|
Цитата(Саша Z @ Nov 28 2008, 11:29)  Есть определенное устройство куда подается I2C со внешнего мастера для загрузки setupa в "приемник в данном устройстве. В устройстве есть FPGA в котором помимо всего прочего будет I2C master core, который тоже должен иметь возможность загружать "приемник". Внешние SDA, SCL подключены к FPGA и коммутируются на выходные (из FPGA) SDA_FPGA, SCL_FPGA. Идея коммутации в том что когда устройство подключено к внешнему "драйверу", I2C идет от него, проходит через FPGA и выходит на SDA_FPGA, SCL_FPGA которые в свою очередь идут на "приемник". Когда-же устройство работает в stand-alone режиме - SDA_FPGA, SCL_FPGA драйвятся внутренним I2C master coreом. Вопрос: как правильно определить SDA_FPGA, SCL_FPGA ? По идее, согласно I2C - они оба - open drain, соотв. должны иметь pull-ups. Но I/O FPGA с которым работаю не имеют open-drain настройки (есть pull-up/down, keep, none). SDA ессно inout, но как определить пины ?
Какой совет ?
Спасибо. Для начала. Протянуть I2C шину через плисину насквозь у вас не получится. Она защелкнется. Посмотрите на микруху PCA9515. Она предназначена для усиления сигналов шины. В ней предприняты специальные меры, чтобы она не защелкивалась. Поэтому, коммутировать шину, нужно воспользоваться внешним мультиплексором. Мы, например, использовали SN74CBTLV3257D.
|
|
|
|
|
Nov 29 2008, 15:51
|

Частый гость
 
Группа: Свой
Сообщений: 180
Регистрация: 17-05-05
Из: Санкт-Петербург
Пользователь №: 5 128

|
Цитата(Саша Z @ Nov 29 2008, 17:56)  Это вроде означает что в HDL коде нужно мониторить протокол и переключать их направления синхронно ? Т.е. получается нечто типа ретранслятора I2C ? Выходит что так. Но и тут наверное косяки могут быть....
|
|
|
|
|
Nov 29 2008, 16:05
|

Частый гость
 
Группа: Свой
Сообщений: 180
Регистрация: 17-05-05
Из: Санкт-Петербург
Пользователь №: 5 128

|
Цитата(sazh @ Nov 29 2008, 19:00)  Я не въехал. Начните с простого. Реализации двунаправленной шины. Это буфер по Z состоянию и пин bidir. Причем тут синxронизация по переключению. Буфером комбинаторной логикой управляют (по чтению). А если это двунаправленная шина с открытым коллектором, состояние 0 и Z, подтянутое внешним резистором. Ноль всех перетянет. Оперируйте кучей шинников с открытым коллектором. Ве должно получиться. Посмотрите реализацию такого буфера. sn74abte16246 Незя вроде в лоб сделать транзитом через FPGA двунаправленную шину... Всегда нужно знать в каком направлении идет передача.
|
|
|
|
|
Nov 29 2008, 17:55
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Цитата(Sergei_Ilchenko @ Nov 29 2008, 19:05)  Незя вроде в лоб сделать транзитом через FPGA двунаправленную шину... Всегда нужно знать в каком направлении идет передача. Вот съимитировал буфер abte16246. inout - имитация открытого стока. Пока не анализировал. Но направления передачи тут явно нет. Входы выходы тут конечно не open_dr. Но и незачем. Объединять по двунаправленной шине. (Чем не транзит). Передавать туда обратно по входам выходам. В любом случае предложены были переключатели да мультиплексоры. Код module open_dr_bidir #( parameter width = 1 ) ( input oe_n, inout [width-1:0] data_a, input [width-1:0] data_bi, output [width-1:0] data_bo );
genvar i; generate for (i = 0; i < width; i = i + 1) begin : block assign data_bo[i] = (oe_n == 1'b0) ? data_a[i] : 1'bz, data_a[i] = ((data_bi[i] == 1'b0) && (oe_n == 1'b0)) ? 1'b0 : 1'bz; end endgenerate
endmodule
|
|
|
|
|
Nov 30 2008, 18:49
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(sazh @ Nov 29 2008, 21:55)  Вот съимитировал буфер abte16246. inout - имитация открытого стока. Пока не анализировал. Но направления передачи тут явно нет. Входы выходы тут конечно не open_dr. Но и незачем. Объединять по двунаправленной шине. (Чем не транзит). Передавать туда обратно по входам выходам. В любом случае предложены были переключатели да мультиплексоры. Код module open_dr_bidir #( parameter width = 1 ) ( input oe_n, inout [width-1:0] data_a, input [width-1:0] data_bi, output [width-1:0] data_bo );
genvar i; generate for (i = 0; i < width; i = i + 1) begin : block assign data_bo[i] = (oe_n == 1'b0) ? data_a[i] : 1'bz, data_a[i] = ((data_bi[i] == 1'b0) && (oe_n == 1'b0)) ? 1'b0 : 1'bz; end endgenerate
endmodule Сорри, я сижу на VHDLe, очень мало знаком с Верилогом. Можно то что вы хотели сказать выразить VHDLем ?
|
|
|
|
|
Dec 1 2008, 14:27
|
Гуру
     
Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804

|
Цитата(Саша Z @ Nov 30 2008, 21:49)  Сорри, я сижу на VHDLe, очень мало знаком с Верилогом. Можно то что вы хотели сказать выразить VHDLем ? Сорри, на VHDL не могу. На типизации загнусь. У Вас же есть rtl просмотрщик. Да и в тексте все просто. А на последок я скажу. Если в fpga есть модуль, который может быть то мастером, то подчиненным, и все управление на нем, по идее внешних буферов не надо. Хотя как это моделировать - черт его знает. Код module open_dr_scl ( inout scl_i2c, input clk_fpga, input stop_clk_fpga, input [3:0] data_in, output reg [3:0] data_out );
reg [3:0] ct;
always @(posedge clk_fpga) begin if (stop_clk_fpga) ct <= 4'hf; else ct <= ct + 1'b1; end
assign scl_i2c = (ct[3] == 1'b0) ? 1'b0 : 1'bz;
always @(posedge scl_i2c) begin data_out <= data_in; end
endmodule
|
|
|
|
|
Dec 2 2008, 20:39
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(XVR @ Dec 2 2008, 18:37)  У него уже есть арбитраж (вообще вне МК), т.к. он собрался коммутировать I2C шину от 2х мастеров через FPGA. Если моменты неактивности мастера в МК известны, и мастер в FPGA будет использовать только их, то на I2C шину можно прямо повесить оба мастера в параллель (Если только у МК нету параллельно включенного слейва, но это уже извращение  ) Возможно я не совсем точно задал вопрос, но дилемма была как раз не о multi-masterности (ибо оба мастера могут работать заведомо только раздельно, т.е. в разделчные промежутки времени что всегда заранее известно - этот факт был правилчьноподмечен в ветке). Дилемма была в ситуации когда работает внешний мастер (коммутация - в FPGA). Проблема возникает в линии SDA когда должен быть "переворот" направлений (например acknowledge после передачи адреса/данных). Понятно что в коде оба SDA - вход и SDA - выход определены как tri-state, но "переворот" направления не может быть "автоматическим",т.е. кто-то в коде должен отслеживать traffic и управлять направлениями сквозной SDA линии...
|
|
|
|
|
Dec 3 2008, 06:53
|

Частый гость
 
Группа: Свой
Сообщений: 180
Регистрация: 17-05-05
Из: Санкт-Петербург
Пользователь №: 5 128

|
Цитата(Саша Z @ Dec 2 2008, 23:39)  Дилемма была в ситуации когда работает внешний мастер (коммутация - в FPGA). Проблема возникает в линии SDA когда должен быть "переворот" направлений (например acknowledge после передачи адреса/данных). Понятно что в коде оба SDA - вход и SDA - выход определены как tri-state, но "переворот" направления не может быть "автоматическим",т.е. кто-то в коде должен отслеживать traffic и управлять направлениями сквозной SDA линии... На заметку  Линия SCK тоже двунаправленная... Цитата(XVR @ Dec 3 2008, 00:34)  Не надо ничего никуда переворачивать. И I2C сквозь FPGA пропускать не надо. Нужно сделать в FPGA банальный I2C мастер и его ноги SDA и SCL включить параллельно мастеру в МК и приемнику. +1
|
|
|
|
|
Dec 3 2008, 12:29
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(XVR @ Dec 3 2008, 01:34)  Не надо ничего никуда переворачивать. И I2C сквозь FPGA пропускать не надо. Нужно сделать в FPGA банальный I2C мастер и его ноги SDA и SCL включить параллельно мастеру в МК и приемнику. Да, точно, ежели стандард поддерживает multi-masterность - действительно должно быть просто... Одно понять - pull-upы. Внешняя система в принципе автономна, у нее есть свои I2C "приемники", т.е. свои pull-ups. Когда-же я к ней подключаю свой "аппаратус" то у него стоят свои pull-ups (ибо он может и в stand-alone работать). Получается при подключении моего устройства к системе, будут по 2 pull-upа запараллелены. Это может и не проблема если pull-upы могут быть в range (например от 1к до 10к). Но ежели нужен более точная их величина - тогда по идее может понадобится их коммутация. Хотя и это решаемо (FETный ключ как функция от сигнала режима работы).
|
|
|
|
|
Dec 3 2008, 13:44
|
Знающий
   
Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822

|
Цитата(Sergei_Ilchenko @ Dec 3 2008, 16:34)  Какое у Вас Vcc? Скорость обмена у Вас какая? Какие длины линий? В самой системе линии короткие, но когда подключается мое устройство - длины будут примерно 15-20 см. Скорости - не думаю что будет более чем стандартные 400кHz, Vcc = 3.3V
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|