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

 
 
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

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 03:06
Рейтинг@Mail.ru


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