Ответы NACK и ACK на шине I2c

Мой недавний проект требует использования связи i2c с использованием одного ведущего устройства с несколькими ведомыми устройствами. Я знаю, что на каждый байт данных (фактических данных), отправленный мастером, ведомое устройство отвечает Nack \ Ack (1,0). Меня смущает то, как интерпретируются этот Nack и ACK. Я искал в Интернете, но у меня не было четкого представления об этом. Насколько я понимаю, это примерно так.

ACK- Я успешно получил данные. Пришлите мне больше данных. NACK- Я не получил данные. Отправить еще раз. Это что-то вроде этого или я ошибаюсь. Уточните, пожалуйста, и предложите правильный ответ.

Спасибо Амит Кумар


person amit kr    schedule 05.05.2016    source источник


Ответы (2)


Вам действительно стоит прочитать здесь спецификацию I2C, но вкратце, есть два разных случая рассмотреть для ACK / NACK:

  1. После отправки адреса подчиненного устройства: когда мастер I2C отправляет адрес подчиненного устройства для разговора (включая бит чтения / записи), подчиненное устройство, которое распознает его адрес, отправляет ACK. Это сообщает мастеру, что ведомое устройство, которого он пытается достичь, действительно находится на шине. Если ни одно ведомое устройство не распознает адрес, результатом будет NACK. В этом случае мастер должен прервать запрос, так как разговаривать не с кем. Обычно это не то, что можно исправить повторной попыткой.

  2. Внутри передачи: после того, как сторона, читающая байт (главный при приеме или ведомый при отправке) получает байт, она должна отправить ACK. Основным исключением является то, что если получатель контролирует количество отправленных байтов, он должен отправить NACK после последнего отправляемого байта. Например, при передаче от ведомого к ведущему ведущий должен отправить NACK непосредственно перед отправкой условия STOP для завершения передачи. (Этого требует спецификация.)

Также может случиться так, что получатель может отправить NACK, если есть ошибка; Я не помню, разрешено ли это спецификацией.

Но суть в том, что NACK либо указывает на фатальное состояние, которое нельзя повторить, либо просто указывает на конец передачи.

Кстати, случай, когда принимающему устройству требуется больше времени для обработки, никогда не указывается NACK. Вместо этого ведомое устройство либо выполняет «растягивание часов» (или ведущее устройство просто задерживает генерацию часов), либо использует протокол более высокого уровня для запроса повторной попытки.

Изменить 6/8/19: как указано @DavidLedger, существуют флэш-устройства I2C, которые используют NACK, чтобы указать, что флэш-память внутренне занята (например, завершает операцию записи). Я вернулся к стандарту I2C (см. Выше) и обнаружил следующее:

Есть пять условий, которые приводят к созданию NACK:

  1. На шине нет получателя с переданным адресом, поэтому нет устройства, которое могло бы ответить подтверждением.

  2. Приемник не может принимать или передавать, потому что он выполняет некоторую функцию в реальном времени и не готов начать обмен данными с мастером.

  3. Во время передачи получатель получает данные или команды, которые он не понимает.

  4. Во время передачи получатель не может получить больше байтов данных.

  5. Мастер-приемник должен сигнализировать об окончании передачи подчиненному передатчику.

Следовательно, эти условия NACK действительны в соответствии со стандартом.

Для коротких задержек, особенно в пределах одной операции, обычно используется растяжение часов, но при более длительных задержках, особенно между операциями, а также при недопустимых операциях, я могу получить NACK.

person DoxyLover    schedule 10.05.2016
comment
Я считаю, что некоторые I2C EEPROM действительно отвечают NACK, когда они не готовы. См. AT34C02D-SSHM-T. - person David Ledger; 07.06.2019
comment
@DavidLedger Читая таблицу, я вижу, что вы правы. После команды записи устройство запускает внутренний цикл (ы) записи, а интерфейс I2C отключается и, таким образом, не будет ACK, пока циклы не будут завершены. Они предлагают опрос, повторяя следующую операцию, пока не будет получен ACK. Они также будут NACK на запись, если устройство защищено от записи. - person DoxyLover; 09.06.2019
comment
Привет, в случае с мастером-приемником. Допустим, мастер отправил NACK подчиненному после того, как подчиненный отправил ему некоторый байт. Какой должна быть реакция раба на это? должен ли подчиненный покинуть линию sda, чтобы линия sda оставалась на высоком уровне, и все? Я имею в виду, если я хочу проверить, что ведомый ведет себя правильно ... что я ожидаю от него делать после того, как мастер отправил нэк? - person UVMag; 23.02.2021
comment
@UVMag Обратите внимание на случай 5 в моем ответе выше. Это будет сигналом к ​​тому, что мастеру больше не нужны данные. Следующее, что подчиненное устройство должно ожидать от мастера, - это состояние STOP (или, может быть, повторный START, я не уверен). Все остальное не определяется спецификацией. Если бы ведущий был NACK, а затем продолжил синхронизацию байтов, ведомый был бы свободен делать что угодно. ИМО, ведомое устройство может законно игнорировать NACK и просто искать STOP. - person DoxyLover; 23.02.2021

Протокол I2C начинается со стартового бита, за которым следует адрес ведомого (7-битный адрес + 1 бит для чтения / записи). После отправки адреса подчиненного устройства Мастер освобождает шину данных (линия SDA), переводит линию в состояние высокого импеданса, предоставляя подчиненному устройству управлять линией.

Если адрес совпадает с адресом ведомого, ведомый переводит линию на низкий уровень для ACK. Если линия не получает низкий уровень ни одним из ведомых устройств, то ведущее устройство рассматривает это как NACK и отправляет стоповый бит или повторяющийся стартовый бит в следующем тактовом импульсе для завершения или перезапуска связи.

Помимо этого, NACK также отправляется всякий раз, когда получатель не может передать или понять данные.

NACK также используется мастером (получателем) для завершения потока чтения, когда в нем есть все данные, за которыми следует стоповый бит.

person Deepak Kapoor    schedule 14.02.2021