

Лабораторная работа 2
Разработка драйвера интерфейса I²C, SPI
Теоретическая информация
Интерфейс I²C
I²C - Inter-Integrated Circuit межкомпонентный двухпроводной интерфейс, представляющий собой синхронную последовательную шину, которая обеспечивает двустороннюю передачу данных между подключенными устройствами.
Аппаратная часть
Интерфейс I²C содержит в себе сигнальные линии данных (Serial Data, SDA) и синхронизации (Serial Clock, SCL).
Термины, используемые в спецификации I²C:
На рисунке ниже представлен пример соединения устройств по шине I²C: один ведущий (master) микроконтроллер, три ведомых (slave) устройства (АЦП, ЦАП, МК).

В число I²C-совместимых устройств входят ИС памяти, видеопроцессоров и модулей обработки аудио- и видеосигналов, АЦП и ЦАП, драйверы ЖК-индикаторов, процессоры со встроенным аппаратным контроллером I²C шины и т.д.
Стоит отметить, что I²C позволяет работать и в режиме «мультимастер» - когда на шине есть несколько Master-устройства.
Протокольная часть
Перед началом передачи данных ведущее устройство убеждается в том, что шина свободна, т.е. сигналы SCL и SDA имеют высокий уровень. После этого происходит выполнение условия «старт» (Start) - перевод сигнала SDA в низкий уровень при сохранении высокого уровня SCL. Завершается передача данных введением ведущим устройством условия «стоп» (Stop) - сигнал SDA переводится в высокий уровень при сохранении высокого уровня SCL. Физическая интерпретация представлена на рисунке ниже.
Передача данных.
На рисунке представлена общая схема передачи данных (чтение/запись).

Запись.
После генерации старт-сигнала, необходимо указать адрес устройства, в которое будет производиться запись. Этот адрес указывается в технической документации на устройство. Затем следует бит, обозначающий непосредственно действие, которое Master инициирует (1 – чтение, 0 - запись). После ответа-подтверждения от Slave, Master посылает байт данных для записи. После успешной записи байта, Slave должен снова выставить ACK бит. Master видит, что Slave готов продолжить запись и может отправить следующий байт. Либо сгенерировать стоп-сигнал.
Правила, по которым устанавливается адрес памяти для записи, описываются в документации на используемое устройство. Обычно, первый байт данных указывает на ячейку памяти для начала записи, последующие – на данные, которые будут записаны по указанному адресу и, если продолжается отправка данных, в ячейки со следующими по порядку адресами.
Существуют реализации, позволяющие задавать адрес – это удобно, когда на одной шине должно размещаться несколько одинаковых устройств. Очевидно, что им необходимы различные адреса. Например, цифровой датчик температуры AD7416 от Analog Devices позволяет задать 3-х битный адрес, что дает возможность использовать до 8 одинаковых устройств на одной шине.

Чтение.
Начало операции чтения аналогично записи: генерируется старт сигнал, посылается адрес устройства для общения, после ответа Slave о готовности, Slave посылает первый, байт данных. После выставления мастером бита готовности ACK, Slave передает следующий байт данных и так до тех пор, пока Master не выставит бит NACK. После этого генерируется стоп-сигнал и обмен заканчивается.
Пример из документации на датчик AD7416. В первом абзаце указывается, что для проведения операции чтения необходимо предварительно провести операцию записи в специальный регистр, установив «указатель» на адрес памяти, откуда мы планируем читать.

Информацию о временных интервалах между командами необходимо искать в документации на используемое устройство, так как общего стандарта на временные интервалы нет
Например, устройству может быть необходимо, чтобы между генерацией STOP и следующего START прошло не менее 2 мс, в противном случае может возникнуть зависание или наблюдаться некорректная работа устройства.
Ниже приведет фрагмент из документации на датчик MPU6050, где на диаграмме указываются максимальные и минимальные временные интервалы между определенными событиями.

Арбитраж
Арбитраж выполняется на линии SDA при высоком уровне линии SCL. Устройство, которое формирует на линии SDA высокий уровень, когда другое передает низкий, теряет право брать «Master» и должно перейти в режим «Slave». «Master», потерявший инициативу на шине, может формировать тактовые импульсы до конца байта, в котором потерял свойства ведущего.

Итог
Вкачестве итога, выделим особенности I²C интерфейса.
Требуется только две линии - линия данных (SDA) и линия синхронизации (SCL) Каждое устройство, подключённое к шине, может быть программно-адресовано по уникальному адресу. В каждый момент времени существует простое отношение ведущий/ведомый: ведущие могут работать как ведущий-передатчик и ведущий-приёмник.
Шина позволяет иметь несколько ведущих, предоставляя средства для определения коллизий и арбитраж для предотвращения повреждения данных в ситуации, когда два или более ведущих одновременно начинают передачу данных
Относительно высокие скорости обмена от 100 Кбит/с до 3,4 Мбит/с соединение друг с другом устройств с различными напряжениями питания.
‒Максимальное допустимое количество микросхем, подсоединённых к одной шине, ограничивается максимальной емкостью шины 400 пФ.
‒трудность локализации неисправности, если одно из подключенных устройств ошибочно устанавливает на шине состояние низкого уровня.

Интерфейс SPI
SPI (Serial Peripheral Interface) – синхронный последовательный периферийный интерфейс.
Аппаратная часть
В SPI используются четыре цифровых сигнала:
•MOSI — выход ведущего, вход ведомого (англ. Master Out Slave In). Служит для передачи данных от ведущего устройства ведомому.
•MISO — вход ведущего, выход ведомого (англ. Master In Slave Out). Служит для передачи данных от ведомого устройства ведущему.
•SCLK или SCK — последовательный тактовый сигнал (англ. Serial Clock). Служит для передачи тактового сигнала для ведомых устройств.
•CS или SS — выбор микросхемы, выбор ведомого (англ. Chip Select, Slave Select).
Существуют следующие варианты подключения нескольких устройств на шине SPI.
Вариант 1: независимое (параллельное) подключение.
Для каждого Slave-устройства выделяется своя линия SS (CS) , Master выбирает, кто из Slave-устройств будет «слушать» его команды, путем непосредственного управления нужной линией SS. Очевидно, что добавление каждого нового устройства на шине сопряжено с необходимостью выделения дополнительной линии SS.
На схеме ниже показано, как передаются байты данных при указанном способе подключения.

Вариант 2: каскадное (последовательное) подключение.
При таком способе подключения используется лишь 1 линия SS, но данные поступают последовательно во все Slave-устройства. Т.е. 1-й байт данных предназначается последнему устройству, а последний первому. Master отправляет большой пакет данных сразу для всех подчиненных устройств первое подчиненное устройство забирает свою часть данных, а остальные ретранслирует следующему. При таком подключении сдвиговые регистры устройств образуют один большой регистр. Нагляднее этот принцип показан на схеме ниже.

Протокольная часть
Режим работы интерфейса определяется полярностью и фазой установки данных относительно SCLK. Существует 4 режима работы шины SPI. Для их обозначения принято следующее соглашение, нумерация режимов работы может отличаться в зависимости от источника, необходимо ориентироваться на полярность и фазу сигнала:
•
•
•
•
Mode 0 (режим 0) : CPOL = 0, CPHA = 0; Mode 1 (режим 1): CPOL = 0, CPHA = 1; Mode 2 (режим 2): CPOL = 1, CPHA = 0; Mode 3 (режим 3): CPOL = 1, CPHA = 1.
CPOL – Clock Polarity.
CPHA – Clock Phase.