После выхода из цикла линия данных высвобождается, а на линии SCL в течение
Нашу программу нельзя считать полностью рабочей, поскольку в ней отсутствует обработка ошибок. А ошибки могут возникать, например, если какое-либо устройство будет удерживать на любой из линий НИЗКИЙ уровень, т. е. если шина будет занята.
Мы не стали реализовывать в подпрограмме I2C_OUT блок ведущего-приемника, поскольку в микросхеме МАХ518 не предусмотрена передача данных ведомому. Однако функция приема данных по шине 12С реализована в Программе 12.18 (подпрограмма I2C_IN).
В качестве примера перешлем содержимое регистра h’40’ в 0-й канал, а содержимое регистра h’41’ — в 1-й канал. После этого обновим оба регистра ЦАП и, следовательно, одновременно сформируем напряжения на выводах
Для выполнения указанных операций нам потребуется переслать по шине пять пакетов:
1. СТАРТ.
2. Пакет адреса: Ь’01011000’.
Адрес ведомого Ь’01011(00), запись.
3. Управляющий байт 1: Ь’00000ХХ0’.
Нет сброса, активный режим, канал 0.
4. Байт данных 1:
Содержимое регистра h’40’.
5. Управляющий байт 2:
Нет сброса, активный режим, канал 1.
6. Байт данных 2:
Содержимое регистра h’41’.
7. СТОП; содержимое обоих регистров ЦАП обновляется.
Ход выполнения Программы 12.10 в точности повторяет указанную последовательность операций. После каждого возврата из подпрограммы I2C_OUT регистр ERR проверяется на нулевое значение. Если он не равен нулю, то последовательность повторяется с самого начала — повторное формирование состояний СТАРТ допускается протоколом I2С. Однако если произошел аппаратный сбой самой шины или ведомого устройства, то этот процесс может продолжаться бесконечно. Поэтому для увеличения надежности и предотвращения зависания системы необходимо предусмотреть механизм тайм-аута.