Техника

Микроконтроллеры - логическая "1" от подтягивающего резистора

Добрый день, по закону i2c мастер не имеет право установить порту логическую единицу. Если ведомый немного тормоз, он имеет право придавить порт к земле. Мастер должен в этот момент следить, когда логическая единица появится от подтягивающего резистора на порту.

Вопрос: На момент написание кода (программы) - Какое значение присвоить переменной (двунаправленный порт "inout")

i2c_scl <= 1'bz;
i2c_scl <= 1'bx;
Мастер должен переключать состояние линии тактирования между выходом, установленным в ноль (для формированиия нуля) и входом (для формирования единицы), просто перед тем как сформировать ноль нужно убедиться, что шина отпустилась (что слэйв её не удерживает) и всё.
Вот здесь есть ассемблерные процедуры для реализации i2c на микроконтроллере, смотри:
http://radiohlam.ru/i2c_proc_avr/
Дмитрий Муромов
Дмитрий Муромов
6 836
Лучший ответ
Темирлан Апасканов За ссылку спасибо.
Что вы так привязались к этой логической последовательности? Я не это спрашивал.
Да кто ж его знает, что ты там колхозишь, и чего там надо присваивать...

Вообще то в случае тугодумности слэйв притягивает линию сцл к земле, а не какой то там "порт"
Аля Гурина
Аля Гурина
74 058
Kubanych Nurmamatov По-уму конечно правильней переключаться между выходным 0 и hi-Z
Вопрос вообще не ясен.

Как именно у тебя в схеме происходит активация линии - записью лог 0 или 1 в порт - никому, кроме тебя не известно. Даже неизвестно, что у тебя за контроллер и как ты в своей схеме реализуешь I2C.

В реализации I2C нет портов. Отличие от стандартных двухтактынх транзисторных логических выходов (push-pull) выходных каскажов состоит в том, что каждая линия может в один и тот же момент времени стать как входами для всех устройств (с технической точки зрения это не старшно), так и выходами (а это чравато там, что если одно устройство с push-pull выдаёт "0", а второе "1", то источник питания будет замкнут через соотвтетствующие транзисторы выходного каскада и сгорят). Поэтому там применяются выходы с открытым коллетором, который может только притянуть линию к земле (установить "0"), а в пассивном состоянии на линии атвоматически устанавливается "1" подтягивающим резистором. Даже если обы выхода будут нулями, то ток через эти транзисторы понятно не потечёт.

Что за программу ты пишешь, на каком языке, на какой момент времени ты спрашиваешь, для кого - мастери или слейва - не ясно. Любая линия в любой момент может быть либо активна, когда она активно притягивается к земле (всегда будет 0, смысла её считывать в этот момент нет), либо когда её не трогают (тогда её и считывают, т. к. если другое устройство не притягивает, то будет уровень лог. "1", либо же "0", если другое устройство притягивает).

Советую не колхозить самому I2C библиотеки, а взять готовую и проверенную ДЛЯ КАЖДОГО КОНТКРЕТНОГО КОНТРОЛЛЕРА (желательно от производителя) либо переписать логику работы на нужный язык, т. к. тут может быть много подводных камней, которые не очевидны, и ты потом потратишь много часов выясняя, почему первое чило считывается правильно, а второе - нет, или почему оно время от времени ни с того ни с сего начинает глючить.
Темирлан Апасканов Спасибо что более грамотно описали мой вопрос. Ни гугл, ни я, ни квартус не знаем что искать. Готовых кодов практически нет, что находил - в поверке на железе оказывалось бредятеной, либо сходу компилятор квартуса ругается, что будет внутрисхемное КЗ.

Если поможет: язык программирования Verilog. Контроллер MAX II (CPLD Altera)
Темирлан Апасканов https://marsohod.org/forum/yazyki-programmirovaniya/4748-interfejs-i2c

пол года уже висит вопрос на профильном форуме, видать все плохо.