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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Мультиплексирование I2C шины, Внешняя + внутренний core на обшие выходы
Саша Z
сообщение Nov 28 2008, 08:29
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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, но как определить пины ?

Какой совет ?

Спасибо.
Go to the top of the page
 
+Quote Post
Apast
сообщение Nov 28 2008, 08:41
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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' выход запрещается.
Go to the top of the page
 
+Quote Post
sazh
сообщение Nov 28 2008, 08:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(Саша Z @ Nov 28 2008, 11:29) *
По идее, согласно I2C - они оба - open drain, соотв. должны иметь pull-ups. Но I/O FPGA с которым работаю не имеют open-drain настройки
Какой совет ?


Можно имитировать open drain на буфере с z состоянием. Резисторы внешние.
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Nov 29 2008, 14:56
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Да, спасибо, понятно.
Что все еще смущает: линия SDA.
Есть SDA вход в FPGA (от внешнего мастера) и выход из FPGA (назовем его SDA_FPGA) который идет на конечный "приемник".
Т.е. SDA_FPGA коммутируется внутри FPGA - либо "закорачивает" на SDA либо выводит SDA от внутреннего мастера.
Что туго представляю это режим passthrough, т.е. когда работает внешний мастер и SDA_FPGA должен просто проводить наружу входной SDA.
Оба, SDA и SDA_FPGA - inout и иммитируют open-drain. Но как арбитровать их направления согласно протоколу I2C ?
Т.е. когда SDA работает на передачу, тогда будет SDA - вход, SDA_FPGA - выход. Когда-же SDA ожидает приема - они меняются ролями, т.е. SDA становится выходом, SDA_FPGA - входом.
Это вроде означает что в HDL коде нужно мониторить протокол и переключать их направления синхронно ? Т.е. получается нечто типа ретранслятора I2C ?
Go to the top of the page
 
+Quote Post
Михаил_K
сообщение Nov 29 2008, 15:28
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Sergei_Ilchenko
сообщение Nov 29 2008, 15:51
Сообщение #6


Частый гость
**

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



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


Выходит что так. Но и тут наверное косяки могут быть....
Go to the top of the page
 
+Quote Post
sazh
сообщение Nov 29 2008, 16:00
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



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


Я не въехал. Начните с простого. Реализации двунаправленной шины. Это буфер по Z состоянию и пин bidir. Причем тут синxронизация по переключению. Буфером комбинаторной логикой управляют (по чтению). А если это двунаправленная шина с открытым коллектором, состояние 0 и Z, подтянутое внешним резистором. Ноль всех перетянет.
Оперируйте кучей шинников с открытым коллектором. Ве должно получиться.
Посмотрите реализацию такого буфера. sn74abte16246
Go to the top of the page
 
+Quote Post
Sergei_Ilchenko
сообщение Nov 29 2008, 16:05
Сообщение #8


Частый гость
**

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



Цитата(sazh @ Nov 29 2008, 19:00) *
Я не въехал. Начните с простого. Реализации двунаправленной шины. Это буфер по Z состоянию и пин bidir. Причем тут синxронизация по переключению. Буфером комбинаторной логикой управляют (по чтению). А если это двунаправленная шина с открытым коллектором, состояние 0 и Z, подтянутое внешним резистором. Ноль всех перетянет.
Оперируйте кучей шинников с открытым коллектором. Ве должно получиться.
Посмотрите реализацию такого буфера. sn74abte16246



Незя вроде в лоб сделать транзитом через FPGA двунаправленную шину... Всегда нужно знать в каком направлении идет передача.
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Nov 29 2008, 16:17
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(Sergei_Ilchenko @ Nov 29 2008, 20:05) *
Незя вроде в лоб сделать транзитом через FPGA двунаправленную щину... Всегда нужно знать в каком направлении идет передача.


Да, именно об этом и речь
Go to the top of the page
 
+Quote Post
sazh
сообщение Nov 29 2008, 17:55
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Nov 30 2008, 18:49
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 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ем ?
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 1 2008, 11:46
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(sazh @ Nov 29 2008, 20:55) *
Вот съимитировал буфер abte16246. inout - имитация открытого стока. Пока не анализировал.
Но направления передачи тут явно нет.
Да ну, а вывод oe_n - это что?



Топикстартеру - а если просто запараллелить обе I2C шины? I2C поддерживает multimaster.
Go to the top of the page
 
+Quote Post
sazh
сообщение Dec 1 2008, 13:00
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(XVR @ Dec 1 2008, 14:46) *
Да ну, а вывод oe_n - это что?


А ничего. Можете убрать.
Go to the top of the page
 
+Quote Post
sazh
сообщение Dec 1 2008, 14:27
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 1 2008, 19:37
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(sazh @ Dec 1 2008, 16:00) *
А ничего. Можете убрать.
Тогда не будет работать. Посмотрите на I2C трансляторы, у них внутри вообще аналоговые схемы crying.gif
Go to the top of the page
 
+Quote Post
Михаил_K
сообщение Dec 2 2008, 12:38
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 552
Регистрация: 29-02-08
Пользователь №: 35 481



Цитата(XVR @ Dec 1 2008, 14:46) *
Топикстартеру - а если просто запараллелить обе I2C шины? I2C поддерживает multimaster.


Отвечу за топикстартера. smile.gif
Самопальный мастер, который часто приходится реализовывать на FPGA или микроконтроллере для одномастерной шины реализуется очень просто. Можно сказать - халявно. А вот многомастерный - это уже арбитраж вводить нужно.
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 2 2008, 14:37
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Михаил_K @ Dec 2 2008, 15:38) *
Отвечу за топикстартера. smile.gif
Самопальный мастер, который часто приходится реализовывать на FPGA или микроконтроллере для одномастерной шины реализуется очень просто. Можно сказать - халявно. А вот многомастерный - это уже арбитраж вводить нужно.
У него уже есть арбитраж (вообще вне МК), т.к. он собрался коммутировать I2C шину от 2х мастеров через FPGA. Если моменты неактивности мастера в МК известны, и мастер в FPGA будет использовать только их, то на I2C шину можно прямо повесить оба мастера в параллель (Если только у МК нету параллельно включенного слейва, но это уже извращение smile.gif )
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Dec 2 2008, 20:39
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(XVR @ Dec 2 2008, 18:37) *
У него уже есть арбитраж (вообще вне МК), т.к. он собрался коммутировать I2C шину от 2х мастеров через FPGA. Если моменты неактивности мастера в МК известны, и мастер в FPGA будет использовать только их, то на I2C шину можно прямо повесить оба мастера в параллель (Если только у МК нету параллельно включенного слейва, но это уже извращение smile.gif )


Возможно я не совсем точно задал вопрос, но дилемма была как раз не о multi-masterности (ибо оба мастера могут работать заведомо только раздельно, т.е. в разделчные промежутки времени что всегда заранее известно - этот факт был правилчьноподмечен в ветке).
Дилемма была в ситуации когда работает внешний мастер (коммутация - в FPGA). Проблема возникает в линии SDA когда должен быть "переворот" направлений (например acknowledge после передачи адреса/данных). Понятно что в коде оба SDA - вход и SDA - выход определены как tri-state, но "переворот" направления не может быть "автоматическим",т.е. кто-то в коде должен отслеживать traffic и управлять направлениями сквозной SDA линии...
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 2 2008, 21:34
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Саша Z @ Dec 2 2008, 23:39) *
Возможно я не совсем точно задал вопрос, но дилемма была как раз не о multi-masterности (ибо оба мастера могут работать заведомо только раздельно, т.е. в разделчные промежутки времени что всегда заранее известно - этот факт был правилчьноподмечен в ветке).
Дилемма была в ситуации когда работает внешний мастер (коммутация - в FPGA). Проблема возникает в линии SDA когда должен быть "переворот" направлений (например acknowledge после передачи адреса/данных). Понятно что в коде оба SDA - вход и SDA - выход определены как tri-state, но "переворот" направления не может быть "автоматическим",т.е. кто-то в коде должен отслеживать traffic и управлять направлениями сквозной SDA линии...
Не надо ничего никуда переворачивать. И I2C сквозь FPGA пропускать не надо. Нужно сделать в FPGA банальный I2C мастер и его ноги SDA и SCL включить параллельно мастеру в МК и приемнику.
Go to the top of the page
 
+Quote Post
Sergei_Ilchenko
сообщение Dec 3 2008, 06:53
Сообщение #20


Частый гость
**

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



Цитата(Саша Z @ Dec 2 2008, 23:39) *
Дилемма была в ситуации когда работает внешний мастер (коммутация - в FPGA). Проблема возникает в линии SDA когда должен быть "переворот" направлений (например acknowledge после передачи адреса/данных). Понятно что в коде оба SDA - вход и SDA - выход определены как tri-state, но "переворот" направления не может быть "автоматическим",т.е. кто-то в коде должен отслеживать traffic и управлять направлениями сквозной SDA линии...


На заметку wink.gif

Линия SCK тоже двунаправленная...

Цитата(XVR @ Dec 3 2008, 00:34) *
Не надо ничего никуда переворачивать. И I2C сквозь FPGA пропускать не надо. Нужно сделать в FPGA банальный I2C мастер и его ноги SDA и SCL включить параллельно мастеру в МК и приемнику.


+1
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Dec 3 2008, 12:29
Сообщение #21


Знающий
****

Группа: Свой
Сообщений: 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ный ключ как функция от сигнала режима работы).
Go to the top of the page
 
+Quote Post
Sergei_Ilchenko
сообщение Dec 3 2008, 12:34
Сообщение #22


Частый гость
**

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



Какое у Вас Vcc?
Скорость обмена у Вас какая?
Какие длины линий?
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Dec 3 2008, 13:44
Сообщение #23


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(Sergei_Ilchenko @ Dec 3 2008, 16:34) *
Какое у Вас Vcc?
Скорость обмена у Вас какая?
Какие длины линий?


В самой системе линии короткие, но когда подключается мое устройство - длины будут примерно 15-20 см.
Скорости - не думаю что будет более чем стандартные 400кHz, Vcc = 3.3V
Go to the top of the page
 
+Quote Post

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

 


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


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