Программная эмуляция протокола I2C

June 27, 2010 by admin Комментировать »

Для того чтобы программно эмулировать протокол I2C, нам тогда придется сначала решить вопрос о том, как формировать тактирующую последова­тельность на линии SCL. В принципе это можно сделать с помощью таймера, но на самом деле это неудобно — и таймеры обычно заняты более полезны­ми делами, и тут у нас нет каких-то жестких требований ни к стабильности, ни к форме сигнала. Потому мы воспользуется знакомым нам древним, как сами микропроцессоры, способом формирования временной задержки с по­мощью пустого цикла.

В данном случае для формирования задержки будем использовать счетчик cnt (пусть это будет регистр из числа старших — от г16 до гЗ 1). Пустой цикл, повторенный NN раз, тогда запишется так:

ldi cnt,NN cyk__delay: dec cnt

brne cyk_delay

Сам цикл занимает 3 такта (1 такт на команду dec и 2 такта на команду brne с переходом), то есть, например, при частоте кварцевого генератора 4 МГц он будет длиться 0,75 мкс. Пусть мы хотим обеспечить скорость передачи около 100 кГц, тогда длительность одного импульса (полпериода тактовой частоты) должна равняться примерно 5 мкс. Итого нам надо повторить цикл 6—7 раз.

Чтобы не отводить отдельный регистр только для такой частной задачи, как счет циклов в задержке, стоит дополнить цикл процедурами сохранения в стеке значения счетчика, тогда этот регистр можно безопасно использовать где-то еще. И вся процедура будет выглядеть так:

delay: ;~5mks (кварц 4 MHz)

push cnt

ldi cnt, 6 cyk_delay: dec cnt

brne cyk_delay

pop cnt ret

Используя эту процедуру, можно сформировать весь протокол. Чтобы не за­громождать текст этой главы, я вынес полный текст процедур обмена по fC в приложение 4 (разд. «Процедуры обмена по интерфейсу fC»). Подробно расшифровывать я его не буду, так как он полностью соответствует описа­нию протокола.

Указанный текст в приложении 4, кроме общих процедур посылки и приема байта (бесхитростно названных write и read), содержит процедуры для двух конкретных устройств: энергонезависимой памяти с интерфейсом I2C и часов реального времени DS1307 (DS1338) с таким же интерфейсом. Эти микро­схемы имеют заданные I2C-адреса— 1010000 ($А0/$А1 на запись/чтение) у памяти и 1101000 ($D0/$D1) у часов. Сначала мы займемся модификацией нашего измерителя с записью данных во внешнюю flash-память.

Как и сказано в пршожении 4, текст приведенной там программы следует скопировать и сохранить в виде отдельного подключаемого файла. Мы будем предполагать, что такой файл называется i2c.prg. Директиву .include "i2c.prg" следует включать в текст программы обязательно после таблицы векторов прерываний, так как, в отличие от файла определений констант (m8535def.inc в данном случае), наш включаемый файл содержит команды, а не только инструкции компилятору. В принципе можно просто вставить текст из файла в основную программу (это и делает компилятор, когда встре­чает директиву include.

1 комментарий

  1. qaki says:

    Наконец-то нашел внятное описание структуры исключающего ИЛИ. Вам респект.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты