Шина управления I2C
Шина управления I2CРады приветствовать Вас!
К Вашим услугам - качественный товар различных ценовых категорий.
Качественная поддержка 24 часа в сутки!
Мы ответим на любой ваш вопрос и подскажем в выборе товара и района!
Наши контакты:
Telegram:
ВНИМАНИЕ!!! В Телеграмм переходить только по ссылке, в поиске много Фейков!
Внимание! Роскомнадзор заблокировал Telegram ! Как обойти блокировку:
http://telegra.ph/Kak-obojti-blokirovku-Telegram-04-13-15
Один из моих самых любимых интерфейсов. Разработан в компании Philips и право на его использование стоит денег, но все на это дружно положили и пользуют в свое удовольствие, называя только по другому. В Atmel его зовут TWI , но от этого ничего не меняется: Да еще юзают софтверный Master. Не дождетесь, у меня будет подробный разбор работы этой шины как в режиме Master так и Slave, да еще на аппаратных блоках с полным выполнением всей структуры конечного автомата протокола. Но об этом после, а сейчас основы. Данные передаются по двум проводам — провод данных и провод тактов. Есть ведущий master и ведомый slave , такты генерирует master, ведомый лишь поддакивает при приеме байта. Всего на одной двупроводной шине может быть до устройств. Их ставить обязательно всегда! Резисторы на 10к оптимальны. Чем больше резистор, тем дольше линия восстанавливается в единицу идет перезаряд паразитной емкости между проводами и тем сильней заваливаются фронты импульсов, а значит скорость передачи падает. Но в реальности можно плавно менять скорость вплоть до нуля. Можно запросто словить КЗ и пожечь либо контроллер либо какой-нибудь девайс на шине. Мало ли кто там линию придавит. Вся передача данных состоит из Стартовой посылки , битов и стоповой посылки. Порядок изменения уровня на шинах задает тип посылки. После старта передача одного бита данных идет по тактовому импульсу. Таким образом, у нас протокол совершенно не зависит от временных интервалов , только от тактовых битов. Поэтому шину I 2 C очень легко отлаживать — если что то не так, то достаточно снизить скорость до байта в минуту и спокойно, обычными вольтметрами, смотреть что у нас происходит. Правда это не прокатит с железным I 2 C , там нет таких низких скоростей. Но что нам мешает затактовать микроконтроллер от ОЧЕНЬ медленного тактового генератора и отладить все по шагам? Которые ведомый считывает когда SCL становится 1. Заканчивается все STOP последовательностью. То есть, изменение на шине данных в момент приема данных может быть только при низком уровне на SCL. Когда SCL вверху то идет чтение. Мастер должен это понять и дать слейву прожевать байт. Так что нельзя тупо генерить такты, при отпускании SCL надо следить за тем, что линия поднялась. Если не поднялась, то надо остановиться и ждать до тех пор, пока Slave ее не отпустит. Потом продолжить с того же места. Логический уровень Как передаются отдельные биты понятно, теперь о том что эти биты значат. В отличии от SPI тут умная адресная структура. Данные шлются пакетами, каждый пакет состоит из девяти бит. Первый пакет шлется от ведущего к ведомому это физический адрес устройства и бит направления. Сам адрес состоит из семи бит вот почему до устройств на шине , а восьмой бит означает что будет делать Slave на следующем байте — принимать или передавать данные. Девятым битом идет бит подтверждения ACK. Мастер, заметя это, понимает, что все идет по плану и можно продолжать. Если Slave не обнаружился, прозевал адрес, неправильно принял байт, сгорел или еще что с ним случилось, то, соответственно, SDA на девятом такте будет прижать некому и ACK не получится. Мастер с горя хлопнет водки и прекратит свои попытки до лучших времен. После адресного пакета идут пакеты с данными в ту или другую сторону, в зависимости от бита RW в заголовочном пакете. В квадратиках идут номера битов. Чтение практически также, но тут есть одна тонкость из-за которой я когда то убил кучу времени. При приеме последнего байта надо дать ведомому понять, что в его услугах больше не нуждаемся и отослать NACK на последнем байте. Если отослать ACK то после стопа Master не отпустит линию — такой уж там конечный автомат. Есть еще одно состояние, как повторный старт. После него мы можем обратиться к другому устройству не освобождая шину. Но чаще идет обращение к тому же самому устройству и это связано с особенностями организации памяти. Но встречается это повсеместно, поэтому я расскажу про этот момент. Но, повторюсь, это не аксиома, не стандарт и вообще зависит от конкретного Slave устройства. Так что датит в зубы и вкуривать, но обычно так принято. Итак, о чем речь. Как видно из протокола, в первом байте мы адресовываем само устройство , а их может быть до штук. Но в самом устройстве вполне может быть очень сложная структура, с кучей ячеек. Как обращаться с этими данными? Не считывать же все по очереди от нуля до конца — это долго. Поэтому приняли хитрый формат. Это не стандарт, но юзается повсеместно. Внутри нее ячейки памяти, в которых хранятся часы, минуты, секунды, дата, состояние флагов и куча еще всего. До кучи там еще байт просто так, для свободного пользования. Карта адресов этой микросхемы выглядит так: И вот надо мне установить дату. Для этого надо мне записать две ячейки памяти с адресами 0х05 и 0x Из даташита я узнаю, что первый байт данных это адрес куда мы будем обращаться, а потом уже идут данные и со следующим байтом счетчик адреса увеличивается на 1. Там же, в даташите, написано что эти часы откликаются на Slave-адрес х где х — состояние ноги А0 микросхемы. Я эту ногу сразу посадил на 0 так что Slave-адрес у меня Очевидно, что на одной шине может быть не более двух экземпляров этой микросхемы с адресами и Часы установлены и начали тикать. Но вот надо нам считать те же данные, а вдруг изменились? С записью все понятно — записали вначале адрес, а потом следом записали данные. А умная микросхема все прекрасно поняла и рассовала по ячейкам. А с чтением все через задницу, в смысле через запись. То есть, мы, вначале, записываем один байт — адрес. И умная микруха выдает нам байты с адреса который мы в нее вот только что записали. Адрес, например, может быть двухбайтным или страницу надо будет указать, но сути это не меняет. Цепочка запись-повстарт-чтение это повсеместно. Вот так, кстати, выглядит чтение данных из часов PCF на экране моего логического анализатора. Тут не полная посылка все 5 байт просто не влезли в экран , но тут четко видно запись начального адреса, потом повторный старт, и чтение из девайса. Арбитраж шины I 2 C. Почему то все мануалы для начинающих в которых рассматривалась тема протокола IIC как то ссыкливо замалчивают возможность работы двух ведущих на линии. Master-Slave и все тут. А если у нас демократия? И каждый сам себе Master и сам себе Slave? Согласен, редкий случай, но тем не менее, описывать так описывать. Короче, в случае подобного садо-мазо варианта действует железное правило — кто раньше встал того и тапки. В смысле кто первый начал вещать тот и текущий Master. Но вот случилось вообще невероятное — два Ведущих начали вещать одновременно. А тут нам поможет свойство монтажного И — где против лома нуля нет приема. Короче, оба мастера бит за битом играют в простую игру ножик-камень 1 и 0 соответственно. Кто первый выкинет камень против ножика тот и побеждает арбитраж, продолжая вещать дальше. Так что очевидно, что самый важный адрес должен начинаться с нулей, чтобы тот кто к нему пытался обращаться всегда выигрывал арбитраж. Проигравшая же сторона вынуждена ждать пока шина не освободится. Скоро я вас буду этим грузить! Можно обойтись вообще парой десятков строк кода на ассемблере. Полный перевод оригинальной спецификации IIC от суровых Челябинских электронщиков с радиозавода Полет. Я зашёл как blacklion. Пришлось регистрироваться и теперь тут два меня. Более того, многие предпочитают делать софтовый И2С мастер чтобы не заморачиваться с встроенным в TWI конечным автоматом. Я когда первый раз подходил к электронике смотрел на PIC зачем я это делал!? А вот слейва так и не осилил…. D нашел выход, что залогинился, пару минуток подождал и рефреш. Могу поделицца опытом работы конкретно с DS Он, сука, еще тот глючный девайс. Вроде просто, но не все просто. ПРопиши бит СН, запусти часы, не забудь про бит снова, ой а чо горим — а мы забыли Vbat на землю положить…. А у меня 5 штук их лежит — сэмплы. Надо бы в ST гневный мессадж накатать. МОл чо вы за говно нам подсунули? Да, есть такое дело: Вообще при начале работы с IIC девайсом, желательно вдоль и поперек изучить Datasheet к нему. В свое время тоже поломал голову с m41 от ST. Вроде все пишется, все читается, но часы стоят и все тут. Оказалось там есть хитрый битик, который при пропадании всего питания — Vcc и Vbat, останавливает часы и пока его не сбросишь они не пойдут. Ну и еще обычный прикол с часами, что не все могут работать при отключенной батарейке — даже если Vcc есть, внутри у них стоит контроль, который проверяет разницу между напругой и Vbat, и если Vbat нет, то часы просто ни на что не отвечают: Кстати для отлаживания шины если нет крутого осцила, можно прикрутить I2C Sniffer на Atmega8 — оч удобная штука, она в консоли показывает полностью весь обмен в удобоваримом виде. А чё с ним было голову ломать? Кстати, m41t56 рекомендую, простые и удобные I2C часы. Про битик я давно знал — он у всех часовых изделий от ST присутствует. Наверное, как совместимость с m48t08 — который с батареей на борту. Чтобы батарею не сажать, пока таймкипер лежит на складе, они глушат часы. О На самом деле классная тема! А есть последняя диаграмма только в чуть лучшем качестве? А то буквы трудно различить. Разговаривали на эту тему с одним человеком. Он мысль сказал — если на каждую микросхему между ней и линией поставить резисторы по Ом, то в принципе, проблема будет решена. Так же удобно при отладке. Похожее разрешение коллизий используется в CAN… но там всёже гораздо более сложный протокол. Вот здесь вот http: У меня написано 10кбит в медленном и в быстром. А щас еще новая спецификация вышла — там интерфейс разогнали до А я всю жизнь и во всех даташитах видел и как простой и быстырй. Ногу надо передавать по отдельности. PORTB это адрес порта. А 3 — просто номер пина. Так что либо в две переменные либо просто номер пина, а порт уже прописан в функции. Вот только нафига тебе тут функция? Напрямую то нельзя чтоль? Не, напрямую нельзя, нога заранее неизвестна и порт тоже. Интересно, если передать номер порта и ноги раздельно, как их потом лучше всего объединить? Блин, каша в голове только учусь на работу с датчиком ds18b20 как должен быть настроен порт? Начинающим, как и я, обновлять обязательно! Вопрос по передаче номера ноги в процедуру в силе, буду благодарен за пример. Очень полезна статья, вот недавно наткнулся на убитую магнитолу с микросхемой LC аудиопроцессор , так вот там управление осуществлется, как я понял, что-то наподобие I2C как написано в datasheet — serial data input. Как я понял управление осуществляется в одну сторону, то есть только на прием. Вот единственное что я хотел у тебя спросить, возможно ты когда-нибудь сталкивался с подобием такой микрухи, хотел узнать управление происходит только единичной посылкой управления, или возможно как-то по-другому. В datasheet не нашел вразумительного ответа. Конечно вопрос не совсем в тему, но все-таки надеюсь на отклик. Формат данных там написано что 52 бита — 8 адреса и 44 данные. Точнее как, вначале СЕ ложишь вниз, подаешь 8 бит адреса. Потом поднимаешь СЕ вверх и гонишь 44 бита данных. В этих 44 битах закодированы параметры для резисторных матриц. Как переслал СЕ бросаешь вниз и при этом происходит запоминание введенных данных. Как и что слать там нормально написано. Я бы сказал даже очень наглядно нарисовано. На 15й странице даташита. В принципе так и думал, единственное что до сих пор не внушает доверие в datasheet так это то что получается СЕ нужно ложить вниз не на 8 бит адреса, а на 9 или возможно это опечатка , то есть захватывает старший бит данных D0 если верить рисунку осцилограммы. Но конечно судя по логике все-таки скорее правильнее как ты написал — СЕ ложишь вниз, подаешь 8 бит адреса. Тему про часы реального времени посмотри. ТАм правда на ассемблере, но думаю тебя это не остановит ;. Здравствуйте, подскажите как можно организовать контроль I2С шины, если например есть N-ое количество устройств и одно из них придавило линию и например зависло в таком состоянии, есть ли возможность узнать какое программно, а лучше аппаратно отключить его или показать что оно не работает. Со стороны мастера никак. А нет связи — нет мультиков. Ставить на каждое устройство вачдог. Если девайс не сообщил собаке, что он отпустил линию, то собака укусит его за задницу. Вопрос, конечно, может и дурацкий. Будут ли слейвы все слейвы одновременно принимать данные от мастера или есть какие-то подводные камни в этом? I2C мне не подходит из-за ограничения по количеству устройств. Живой язык, яркие рисунки. По моему, в статье есть неточность. Вход же не может притянуть SCL к земле. Но для многих других I2C микрух этот вариант прокатывает. Впервые про то что слейв девайс может не успеть прожевать данные и прижмет линию я услышал именно при описании работы с еепромкой и2с шной. Вы согласны, что вход не может притянуть линию к земле. Смотрите еще Figure 1. Если слейв занят внутренними проблемами, то он просто отключается от шины и не реагирует на мастера. Мастер должен отправить условие старта после адресного слова и ждать ответа. Вот тут на русском: В самом деле, вы правы. Видимо тут такой подход связан с тем, что запись буффера будет очень долгой чтобы на это время нельзя парализовывать работу шины. Помогите пожалуйста с ds Здесь я краем уха слышал по поводу батарейного питания — может у меня в этом проблема??? Вывод Vbat у меня висит в воздухе. Без батарейного питания они не стартанут. Либо будут в каком нибудь энергосберегающем режиме висеть. Батарею подцепи, тогда пойдут. Может еще какой регистр внутри надо будет дергнуть. Но это даташит кури. Сами часики вроде в норме. Проблема с контроллером точнее с программой. В итоге вообще запутался — идет передача данных, а в перерывах шина лежит в нуле. Почему проц может не отпускать шину???? И как тут можно выложить кусок кода? Вот тут меня мучает такой вопрос: TWCR — он же не буферизированный? Я так понимаю — в таком порядке не пройдет: Прав я или где-то запутался??? Но я даже убрал вообще прием — оставил только передачу инициализация. Когда идет прием — тогда поинтересней. А разве в WinAVR такой вариант потянет? Как я понимаю — gcc сильно заточен под стандарты языков, а если данную строку разложить, то получим несуразицу…хотя он компилирует. Нет что-то мне кажется, что так можно еще больше запутаться. Я в принципе догадывался что надо использовать XOR. Зачем — другой вопрос. Хочу отточить навыки и разобраться со всем а лог арифметика сюда также входит и, самое главное, выработать один стиль. Ведь, насколько я знаю, простое присваивание не всегда катит. Нужно следить за всеми регистрами, а для буферизированных — битмаска — что доктор прописал не пинайте асемблерщики. Вот и пытаюсь на одном примере раньше взял очередной модуль, написал прогу и пошел дальше, а тут застрял отточить многие нюансы. Чтобы контроллер отпустил шину он должен выйти из конечного автомата. Единственно что если ты ТВИ вырубишь вообще, то он должен шину отпустить. Ну а дальше резисторы. Но, сам понимаешь, нет смысла спрашивать чаще чем меняется самый младший разряд часов. А вообще я его спрашиваю когда надо получить значение. Зачем зря шину занимать? По поводу первого вопроса: Я отключил все на шине TWI. Перевожу контроллер в режим мастер-передатчик, передаю байт и даю команду СТОП. Контроллер при этом должен в любом случае отпустить шину??? В режиме передатчика это условие является абсолютным??? DI HALT, подскажи пожалуйста, а что будет происходить, если в момент передачи информации возникнет не запрещенное прерывание в ведущем передающем МК? Смотря как реализован мастер. Если аппаратно, то он дошлет текущий байт и выставит нужные уровни сам. Просто передача чуток встрянет на время обработки прерывания. ИИС это же синхронная шина и остановка мастера дает лишь остановку передачи, а не срыв передачи. Регистр TWSR состоит из след. В TWS должен же хранится код статуса, или нет? Обрати внимание, все коды имеют в младшем разряде 0. Это и есть этот зарезервированый бит. Огромное спасибо за популярное объяснение. Читал 2 дня официалку — недопер. Если нет то, какие интерфейсы лучше использовать? Проблема в том что, я думаю что если использовать I2C, то те приборы датчики и т. Если в контроллере чего то нет это всегда можно сделать программно. Хотя I2C Slave программно сделать сложно, но можно. Ну и придется все писать на ассемблере и очень жоско оптимизировать, так как памяти там совсем мало. Есть другие 8ми ножки с большим числом памяти Тини88 с ними будет проще. По твоему совету поискал ATtiny88 в http: А если сделать несколько модулей с подтяжкой на каждом, то будет ли работать система с включеными нескольками модулями? Если подтяжка не сильно мощная, такая что ее вывод контроллера пересилит то без проблем. Прочитал на твоём сайте статью про 1 wire протокол. Самая понятная и доходчивая из тех что я знаю. Сегодня хотел поделиться инфой с другом и не смог найти. Третий час рыскаю по сайту. Помоги, подскажи где она? SDA линия не меняет свой уровень с низкого на высокий а остается постоянной в двух верхних цветных картинках. Там не стоповая последовательность, а просто выход из автомата по NACK и конец передачи. Надо бы по другому обозовать. Подключение, обмен, исходный код для обучения желательно на ассемблере , в общем все так, как ты это делаешь доходчиво и со вкусом. Тут еще погляди, если не видел: Будет сначала сделан Stop, а потом сразу Start — например чтобы постучаться к другому slave. А насчет R резюков в сигнальной шине перед слейвом, де-факто прописано в многих апнотах по iic, тот же STM если посмотреть. И все,вроде бы просто —. А вот если читаю RTC один раз, а отображение в цикле, то все нормуль. Понятное дело, чтение будет по прерыванию, но блин, чего оно не читается в цикле..? Может кто-то сталкивался с такой какой, помогите плиз. Про бит подтверждения А. Как то странно работает, он что инверстно пашет? Читаю сайт как произведение искусства: Что это за ад ваще? Если да, то какого хрена ты в нем в цикле крутишься? Если хочешь в лоб, то возьми мой пример и просмотри как он себя ведет. Вся проблема как раз в том, что програма нормально работает, но в какой-то момент twi перестает выставлять флаг TWINT и все зависает. Не понимаю откуда беерться ошибка 0х00 и зачем он придавливает линию в ноль. И это не зависит от того есть кто на линии или нет. Все и так и так — одно и тоже…: А какого хрена там тогда в конце reti? Если у тебя прерываний нет и ты его не вызывал, то эта строчка сорвет тебе стек. Ну не ругайся Это не прерывание, это вызов, но не в этом суть С этим все ок Меня волнует почему twi зависает и выдает ошибку 00 когда я передаю бит… Причем не всегда. А автомат работает железно. Ты его пнул, он завертелся. По идее он должен отработать и на пустой линии, по крайней мере выдать старт последовательность и получить ответ, что там никого нет. Полковнику никто не пишет и так далее. Бусфейл это серьезная лажа, может конфликт, может емкость или помехи. Прогони на пустой линии без всего вообще. Если нормально будет выходить на старт последовательность, то проблема у тебя не в проге, а в линии. Тут без осцила ты много не наловишь. Нафаршируй код отладочным выводом состояний автомата в некий буфер в ОЗУ ,а по переполнению выдавай его в уарт. Увидишь полную картину последовательности кодов, после чего ты получаешь фейл. Хорошо попробую отладочный вывод сделать: Уф, надеюсь поможет А то чет реально непонятки — раньше работал, а щас через раз. D Я забыл проверять готовность после стоповой и стартовой последовательности…. Вот почему он через раз работал. Когда я пошагово отлаживал — у него хватало времени, когда сразу включал — twi просто не успевал все сделать и захлебывался. Ну и решил немного смоделировать этот ручной режим программно тоесть в лоб — написал цикл тупой задержки и тыкал вызов ее в подозрительные места. Потом заметил закономерность и, вычислив стремные места, перечитал по-слогам сначала старт, ну а там и понял что к чему и со стопом разобрался. У меня небольшой вопросик, на какой частоте работает первая мега главная и на какой скорости передаются посылки по УАРТ… полазив по коду, нашел, что около скорость, но хотелось бы точно знать. Возможно, это в статье написано, но я что-то не вижу. Разница между мегой16 и 32 только в размерах памяти. А если мне, к примеру, попалось тупое Slave устройство, которое опускает линию и просто держит? Что может подсказать протокол в таком случае? Почему все же написано устройств? Просто не понял почему , а не Ну нет иметь адрес не обязательно В конце концов не с проста модулю TWI можно выставить бит, который запретит отзываться и вообще реагировать, на адрес, который в него записали Да и по докам написано, что можно На который отвечают все кто его слышит. Вроде бы у него адрес все нули. Или наоборот все единицы. А адрес должен быть обязательно. На него слейв отвечает аском. Нет ответа нет работы. Если без него то это уже не ииц, а чтото другое. У слейва само собой, я об этом и сказал в самом начале, а вот у мастера — вроде как нет и реально нафиг он ему? Но на счет broadcast не понятно… а где ты углядел эту инфу? Я перерыл доки, какие у меня были, по IIC и по модулям, но там ни где об этом не говорится: Мастер может быть и слейвом. В ииц вообще анархия на шине. А по поводу бродкастов… Не знаю как насчет оригинальных филипсовских спек на стандарт, они менялись много раз, а вот в железе, бродкаст обычно поддерживается. У авр для него даже свои выделенные состояния автомата есть. Почитай шит на авр. Может быть а может и не быть Все зависит от желаний разработчика поэтому можно и без адреса Если точно уверен, что мастер не станет слейвом. Ну с точки зрения слейва не важно сколько мастеров на шине. Не его это дело. Бродкаст может быть полезен для синхры всех устройств шины. Точно, щас наконец-то нашел этот broadcast в оригинальной спецификации на IIC. Реально есть такое ппц Значит реально больше слейвов не повесишь. Или вешать, но на всех, кроме одного отключить разрешение на общий вызов Это это муторно как-то так что пусть будет. Но я же имею ввиду железного мастера. Им мы можем управлять только установкой флажков. МЫ не можем заставить его отпустить линию, только дать ему приказ закончить передачу. А по стандарту конец передачи от слейва к мастеру это нак данный мастером. Вот там и зашито так. У статьи явно намечалось продолжение в виде практического примера с AVR. Но я после долгого пролистывания вперед так его и не обнаружил, что довольно таки грустно. Если я просмотрел, можешь дать ссылочку? Иначе скажи пожалуйста, будет ли когда-либо продолжение? Внезапно возник вопросик — про подтягивающие резисторы. Где их лучше ставить, если устройства разнесены? Только в одном месте например, около одного мастера или надо у каждого девайса? Ещё у Евстифеева написано, что при использовании в качестве ведущих-ведомых МК с нужными ножками без резисторов таки можно обойтись. ИИЦ работает на дистанциях в десяток сантиметров. В пределах одного устройства, короче. Странно, видал примеры, когда устройства были разнесены почти на метр, и в каждом предусмотрен подтяг для примера, регуляторы квадрокоптера и главная плата. Вот потому и засомневался, в даташитах на линии только два резистора нарисовано. Кстати, если максимум девайсов, то сложновато их на 10 см разместить будет, если вдруг понадобится 2. Про внутренний подтяг конечно. Сейчас добрался до даташитов, пока подобных примеров не нахожу. Ну потому и два, так как линия длинная. Но вообще ииц заточена для внутриплатной коммуникации. Можно, но его может не хватить на быстрый подтяг. Если у получившейся линии связи будет большая емкость, то фронты затянет, особенно на больших скоростях. Поставлю два резистора, на каждый девайс подтяг делать не буду, но площадку под них оставлю — вдруг не заработает. Отличная статья, даже школьнику понятно будет. Товарищи, а кто-нить работал с AD преобразует емкость в код передает это все через I2C?? Являюсь начинающим и пока жутко туплю Поделитесь знаниями. Здравствуйте, может немного глупый вопрос, хочу прояснить для себя верно ли я понял: Такого слейва надо будить и бить по почкам пока не проснется. Тогда при синтезе на транзисторах получится лишний устанавливающий слабую 1 кусок схемы? Здравствуйте, помогите советом как найти неисправность. LPC на моей плате должен управлять цифровым потенциометром по этой шине. Но что то идет или пошло не так перестала управлятся микросхема MCP Сейчас пытаюсь поределить проходят ли комманды в момент загрузки. А вы разберитесь вначале с адресацией их, может они на один адрес сели, а лпц оказалась шустрей и шину перехватывает. Дальше смотрите кто перехватывает управление. Сделать это можно вкорячив небольшое сопротивление в шину ом на между лпц и мсп и по разнице напряжений смотреть какая из микросхем шину пользует, передаче это помешать не должно, а на осциллографе будет видно. Здрастье, повесил ардуино прочитать ситуацию. Там такой плотный монтаж, что всунуть что то нереально. К ним можно подключиться. А как быть если подключены разные микросхемы на одну шину. Но у них разные логические уровни. Как то так, например. Правильно ли я понимаю, что если: И если это так, то нужно ли вообще преобразование логических уровней, если контроллер питается от 5в, а устройство от 3. Недавно работал с TWI на Atmega Реализовывал мастера, работающего с датчиком давления BMP Столкнулся с проблемами в духе повторных стартов и переходов в режим приема. Проблемы сами собой разрешились, когда в TWCR начал записывать не побитно, а байт целиком. Использовал данный материал для реализации подключения BMP к Mega Частота опроса датчика 1 с. Но никак не могу выловить причину регулярных сбоев где-то раз в пару минут. То есть получаю последовательность статусов 0х08 0х18 0х28 0х10 0х40 0х50 и все. Статуса 0х58 после не приходит — последний байт не приходит. Не знаю что делать уже несколько дней бьюсь и все бестолку. Помогите, если есть кто живой здесь. Сделайте синхронизацию по сбою и в момент сбоя поглядите на уровни шины, питания и черт знает что еще. Глюки в проге выше уровня. Может где то стек подрывает, может еще что. Сделайте подробное логирование по шагам всего автомата в циклический буфер и по сбою выгружайте его в уарт куда-нибудь. Поймете на каком шаге произошло что то не то. Может забыли что или у меня в коде ошибка. Вы подписаны на ответ. Подписаться на все остальные комментарии в теме? Previous Post Управление мощной нагрузкой постоянного тока. Часть 2 Next Post Хранение флюсов. А вот слейва как-то просто не получается. Щас попробую с опен ид поиграться. Я сделал софтового слейва на AT89C, но работало жутко медленно. GIF Красные пути — нормальная работа Синие — возможные косяки. В принципе так и делают на линии с монтажным И. Про это в прошлой теме упоминалось. Спасибо за очень подробную статью. Хотелось бы очень увидеть такую же по SPI. Жду примера для AVR, а то у меня как-то руки не дошли разобраться в этом: Спасибо автору за труд. А что тебе мешает сформировать сразу весь байт? Вот такая запись для него как раз родней некуда. Обычное присваивание байта байту. Так а если через бит-маску — какой из трех вариантов канает? Через XOR можно сделать обычную инверсионную маску. Да, здесь обновляется весь регистр. А вот бит-маску вроде так не наложить. Можно сделать хитрую маску которая инверснет нужные биты. Там шина, где все МК разноправные. В SPI же может быть связь только между двумя устройствами. Так что просто сдвигаешь вправо на два бита значение TWSR и вот тебе код статуса. Самый же дешевый из тинек, пожалуй это Тини но она на 20 ног. В некоторых стоповый бит выделен цветом а по уровням невпопад. DI, большое спасибо за диаграмму состояний автомата I2C! Сразу доходит, как все работает. Схема подключения — монтажное И. В каком апноте по iiс есть резюк перед слейвом? Ни разу такого не видел. Раньше такой способ работал: Я не ругаюсь, а луплю за дурной стиль: Жтаг вещь хорошая, но он особенно в авр кривоват и может косячить. D Я забыл проверять готовность после стоповой и стартовой последовательности… Вот почему он через раз работал. Когда я пошагово отлаживал — у него хватало времени, когда сразу включал — twi просто не успевал все сделать и захлебывался ну кошкин еж, как же я так …: Потом заметил закономерность и, вычислив стремные места, перечитал по-слогам сначала старт, ну а там и понял что к чему и со стопом разобрался Чисто случайно, отвлекся может, забыл написать проверку к ним. Просто не понял почему , а не такие дела. Проверить я это не могу. Остается А больше нельзя. Все должны иметь адрес. Ну нет иметь адрес не обязательно В конце концов не с проста модулю TWI можно выставить бит, который запретит отзываться и вообще реагировать, на адрес, который в него записали Да и по докам написано, что можно А что такое broadcast? Или вешать, но на всех, кроме одного отключить разрешение на общий вызов Это это муторно как-то так что пусть будет Спасибо а то я значит в заблуждении был. Евстифеев скорей всего имел ввиду внутренний подтяг порта. И ещё в авто такую же систему видал — там вообще по всему салону линии раскиданы были. Был бы сисятой телкой, совокуплялся бы с тобой за каждую статью! В целом логика работает, но иногда глючит. Добавить комментарий Отменить ответ Ваш e-mail не будет опубликован. Комментарий Имя E-mail Сайт Перед отправкой формы: Пожалуйста, выберите номера вертикальных картинок.
Шина I2C - полезные схемки
Интерфейс I2C
Дмитрий Кониченко, Симферополь, Россия
Купить закладки трамадол в Салаире
Общие положения и введение в логику работы шины I2C
Primary Menu
Шина I2C. Основные понятия
Шина управления I2C
Интерфейс I2C и Arduino
Закладки кристалы в Муравленке