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

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

ACK - я успешно получил данные. Отправьте мне больше данных. NACK- я не получил данные. Отправить снова. Это как то так или я не прав. Пожалуйста, уточните и предложите правильный ответ.

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

2 ответа

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам