Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Сначала рассмотрим функции этого четвертого провода. Очевидно, что при подключении более, чем двух устройств к одной линии, им нужно как-то "разбираться" между собой, иначе может получиться невесть что, когда два или более устройства "захотят" вдруг одновременно что-то передать. Притом непонятно, кому именно эта информация предназначается. Эта проблема решается по-разному: в самом общем случае каждому устройству присваивается индивидуальный адрес — так работает интерфейс 12С (см. далее), аналогично можно устроить многоканальный обмен по UART (точнее, USART). В других случаях адрес может заменяться специальным выводом "выбор кристалла" (chip select, /CS — обозначается с инверсией, потому что выбор практически во всех случаях производится при подаче низкого уровня), нередко эти оба способа адресации могут присутствовать одновременно. Таким образом, мы получаем возможность разобраться, к какому именно устройству в данный момент производится обращение. Несколько таких выводов могут обеспечить управление несколькими устройствами, подсоединенными к шине SPI, при этом остальные линии SPI объединяются.

На вывод /CS могут быть "навешены" и дополнительные функции (например, перевод микросхемы в "спящее" состояние с микропотреблением). Потому даже когда соединены всего два устройства, линия /CS обычно все равно требует специального управления. Разберем функционирование этой линии в МК AVR подробнее. Чтобы исключить конфликты при попытке одновременной передачи данных, в каждый момент времени одно из устройств выполняет функции ведущего (Master), а все остальные — ведомого (Slave, что означает "слуга"). Отметим, что в общем случае роли "ведущий" — "ведомый" в процессе работы могут меняться, но ведущий на линии в каждый момент времени может быть только один. Четвертый провод в аппаратном интерфейсе SPI является аналогом "выбора кристалла" и носит название SS (Slave Select — выбор ведомого). Обозначается он также с инверсией (/SS), т. к. выбор осуществляется подачей низкого уровня на этот вывод.

Естественно, что в большинстве случаев ведущим устройством выступает контроллер. Для ведущего вывод SS не имеет значения и может конфигурироваться, как выход обычного порта, с одним только нюансом: при работе с аппаратным SPI следует учесть, что если вывод /SS сконфигурирован как вход (по умолчанию), то на него должен быть подан высокий уровень напряжения, при подаче низкого уровня модуль SPI автоматически переключится в режим ведомого, даже если это произойдет во время передачи данных. Таким образом, для того чтобы этот вывод не мешал работе, его следует либо сконфигурировать на выход (тогда его можно применять, как обычный вывод порта— в том числе, например, и для управления линией /CS ведомого), либо оставить сконфигурированным на вход с подключением "подтягивающего" резистора (т. е. с записью значения 1 в этот разряд). В последнем случае для нормальной работы SPI никакие сигналы на него подавать нельзя.

Названия остальных линий SPI знакомы каждому, кто уже имел опыт последовательного программирования AVR — это информационные линии MISO (Master In Slave Out), MOSI (Master Out Slave In) и линия для подачи тактовых импульсов SCK. Как правило, тактовые импульсы подаются ведущим (как вариант— внешним источником), в режиме ведомого вывод SCK работает только на вход. В отличие от симметричного UART, где вывод TxD может только передавать данные, a RxD — только принимать (поэтому у разных устройств их следует соединять перекрестно), в интерфейсе SPI одноименные выводы MISO и MOSI соединяются между собой, а направление передачи задается выбором режима "ведущий — ведомый".

Заметки на полях
Заметим, что как и 12С (см. далее в этой главе), название SPI является зарегистрированной торговой маркой (в данном случае фирмы Motorola). Потому вы можете встретить в технических описаниях разные названия и самого этого интерфейса (что еще не так страшно), и, главное, его выводов. Чаще всего можно встретить общее название Three-Wire Serial Interface — "трехпроводной после-довательный интерфейс" (хотя, как мы говорили, на самом деле требуется четыре провода, включая "землю", и даже пять, если учитывать "выбор кристалла"). Сложнее привести варианты названий выводов, потому что QHH сильно зависят от назначения устройства, и могут различаться в каждом отдельном случае.
Так, например, в АЦП фирмы Analog Devices вывод SCK носит название SCLK, MISO называется DOUT (потому что АЦП всегда— ведомый), а MOSI, соответственно, DIN. Другие обозначения вам встретятся в случае, например, энергонезависимой памяти производства той же Atmel (см. главу 11), где MOSI будет просто SI, a MISO — просто SO. Название вывода /SS характерно лишь для аппаратного SPI в МК AVR. В других устройствах чаще всего имеется обычный вход "выбор кристалла" /CS, а иногда совместно с ним и другие управляющие выводы: например, в памяти АТ25 есть еще вывод задержки обмена /HOLD, практически во всех микросхемах энергонезависимой памяти есть вывод запрета записи ЛЛ/R. В АЦП может встретиться вывод "готовности данных" (он может называться, например, DRDY). По этим причинам полный протокол обмена по SPI у различных устройств может сильно различаться, хотя в его основе всегда лежит последовательный побитный сдвиг в каждом такте частоты, задаваемой "мастером" на выводе SCK.
Существуют также различающиеся по комбинации логических уровней режимы (mode) 0, 1, 2 и 3 (см. главу 11), а также SPI с большим количеством линий данных (их мы рассматривать здесь не будем). Схема обмена данными по SPI между двумя контроллерами показана на рис. 3.2. Устроен этот обмен довольно хитро— как видно из рисунка, два 8-разрядных регистра (источника и приемника) образуют единый регистр сдвига, соединенный в кольцо линиями MISO и MOSI. С началом передачи "заводится" генератор синхроимпульсов (в общем случае он, конечно, не обязательно входит в ведущее устройство, может быть и внешним), из ведущего по линии MOSI начинают "выталкиваться" биты, одновременно вытесняя из ведомого биты по линии MISO. Через восемь тактов регистры полностью обмениваются информацией между собой. Если после этого генератор продолжает работать, то информация так и будет "крутиться" в этом кольце. Чтобы ее обновить, нужно после каждого цикла обмена считывать принятый байт и записывать новый (при необходимости обе операции в обоих устройствах). Таким образом запись (в ведомый) и чтение (из ведомого) фактически представляют собой одну операцию: если нужно только записывать (например, послать код команды), то принятая величина попросту игнорируется; наоборот, если нужно только читать, то для этого посылается байт с произвольным значением.



     
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru