Учебный курс 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

Комментарии   

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

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

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

Добавить комментарий

Защитный код
Обновить