Выполнение различных операций, поддерживаемых термометром, таких как «Преобразование» (h’44’) и «Чтение температуры» (h’BE’), инициируется ведущим посылкой соответствующих 8-битных значений. Процесс передачи каждого из этих значений начинается с посылки старт-бита (
Для нашего примера потребуется написать две подпрограммы, одна из которых будет передавать байт в ведомое устройство, а другая — считывать один байт из него.
Решение
Из Рис. 12.28,
1. Ведущий инициирует процесс обмена, выставляя на линию данных НИЗКИЙ уровень на время не менее 1 мкс.
2. Ведущий либо оставляет на линии НИЗКИЙ уровень (запись лог. 0), либо высвобождает линию (запись лог. 1) на время 60…120 мкс.
3. Ведомый считывает состояние линии через 15…45 мкс после начала слота.
4. Ведущий освобождает линию (если он записывал лог. 0) на время не менее 1 мкс для приведения системы в исходное состояние.
В подпрограммах, код которых приведен в Программе 12.20, предполагается, что вывод порта, управляющий линией данных DQ, уже сконфигурирован так же, как и выводы, управляющие линиями шины I2С (см. стр. 396), — жесткий НИЗКИЙ уровень и открытый выход, подтянутый к линии питания для формирования ВЫСОКОГО уровня. Также мы предполагаем, что в нашем распоряжении имеется макрокоманда Delay_us, которая формирует задержку длительностью
Delay_us macro К; К — длительность задержки в мкс
local DELAY_US_LOOP
movlw (K*XTAL)/(4*3)+1; 1~
DELAY_US_LOOP
addlw -1; Декрементируем счетчик: N~
btfss STATUS,Z; до нуля: N + 1~
goto DELAY_US_LOOP;:2(N — 1)~
endm
Дополнительная операция прибавления единицы в выражении для вычисления количества итераций цикла предназначена для округления
Выполнение обеих подпрограмм начинается с выставления на линию DQ НИЗКОГО уровня на время не менее 1 мкс, в результате чего на линии формируется состояние СТАРТ Запись каждого бита на шину происходит в слоте длительностью 60…120 мкс и инициируется либо выдачей на линию НИЗКОГО уровня (0), либо ее высвобождением (1). Ведомый считывает состояние линии данных через 15 мкс после начала временного слота. Хотя длительность временного слота и не критична, необходимо быть внимательным, поскольку состояние НИЗКОГО уровня длительностью 480…960 мкс интерпретируется ведомым как команда сброса (см. Вопрос для самопроверки 12.3).
Для передачи одного байта используются восемь временных слотов, разделенных паузами длительностью не менее 1 мкс. Значение, передаваемое в каждом слоте, соответствует значению флага переноса, которое формируется в результате циклического сдвига байта данных DATA_OUT. После восьми циклов сдвига/выдачи процесс завершается.
Чтение байта из ведомого устройства происходит следующим образом:
1. Ведущий инициирует процесс чтения, выставляя на линию НИЗКИЙ уровень на время не менее 1 мкс.
2. Ведущий считывает значение бита, выдаваемое на линию ведомым, которое должно быть корректным в течение 15 мкс после формирования фронта состояния СТАРТ.
3. Через 15 мкс ведомый высвобождает линию, на которой к моменту завершения 60-мкс слота в результате подтяжки должен появиться ВЫСОКИЙ
4. Ведущий ждет не менее 1 мкс перед формированием следующего слота.
Указанный алгоритм реализуется подпрограммой чтения READ_1W, которая считывает состояние линии данных до наступления 15 мкс с момента начала временного слота, т. е. в тот момент, когда напряжение на линии, определяемое ведомым, уже установилось. Значение считанного бита используется для установки/сброса флага переноса, который затем вдвигается в переменную DATA_IN. После восьми операций чтения/сдвига в этой переменной окажется принятый байт данных.
В отличие от протокола I2С, протокол 1-Wire предполагает наличие только одного ведущего устройства. Однако все ведомые устройства имеют уникальный 64-битный адрес, хранящийся во внутреннем ПЗУ. Первые восемь битов обозначают код семейства 1-Wire, к примеру, микросхема DS18S20 имеет код h’10’. Следующие 48 бит являются уникальным серийным номером, а последние восемь битов представляют собой контрольную сумму всех предыдущих байтов.