fk0, легенда (04.02.2013 20:04, просмотров: 128) ответил whale на подтяжка 1,5к стоит если что )
Слейв, если обмен начался и не завершился за определённое время -- сбрасывает свой I2C модуль и освобождает шину (если держал SCL в нуле и т.п.) Мастер свой сброс выполняет так в общем случае: через SFR регистры сбрасывает свой I2C модуль (если ARM, то обычно можно питание отключить и т.п.), потом включает его и настраивает, потом путём прямого управления выводами GPIO в I2C шину посылается старт, 9 бит (NACK) и стоп. На этом этапе разглючиваются слейвы и сам мастер (через SFR не до конца сбрасывается, у PIC24 например). Потом мастер ещё раз через SFR сбрасывается и работает нормальным образом. Если при обмене долго нет завершения на стороне мастера -- сброс. Протокол обмена должен предусматривать потерю пакетов. Т.е. на N/ACK расчитывать как на подтверждение (не)доставки нельзя. У меня было так, что команды туда с "серийным номером". Обратно номер считывается другой командой (см. протокол SMBUS). Если увеличился на единичку -- команда дошла. Если не изменился -- не дошла и можно повторить. Если изменился не пойми как: несколько раз отсылается широковещательная команда "RESET всего", всё останавливается и серийный номер обнуляется (на практике это не встречалось можно сказать), мастер фиксирует неправильную работу всего в комплексе, процесс останавливается. Считывание информации без изменения состояния (в слейве) одной командой, без номера. Если считываем и состояние слейва меняется (удаляет у себя из очереди отправляемую информацию, например), то напрямую никак, только через команду от мастера с серийником (за исключением функций отладки -- printf через I2C работал без серийника, ну некоторые сообщения пропадали...)
[ZX]