Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: altera max2 - как управлять подтягивающим резстором?
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
yantux
Есть altera max2, которая подключена к ПЗС матрице, при чём подтягивающий резистор уже есть на плате. Т.е. предполагается, сто внутренний подтягивающий резистор altera max2 я использовать не должен.

Если я правильно понял по даташиту и i2c, я должен в max2 управлять подтягивающим резистором, чтобы в нужный момент принимать ACK или non-ACK бит от ПЗС? Как на vhdl реализовать управление внутренним подтягивающим резистором в altera max2?
Zwerg_nase
Цитата(yantux @ Jun 12 2012, 23:13) *
Есть altera max2, которая подключена к ПЗС матрице, при чём подтягивающий резистор уже есть на плате. Т.е. предполагается, сто внутренний подтягивающий резистор altera max2 я использовать не должен.

Если я правильно понял по даташиту и i2c, я должен в max2 управлять подтягивающим резистором, чтобы в нужный момент принимать ACK или non-ACK бит от ПЗС? Как на vhdl реализовать управление внутренним подтягивающим резистором в altera max2?


В стандарте на I2C написано: "The transmitter releases the SDA line (HIGH) during the acknowledgeclock pulse.." Т.е. надо не подтягивающим резистором управлять, а переключать пин SDA в третье состояние. В ПЛИСе для этого надо объявить пин SDA, как bidirectional и, когда надо принимать ACK, переключить этот пин на вход, т.е. release the SDA line, а внешний подтягивающий резистор уже подтянет SDA вверх. Кстати, подтягивающий резистор нужен не абы какой, а достаточный для обеспечения требуемой длительности положительного фронта (1000 нс для 100 кГц и 300 нс для 400 кГц). Поэтому внутренний подтягивающий резистор мах2 для этих целей (5-25 кОм) может оказаться слишком большим для этой цели.
yantux
Цитата(Zwerg_nase @ Jun 13 2012, 11:07) *
В ПЛИСе для этого надо объявить пин SDA, как bidirectional и, когда надо принимать ACK, переключить этот пин на вход, т.е. release the SDA line, а внешний подтягивающий резистор уже подтянет SDA вверх.


В Квартусе он объявлен как bidirectional. Как в программе vhdl изменять режим приём/передача? Надо использовать мегафункцию? Если да, тогда какую? Как то не вериться, что пин будет переключаться автоматически.
sazh
Цитата(yantux @ Jun 13 2012, 20:55) *
В Квартусе он объявлен как bidirectional. Как в программе vhdl изменять режим приём/передача? Надо использовать мегафункцию? Если да, тогда какую? Как то не вериться, что пин будет переключаться автоматически.


Пин объявленный как двунаправленный всегда идет в связке с буфером по z состоянию.
Вам нужно на этом буфере симитировать буфер с открытым стоком, так как на плате у вас есть внешний резистор.
все это есть в любом учебнике.
Код
module opndr
(
input  clk,
input  in_data,
output out_data,
inout  in_out_data
);

reg out_data_rg;

assign in_out_data = (in_data == 1'b0) ? 1'b0 : 1'bz;

always @(posedge clk)
begin
out_data_rg <= in_out_data;
end

assign out_data = out_data_rg;

endmodule

Zwerg_nase
Цитата(yantux @ Jun 13 2012, 21:55) *
В Квартусе он объявлен как bidirectional. Как в программе vhdl изменять режим приём/передача? Надо использовать мегафункцию? Если да, тогда какую? Как то не вериться, что пин будет переключаться автоматически.

Пример на VHDL в атаче.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.