Учебный курс AVR. Работа с SPI модулем. Ч1

08/10/2012 - 19:50 Павел Бобков

   Микроконтроллеры AVR имеют в своем составе модули, реализующие стандартные интерфейсы. Эти модули используются для обмена данными с различными периферийными устройствами, например, цифровыми датчиками, микросхемами памяти, ЦАП, АЦП, другими микроконтроллерами и так далее. В этой статье, на примере микроконтроллера atmega16, мы разберемся, как работать с модулем последовательного периферийного интерфейса или модулем SPI (serial peripheral interface).

   Введение

   SPI представляет собой четырехпроводную синхронную шину, предназначенную для последовательного обмена данными между микросхемами. Интерфейс был разработан компанией Motorola, но в настоящий момент используется всеми производителями. Данный интерфейс отличают простота использования и реализации, высокая скорость обмена и малая дальность действия.
   При любом обмене данными по SPI одно из устройств является ведущим (Master'ом), а другое ведомым (Slave'ом). Обычно (но не всегда) в роли ведущего выступает микроконтроллер. Ведущий переводит периферийное устройство в активное состояние и формирует тактовый сигнал и данные. В ответ ведомое устройство передает ведущему свои данные. Передача данных в обе стороны происходит синхронно с тактовым сигналом.
   Физически SPI реализуется на основе сдвигового регистра, который выполняет и функцию передатчика, и функцию приемника.
   Принцип обмена данными по SPI проиллюстрирован на следующих картинках.

 





   Сигналы, используемые данным интерфейсом, имеют следующее назначение: 


MOSI — Master Output / Slave Input. Выход ведущего / вход ведомого. Служит для передачи данных от ведущего устройства к ведомому.
MISO
– Master Input / Slave Output. Вход ведущего / выход ведомого. Служит для передачи данных от ведомого устройства к ведущему.
SLK — Serial Clock. Сигнал синхронизации. Служит для передачи тактового сигнала всем ведомым устройствам.
SS — Slave Select. Выбор ведомого. Служит для выбора ведомого устройства.

   Производители микросхем часто используют другие названия для этих сигналов. Альтернативные варианты могут быть такими:

MOSI – DO, SDO, DOUT.
MISO – DI, SDI, DIN.
SCK – CLK, SCLK.
SS – CS, SYNC.

   Схемы соединений по SPI

   Типовая схема соединения двух устройств по SPI выглядит так.

 



   Также возможно подключение к ведущему устройству несколько ведомых устройств. Однако в любой момент времени обмен может происходить только с одним из них, остальные должны находиться в неактивном состоянии.

 



   Исключение составляет каскадная схема соединения по SPI. При таком подключении сдвиговые регистры устройств образуют один большой регистр, и количество линий SPI остается равным 4-ем. Правда, такое подключение поддерживают далеко не все микросхемы.

 




   Также возможен сокращенный вариант схемы подключения, когда линия MOSI или MISO не используется. То есть передача данных осуществляется только в одну сторону. Такие схема, например, используются при подключении к микроконтроллеру внешних микросхем ЦАП и АЦП.

 



   Протокол обмена по SPI

   Протокол обмена по SPI аналогичен логике работы сдвигового регистра и заключается в последовательном побитном выводе/вводе данных по определенным фронтам тактового сигнала. Установка данных и выборка осуществляется по противоположным фронтам тактового сигнала.
   Спецификация SPI предусматривает 4 режима передачи данных, которые отличаются между собой соотношением фазы и полярности тактового сигнала и передаваемых данных.
   Эти режимы описываются двумя параметрами:

CPOL – clock polarity. Полярность тактового сигнала - определяет исходный уровень сигнала синхронизации
CPHA – clock phase. Фаза тактового сигнала — определяет последовательность установки и выборки данных.

   Рисунки ниже иллюстрируют все четыре режима обмена SPI.

   SPI mode 0: CPOL = 0, CPHA=0. Тактовый сигнал начинается с уровня логического нуля. Защелкивание данных выполняется по нарастающему фронту. Смена данных происходит по падающему фронту. Моменты защелкивание данных показаны на рисунках стрелочками

 


  SPI mode 1: CPOL = 0, CPHA=1. Тактовый сигнал начинается с уровня логического нуля. Смена данных происходит по нарастающему фронту. Защелкивание данных выполняется по падающему фронту.

 


   SPI mode 2: CPOL = 1, CPHA=0. Тактовый сигнал начинается с уровня логической единицы. Защелкивание данных выполняется по падающему фронту. Смена данных выполняется по нарастающему фронту тактового сигнала.

 


   SPI mode 3: CPOL = 1, CPHA=1. Тактовый сигнал начинается с уровня логической единицы. Смена данных выполняется по падающему фронту тактового сигнала. Защелкивание данных выполняется по нарастающему фронту.

 


   Современные микроконтроллеры поддерживают все четыре режима работы SPI.
   Стоит отметить, что передача данных по SPI может происходить не только старшим битом вперед, но и младшим. А количество байт передаваемых за время удержания сигнала выбора (SS) ничем не ограничено и определяется спецификацией используемого ведомого устройства. Также в спецификации на ведомое устройство указываются поддерживаемые режимы работы SPI, максимальная частота тактового сигнала, содержимое передаваемых или принимаемых данных.

Остальные части

   Учебный курс AVR. Работа с SPI. Запись и чтение данных. Ч2
   Учебный курс AVR. Работа с SPI. Управление сдвиговым регистром. Ч3

Comments   

# foxit 2012-10-09 08:20
Наверно нужно добавить, что протокол может быть реализован как аппаратными, та и программными способами.
# Pashgan 2012-10-09 15:07
В продолжении напишу.
# foxit 2012-10-09 15:29
Ждем продолжения
# Дмитрий 2012-10-14 18:21
Автор умница, уже более года этот сайт для меня как настольная книга, справочник под рукой.
# Pashgan 2012-10-15 17:03
Спасибо. Я рад, что мой материал кому-то оказывается полезным.
# Nik_V 2016-11-09 06:24
Спасибо вам Огромное!

Сколько раз уже убеждаюсь, что самое лучшее обучение - это самообучение, а так же общения с умными и интересными людьми как вы!

На просторах интернета наткнулся на "младшего брата" ethernet - etherCAT. Приходилось ли вам с ним работать?
# Student 2012-10-28 13:07
Жду продолжения. Материал очень хорошо преподнесен, просто и понятно. Наличие временных диаграмм очень порадовало.
# Mirage 2012-12-04 06:43
Ждем продолжения. Материал отлично преподнесен
# Владимир Хлуденьков 2013-07-12 04:42
Вот столкнулся с тем, что слэйв отвечает мастеру по линии клок, когда мастер переводит её в z-состояние. Хотелось бы узнать более подробно про это.
# Pashgan 2013-07-12 05:23
Не сталкивался с таким. А перед тем как перевести линию "клок" в z состояние, слейв переводится мастером в неактивное состояние (когда SS = 1)?
# Дмитри й 2014-02-28 03:16
Два Master на один Slave - для SPI это возможно?
# _Артём_ 2014-02-28 17:22
Теоретически возможно. Но тут главный вопрос - как производить арбитраж при одновременном доступе к шине. Если придумаете способ, как мастер может определить захватил ли он шину, то всё получится. Но это уже не совсем spi получится...
# Pashgan 2014-03-18 19:58
Можно опрашивать каждым Master`ом сигнал CS перед доступом. Если он в 0, то ждать пока освободится. Если в 1, то занимать подчиненное устройство.
# Pearline 2015-01-12 12:41
title max: http://crossreview.ru/104229 loan providers
give loans to those in debt in return for collateral.
# Лера 2016-12-26 07:16
Вопрос от нуба: для проверки SPI на одном устройстве MOSI соединяем с MISO, SCLK кидаем на GPIO, а что делать с SS?

У вас недостаточно прав для комментирования.