Программирование ARM AT91SAM7 Serial Peripheral Interface (SPI) Sat, April 20 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

AT91SAM7 Serial Peripheral Interface (SPI) Печать
Добавил(а) microsin   

Блок последовательного периферийного интерфейса (Serial Peripheral Interface, SPI) представляет собой дуплексный линк для передачи данных, обеспечивающий двусторонний обмен с внешними микросхемами в режиме главного устройства (Master Mode) или подчиненного устройства (Slave Mode). Это также разрешает обмен между процессорами, если к разрабатываемой системе подключен внешний процессор.

По сути SPI это просто регистр сдвига, который последовательно передает данные для других устройств SPI [2]. Во время передачи данных одна из систем SPI действует как "master", управляя потоком данных, в то время как другие устройства на шине SPI действуют как "slave" вдвигая в себя данные и выдвигая их на шину по тактовому сигналу, предоставляемому устройством master. Разные CPU могут предпринять попытки стать мастерами, тогда будет использоваться протокол с несколькими мастерами на шине (Multiple Master Protocol) в отличие от случая, когда на шине SPI только одно устройство мастер, а все остальные устройства подчиненные (Single Master Protocol, этот вариант протокола используется чаще всего). В протоколе с одним устройством мастер данные могут одновременно передаваться сразу нескольким подчиненным устройствам. Для протокола с несколькими устройствами master все равно в любой момент времени на одной шине должно находиться только одно устройство мастер, т. е. передавать данные по шине может только одно устройство. Подобным образом, когда мастер передает по шине SPI данные всем устройствам slave, в любой момент времени только одно устройство slave может передавать данные устройству master.

Slave-устройство выбирается внешним сигналом NSS, который приходит для него от устройства Master. Если на шине SPI присутствует несколько устройств slave, master генерирует отдельные сигналы выборки для каждого slave (NPCS).

Система SPI состоит из 2 сигналов данных и двух сигналов управления:

• Master Out Slave In (MOSI): это сигнал данных, которые master выдвигает на входы подчиненных устройств (slave).
• Master In Slave Out (MISO): это сигнал данных, которые устройство slave выдвигает на вход главного устройства (master). Здесь может быть подключено больше одного устройства slave, передающих данные в разные моменты времени.
• Serial Clock (SPCK): это управляющий сигнал, который генерирует master, регулируя тем самым поток данных через MOSI и MISO. Master может передавать данные с различными скоростями; сигнал SPCK переключается один раз на каждый передаваемый бит.
• Slave Select (NSS): этот управляющий сигнал позволяет slave-устройству выключится и включиться аппаратно.

ARM7 SPI block diagram fig28 1

Рис. 28-1. Общая блок-схема внутреннего устройства SPI микроконтроллера ARM7 (семейство AT91SAM7 компании Atmel).

Пояснения к рис. 28-1: APB означает Advanced Peripheral Bus (внутренняя шина обмена с периферийными устройствами), PMC означает Power Management Controller (контроллер управления питанием), MCK означает главную тактовую частоту ядра микроконтроллера, PIO означает контроллер параллельного ввода/вывода (см. [4]).

ARM7 SPI application master block diagram example fig28 2

Рис. 28-2. Пример блок-схемы применения SPI в приложении.

Таблица 28-1. Описание сигналов SPI.

Имя вывода
Описание сигнала
Тип сигнала
Master Slave
MISO Master In Slave Out (вход главного устройства и выход подчиненного) вход выход
MOSI Master Out Slave In (выход главного устройства и вхо подчиненного) выход вход
SPCK Serial Clock (сигнал тактирования данных) выход вход
NPCS1..NPCS3 Peripheral Chip Select (сигналы выборки периферийных устройств на шине SPI) выход не используется
NPCS0/NSS Peripheral Chip Select/Slave Select (выборка периферийного устройства/выборка в режиме подчиненного устройства) выход вход

Все выводы, перечисленные в таблице, должны быть соответствующим образом настроены как входы и выходы программированием контроллера PIO.

[Зависимости SPI от других ресурсов]

Порты ввода/вывода. Ножки, используемые для подключения к внешним устройствам SPI, могут мультиплексироваться с другими аппаратными функциями и портами GPIO. Мультиплексирование управляется контроллером PIO [4] с помощью выбора функций периферии A и B. Программист должен сначала запрограммировать контроллеры PIO, чтобы назначить выводы SPI для своих функций периферийного устройства.

Управление питанием. SPI может тактироваться через контроллер управления питанием (Power Management Controller, PMC) [5], таким образом необходимо сначала настроить регистры PMC, чтобы разрешить тактирование SPI.

Этот пример из библиотеки FatFs-07c.

#include "at91sam7x512/AT91SAM7X512.h"
#include < pio/pio.h >
 
#define PPIO_BASE_SPI   AT91C_BASE_PIOA
#define PIN_SPI1_MISO   {1 << 24, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_PULLUP}
#define PIN_SPI1_MOSI   {1 << 23, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT}
#define PIN_SPI1_SPCK   {1 << 22, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT}
#define PIN_MMC_CS      {1 << 21, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_B, PIO_DEFAULT}
#define CARD_SELECT_PIN  AT91C_PIO_PA21
#define AT91C_BASE_SPI AT91C_BASE_SPI1
#define PSPI_BASE      AT91C_BASE_SPI1
#define AT91C_ID_SPI AT91C_ID_SPI1
#define PINS_MMC       PIN_SPI1_MISO, PIN_SPI1_MOSI, PIN_SPI1_SPCK, PIN_MMC_CS
 
const Pin pinsMMC[]    = {PINS_MMC};
 
static void AT91_spiSetSpeed(BYTE speed)
{
   DWORD reg;
 
   if ( speed < SPI_SCBR_MIN ) speed = SPI_SCBR_MIN;
   if ( speed > 1 ) speed &= 0xFE;
   reg = PSPI_BASE->SPI_CSR[SPI_CSR_NUM];
   reg = ( reg & ~(DWORD)(AT91C_SPI_SCBR) ) | ( (DWORD)speed << 8 );
   PSPI_BASE->SPI_CSR[SPI_CSR_NUM] = reg;
}
 
/*-----------------------------------------------------------------------*/
/* Инициализация интерфейса SPI                                          */
/*-----------------------------------------------------------------------*/
static void init_spi( void )
{
   PIO_Configure(pinsMMC, PIO_LISTSIZE(pinsMMC));      //ножки карты SD (SPI)
   // Разрешить тактирование периферийного устройства SPI.
   AT91C_BASE_PMC->PMC_PCER = ( 1 << AT91C_ID_SPI );
   // Запрет SPI:
   PSPI_BASE->SPI_CR = AT91C_SPI_SPIDIS;
   // Сброс и разрешение SPI. Все выглядит так, что для надежного сброса
   // SPI требуется 2 программных сброса:
   PSPI_BASE->SPI_CR = AT91C_SPI_SWRST;
   PSPI_BASE->SPI_CR = AT91C_SPI_SWRST;
   PSPI_BASE->SPI_CR = AT91C_SPI_SPIEN;
   // Режим SPI: master, FDIV=0, функция fault detection запрещена:
   PSPI_BASE->SPI_MR  = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS;
    
   // Настройка регистра chip-select:
   // 8 на фрейм, CPOL=1, ClockPhase=0, DLYBCT = 0
   PSPI_BASE->SPI_CSR[SPI_CSR_NUM] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8;
   // На время инициализации карты SD установить малую скорость:
   AT91_spiSetSpeed(0xFE);
}

Прерывания. У интерфейса SPI имеется сигнал прерывания, подключенный к контроллеру прерываний (Advanced Interrupt Controller, AIC). Работа с SPI по прерываниям требует предварительного программирования AIC перед конфигурированием SPI.

[Функциональное описание SPI]

Режимы работы. SPI работает в режиме Master (главное устройство на шине) или в режиме Slave (подчиненное устройство на шине). Работа в режиме Master программируется записью 1 в бит MSTR регистра режима SPI_MR. Выводы NPCS0 .. NPCS3 все конфигурируются как выходы, вывод SPCK также конфигурируется как выход для генерации тактов, сигнал MISO подключается ко входу приемника и MOSI будет управляться выходом передатчика.

Если бит MSTR записан как 0, то SPI работает в режиме Slave. MISO управляется выходом передатчика, MOSI подключается ко входу приемника, ножка SPCK становится входом и получает тактирование от внешнего устройства master для синхронизации работы передатчика и приемника. Вывод NPCS0 становится входом, и используется как сигнал выборки подчиненного устройства (Slave Select signal, NSS). Выводы NPCS1 .. NPCS3 никак не управляются, и могут быть использованы для других целей (например, как порты GPIO).

Процесс обмена данными программируется идентично для обоих режимов работы. Генератор скорости активизируется только в режиме Master - для генерации тактов SPCK.

Передача и прием данных. Возможны 4 комбинации полярности и фазы для передач данных в обоих направлениях (4 разных, несовместимых друг с другом формата). Полярность тактов программируется битом CPOL регистра выборки чипа (Chip Select Register, SPI_CSR0 .. SPI_CSR3). Фаза тактов программируется битом NCPHA того же регистра. Эти 2 параметра определяют активные перепады тактов для момента времени, когда данные должны быть переключены и прочитаны. Каждый из этих 2 параметров имеет 2 возможных состояния, что и определяет 4 формата. Чтобы обмен данными был возможен, обе стороны обмена по шине SPI должны быть запрограммированы совместимым друг с другом образом. Если используется несколько подчиненных устройств с фиксированной, различной конфигурацией формата, устройство master должно перепрограммировать само себя для обмена данными с каждым отдельным slave-устройством.

Таблица 28-2. Показывает комбинации настроек бит CPOL и NCPHA, определяющих 4 режима (формата) формирования данных.

SPI Mode CPOL NCPHA
0 0 1
1 0 0
2 1 1
3 1 0

На рисунках 28-3 и 28-4 показаны примеры передач данных для фрейма 8 бит.

ARM7 SPI Transfer Format NCPHA1 28 3

Рис. 28-3. Формат данных SPI для варианта настройки NCPHA=1.

Примечание *: в этом месте значение уровня не определено, но обычно здесь будет значение бита MSB от предыдущего принятого фрейма.

ARM7 SPI Transfer Format NCPHA0 28 4

Рис. 28-4. Формат данных SPI для варианта настройки NCPHA=0.

Примечание *: в этом месте значение уровня не определено, но обычно здесь будет значение бита LSB от предыдущего переданного фрейма.

[Режимы работы Master]

Когда SPI работает как Master, тактовый сигнал интерфейса генерируется внутренним программируемым генератором скорости. Это полностью управляет обменом данными в обоих направлениях при обмене со slave-устройствами, подключенными к шине SPI. Интерфейс SPI управляет сигналом выборки slave-устройства и сигналом тактов SPCK.

В интерфейсе SPI имеется 2 регистра для удерживания данных, регистр передачи (Transmit Data Register, SPI_TDR) и регистр приема (Receive Data Register, SPI_RDR), и один регистр сдвига. Регистры SPI_TDR и SPI_RDR поддерживают перенос данных с постоянной скоростью.

После того, как SPI разрешен, обмен данными начинается с момента, когда процессор записывает регистр SPI_TDR. Эти записанные данные немедленно перемещаются в регистр сдвига, и на шине SPI начинается процесс передачи данных в обоих направлениях одновременно. В то время как данные из регистра сдвига последовательно выдвигаются на сигнал MOSI из регистра сдвига, данные с сигнала MISO вдвигаются бит за битом в тот же регистр сдвига. Прием данных не может осуществляться без передачи, эти 2 процесса осуществляются одновременно.

Если используется аппаратная выборка сигналами NPCS[3:0], то перед записью в регистр SPI_TDR должно быть правильно установлено поле PCS в данных, записываемых в этот регистр, чтобы было выбрано нужное slave-устройство. Может также использоваться программная выборка slave-устройств путем простого управления уровнями портов GPIO.

Если новые данные были записаны в SPI_TDR во время процесса передачи, то передача ранее записанных в регистр SPI_TDR данных будет продолжаться до завершения текущей передачи. После завершения текущей передачи принятые данные будут переданы из регистра сдвига в регистр SPI_RDR, и только что записанные новые данные из SPI_TDR будут загружены в регистр сдвига, и начнется новая передача.

Момент завершения переноса в регистр сдвига записанных в SPI_TDR данных индицируется битом TDRE (Transmit Data Register Empty, т. е. бит флага опустошения регистра передачи) регистра состояния (Status Register, SPI_SR). Когда новые данные записаны в SPI_TDR, этот бит очищается. Бит TDRE используется для запуска канала передачи DMA (Transmit PDC channel).

Завершение передачи показывается флагом TXEMPTY в регистре SPI_SR. Если задержка передачи (поле DLYBCT в регистре SPI_CSR0 .. SPI_CSR3) больше 0 для последней передачи, то флаг TXEMPTY установится после истечения этой задержки. В этот момент времени главная тактовая частота процессора (MCK) может быть выключена.

Момент перемещения принятых данных из регистра сдвига в регистр SPI_RDR показывается битом RDRF (Receive Data Register Full, регистр данных приема заполнен) в регистре состояния SPI_SR. Когда принятые данные прочитаны, бит RDRF очищается.

Если регистр приема SPI_RDR не был прочитан перед тем, как поступили новые данные (т. е. программа не успела их прочитать), то установится флаг ошибки переполнения приема (Overrun Error, OVRES) в регистре состояния SPI_SR. Пока этот флаг установлен, данные загружены в SPI_RDR. Пользователь должен прочитать регистр состояния SPI_SR, чтобы очистить бит OVRES.

Рис. 28-5 показывает SPI, когда он работает в режиме Master. Рис. 28-6 показывает процесс обработки обмена данных.

ARM7 SPI Master Mode Block Diagram 28 5

Рис. 28-5. Блок-схема SPI в режиме Master.

ARM7 SPI Master Mode Flow Diagram 28 6

Рис. 28-6. Алгоритм поддержки режима работы Master.

Генерация тактов. Тактовый сигнал SPI, определяющий скорость передачи (SPCK), генерируется на базе частоты процессора (MCK), поделенной на значение между 1 и 255.

Это позволяет осуществлять максимальную рабочую скорость передачи до частоты процессора, и минимальную скорость передачи на частоте бит MCK/255. Значение коэффициента деления задается полем SCBR регистра управления выборкой (Chip Select Register, SPI_CSR0 .. SPI_CSR3).

Программирование поля SCBR значением 0 запрещено. Срабатывание передачи, когда поле SCBR равно 0, может привести к непредсказуемым результатам.

После сброса поле SCBR равно 0, и пользователь должен записать туда допустимое значение (1..255) перед программированием первой передачи.

Делитель SCBR вместе с другими параметрами, определяющими формат, может быть запрограммирован индивидуально для каждого сигнала аппаратной выборки чипа с помощью регистров выборки (Chip Select Registers, SPI_CSR0 .. SPI_CSR3). Это позволяет автоматически адаптировать SPI к скорости передачи каждого подключенного подчиненного устройства без необходимости перепрограммирования периферийного устройства SPI.

Задержки передачи. Рис. 28-7 показывает изменения выборки внешних подчиненных устройств (chip select) и последовательные передачи на одном и том же сигнале выборки. Могут быть запрограммированы 3 задержки, чтобы изменить форму сигналов интерфейса SPI:

• Задержка в изменении сигналов выборки, программируемая одновременно для всех выборок путем записи поля DLYBCS в регистре режима SPI_MR. Это позволяет вставлять задержку перед освобождением сигнала выборки и перед выставлением нового сигнала выборки.
• Задержка перед SPCK, независимо программируемая для каждой выборки путем записи поля DLYBS в регистрах SPI_CSR0 .. SPI_CSR3. Это позволяет начинать выдавать сигнал SPCK с некоторой задержкой после того, как был активизирован сигнал выборки.
• Задержка между последовательными передачами, также независимо программируемая для каждой выборки путем записи поля DLYBCT в регистрах SPI_CSR0 .. SPI_CSR3. Это позволяет вставлять задержку между двумя передачами на одном и том же активном сигнале выборки.

ARM7 SPI Programmable Delays 28 7

Рис. 28-7. Программируемые задержки.

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

Сигналы выборки. Внешние подчиненные подчиненные устройства SPI активизируются сигналами выборки NPCS0 .. NPCS3. По умолчанию все сигналы NPCS не активны перед началом и после окончания каждой передачи.

Выборка периферийных устройств может быть выполнена двумя разными способами:

• Фиксированная выборка (Fixed Peripheral Select): SPI обменивается данными только с одним периферийным подчиненным устройством.
• Изменяемая выборка (Variable Peripheral Select): можно обмениваться данными более чем с одним подчиненным устройством.

Работа Fixed Peripheral Select активизируется записью 0 в бит PS регистра режима SPI_MR. В этом случае текущее периферийное устройство, которое будет выбрано, определяется полем PCS регистра SPI_MR, и поле PCS в регистре передачи SPI_TDR не оказывает никакого эффекта.

Работа Variable Peripheral Select активизируется записью бита PS в 1. Тогда для управления выборкой используется поле PCS в регистре SPI_TDR. Это означает, что новая выборка периферийного устройства может быть определена вместе с каждыми новыми передаваемыми данными.

Fixed Peripheral Selection позволяет организовать передачи буфера с одним периферийным устройством. При этом использование PDC (DMA) осуществляется оптимальным в смысле экономии памяти способом, так как размер каждой ячейки буфера передаваемых данных может быть выбран либо 8 (1 байт), либо 16 бит (2 байта). Однако изменение выборки периферийного устройства требует перепрограммирования регистра режима SPI_MR (чтобы управлять его полем PCS).

Variable Peripheral Selection позволяет осуществлять передачи буфера с несколькими периферийными устройствами без необходимости перепрограммирования регистра режима SPI_MR. Данные, записываемые в регистр SPI_TDR, должны быть шириной в 32 бита, и в них должны быть определены как реальные передаваемые данные, таки и настройка для выборки нужного периферийного устройства. Использование PDC (DMA) в этом режиме требует буферов, где каждая ячейка 32-битная, где данные находятся в младших битах ячейки, поля PCS и LASTXFER находятся в старших битах, однако SPI все еще управляется в соответствии с выбранным количеством передаваемых сигналами MOSI и MISO бит (от 8 до 16), как это запрограммировано в регистрах конфигурирования выборки. Это не очень оптимально с точки зрения размера памяти, выделяемой под буферы, однако очень эффективно в плане обмена данными с несколькими периферийными устройствами без какого-либо вмешательства процессора (управление передачей данных берет на себя система DMA).

Декодирование сигналов выборки. Пользователь может запрограммировать работу SPI с несколькими периферийными устройствами в количестве до 15, если осуществлять аппаратное декодирование сигналов выборки NPCS0..NPCS3 с помощью внешнего дешифратора. Это можно разрешить записью бита PCSDEC регистра режима SPI_MR в значение 1.

Когда осуществляется управление выборками без декодирования (PCSDEC=0), то SPI гарантирует, что в любой момент времени будет активировано (т. е. переведено в уровень лог. 0) не больше одного сигнала выборки, все остальные сигналы выборки останутся в неактивном состоянии (лог. 1). Причем если ошибочно определены в лог. 0 даже 2 бита в поле PCS, то будет выбран только чип с меньшим порядковым номером.

Когда осуществляется управление выборками с применением внешнего декодирования (PCSDEC=1), то SPI напрямую выводит значение поля PCS либо из регистра режима SPI_MR, либо из регистра передачи SPI_TDR (в зависимости от значения бита PS).

Так как SPI устанавливает исходное значение по умолчанию 0xF для неактивного состояния линий выборки (т. е. все линии выборки находятся на уровне лог. 1), когда нет обработки каких-либо передач, то может быть декодировано для выборки не более 15 внешних подчиненных устройств SPI.

У SPI имеется только 4 регистра выборки чипа, а не 15. В результате, когда активирован режим декодирования выборки (PCSDEC=1), каждый регистр выборки может задать выборку только до 4 периферийных устройств. Например, SPI_CRS0 определяет характеристики декодируемых внешне периферийных устройств от 0 до 3, что соответствует значениям поля PCS от 0x0 до 0x3. Таким образом, пользователь должен гарантировать, что совместимые устройства подключены к декодированным выборкам 0 .. 3, 4 .. 7, 8 .. 11 и 12 .. 14.

Снятие сигнала выборки. В нормальном режиме работы как только завершена передача последних записанных в регистр SPI_TDR данных, все сигналы NPCS переходят в лог. 1. Это может привести к ошибке, если процессор слишком долго обрабатывает прерывание, и как следствие может усложнить подключение некоторых периферийных устройств, которые требуют, чтобы сигнал выборки оставался активным во время всего набора передач.

Чтобы упростить работу с такими устройствами, в регистре выборки (SPI_CSR0 .. SPI_CSR3) может быть запрограммирован бит CSAAT (Chip Select Active After Transfer) в состояние 1. Это позволит оставаться сигналу выборки в своем текущем активном состоянии (в лог. 0), пока не потребуется обмен с другим периферийным устройством.

На рис. 28-8 показаны случаи различной отмены выборки, что управляется битом CSAAT.

ARM7 SPI Peripheral Deselection 28 8

Рис. 28-8. Режимы отмены выборки.

Детектирование состояния отказа (Mode Fault Detection). Режим отказа детектируется, когда SPI запрограммирован в режиме Master, на шине SPI находится несколько устройств master, и при этом внешний master (ошибочно) установил активный низкий уровень на сигнале NPCS0/NSS. NPCS0, MOSI, MISO и SPCK для режима нескольких мастеров на шине должны быть сконфигурированы для буфера с открытым стоком с помощью контроллера PIO (см. [4]), так что требуется подключение внешних верхних нагрузочных резисторов (pull-up), чтобы гарантировать появление высокого уровня на сигналах шины (внутренние pull-up могут подойти только для малых скоростей передач).

Когда был детектирован отказ (mode fault), в регистре состояния SPI_SR установится бит MODF, пока регистр SPI_SR не будет программно прочитан, и SPI автоматически запрещается записью в лог. 1 бита SPIEN управляющего регистра SPI_CR.

По умолчанию схемы детектирования Mode Fault разрешены. Пользователь может запретить детектирование Mode Fault путем установки бита MODFDIS в регистре режима SPI_MR.

[Режим работы Slave]

При работе в режиме подчиненного устройства шины SPI (Slave Mode), SPI обрабатывает биты данных по тактам, поступающим снаружи от вывода SPCK (сигналы тактов генерируются внешним устройством master).

SPI ждет активации (перехода в лог. 0) сигнала NSS перед началом приема сигналов тактов от внешнего главного устройства. Когда NSS переходит в лог. 0, тактовый сигнал проходит проверку через блок сериализатора, который обрабатывает то количество бит, которое определено в поле BITS регистра выборки 0 (Chip Select Register 0, SPI_CSR0). Биты обрабатываются в соответствии с фазой и полярностью, которые определены соответственно битами NCPHA и CPOL регистра SPI_CSR0. Обратите внимание, что биты BITS, CPOL и NCPHA других регистров выборки (SPI_CSR1 .. SPI_CSR3) не оказывают никакого влияния на поведение SPI, запрограммированного для работы в Slave Mode.

Биты по тактам SPCK выдвигаются через сигнал MISO и оцифровываются на сигнале MOSI.

Когда все биты фрейма обработаны, принятые данные перемещаются в регистр приема SPI_RDR, и устанавливается бит RDRF в регистре состояния SPI_SR. Если регистр SPI_RDR не был прочитан перед поступлением новых данных (программа не успела это сделать), то установится бит ошибки переполнения (Overrun Error, OVRES) в регистре SPI_SR. Пока этот флаг OVRES установлен, данные остаются загруженными в регистре SPI_RDR. Чтобы очистить бит OVRES, программа должна прочитать регистр SPI_SR.

Когда начинается передача, данные выдвигаются наружу из регистра сдвига. Если не были записаны данные в регистр передачи SPI_TDR, то будут переданы последние принятые данные. Если с момента сброса не было принято никаких данных, то все передаваемые биты будут переданы как нули, так как после сброса регистр сдвига сбрасывает свое значение в 0.

Когда первые данные были записаны в регистр передачи SPI_TDR, они немедленно перемещаются в регистр сдвига, и устанавливается бит TDRE в регистре состояния SPI_SR. Если после этого сразу записаны новые данные, то они останутся в регистре SPI_TDR (не будут пока переданы в регистр сдвига) до тех пор, пока не завершится передача, т. е. NSS переходит в лог. 0, и на выводе SPCK прошло требуемое количество допустимых тактов. Когда происходит передача, последние записанные в регистр SPI_TDR данные перемещаются в регистр сдвига, и устанавливается бит TDRE в регистре состояния SPI_SR. Это позволяет частые обновления критических переменных с одиночными передачами.

Затем новые данные загружаются в регистр сдвига из регистра передачи SPI_TDR. В том случае, когда для передачи не готовы новые данные, т. е. они не были записаны в регистр SPI_TDR с момента последней загрузки SPI_TDR в регистр сдвига, то регистр сдвига останется не измененным, и будут переданы последние принятые данные.

На рис. 28-9 показана блок-схема SPI в Slave Mode.

ARM7 SPI Slave Mode Functional Block Diagram 28 9

Рис. 28-9. Функциональная схема режима работы Slave.

[Интерфейс программирования SPI]

В таблице ниже показаны регистры SPI. В крайнем левом столбце показано смещение относительно начального базового адреса интерфейса. Например, у микроконтроллеров AT91SAM7X128, AT91SAM7X256, AT91SAM7X512 есть два интерфейса SPI: SPI0 и SPI1. У интерфейса SPI0 базовый адрес равен 0xFFFE0000 (равен адресу регистра управления AT91C_SPI0_CR), а у SPI1 базовый адрес 0xFFFE4000 (равен адресу регистра управления AT91C_SPI1_CR).

Таблица 28-3. Регистры SPI.

Смещение Регистр Имя Доступ Сброс
0x0000 Control Register (регистр управления) SPI_CR W -
0x0004 Mode Register (регистр режима) SPI_MR R/W 0x00000000
0x0008 Receive Data Register (регистр данных приема) SPI_RDR R 0x00000000
0x000C Transmit Data Register (регистр данных передачи) SPI_TDR W -
0x0010 Status Register (регистр состояния) SPI_SR R 0x000000F0
0x0014 Interrupt Enable Register (регистр разрешения прерываний) SPI_IER W -
0x0018 Interrupt Disable Register (регистр запрета прерываний) SPI_IDR W -
0x001C Interrupt Mask Register (регистр маски прерываний) SPI_IMR R 0x00000000
0x0020..0x002C Зарезервировано - - -
0x0030 Chip Select Register 0 (регистр выборки периферийного устройства 0) SPI_CSR0 R/W 0x00000000
0x0034 Chip Select Register 1 (регистр выборки периферийного устройства 1) SPI_CSR1 R/W 0x00000000
0x0038 Chip Select Register 2 (регистр выборки периферийного устройства 2) SPI_CSR2 R/W 0x00000000
0x003C Chip Select Register 3 (регистр выборки периферийного устройства 3) SPI_CSR3 R/W 0x00000000
0x004C..0x00FC Зарезервировано - - -
0x100..0x124 Используется для PDC (DMA), см. [6]    

Регистр управления SPI (SPI Control Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
-
- - - - - - LASTXFER - - - - - - -
-
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
-
- - - - - - - SWRST - - - - - SPIDIS SPIEN

SPIEN: SPI Enable, разрешение работы SPI.
0 = не оказывает эффекта.
1 = разрешает для SPI передачу и прием данных.

SPIDIS: SPI Disable, запрет работы SPI.
0 = не оказывает эффекта.
1 = запрещает SPI.

Как только SPIDIS установлен, SPI завершает свои передачи.

Все выводы устанавливаются в режиме входа, и никакие данные не принимаются и не передаются.

Если в момент установки бита SPIDIS осуществляется передача, то перед запретом SPI она завершается.

Если при записи регистра управления оба бита, и SPIEN и SPIDIS равны 1, то SPI запрещается.

SWRST: SPI Software Reset, программный сброс SPI.
0 = не оказывает эффекта.
1 = сбрасывает SPI. Будет выполнен вызванный программным обеспечением аппаратный сброс интерфейса SPI.

После программного сброса SPI находится в Slave Mode. Программный сброс не влияет на каналы PDC.

LASTXFER: Last Transfer, последняя передача.
0 = не оказывает эффекта.
1 = с текущего NPCS будет снята выборка после того, как записанные в регистр передачи (SPI_TDR) данные были переданы. Когда бит CSAAT установлен, это позволяет закрыть обмен с текущим периферийным устройством путем перевода в лог. 1 соответствующего сигнала выборки NPCS, как только передача содержимого регистра данных завершится.

Это поле используется только тогда, когда активен режим изменяемой выборки внешних подчиненных устройств (Variable Peripheral Select, PS = 1).

Регистр режима SPI (SPI Mode Register). Работает на чтение и на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
DLYBCS - - - - PCS
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
-
- - - - - - - LLB - - MODFDIS - PCSDEC PS MSTR

MSTR: Master/Slave Mode, режим работы SPI - как главное или как подчиненное устройство.
0 = SPI в режиме Slave (подчиненное устройство).
1 = SPI в режиме Master (главное устройство).

PS: Peripheral Select, принцип выборки периферийных устройств.
0 = Fixed Peripheral Select, фиксированный выбор периферии.
1 = Variable Peripheral Select, изменяемый выбор периферии.

PCSDEC: Chip Select Decode, разрешение внешнего декодера выборки.
0 = выборка внешних устройств напрямую подключается к периферийным подчиненным устройствам, без внешнего дешифратора.
1 = четыре сигнала выборки подключаются к декодеру 4-в-16.

Когда PCSDEC равен 1, могут генерироваться до 15 выборок подчиненных устройств SPI с помощью внешней декодирующей схемы. Регистры выборки (SPI_CSRx) определяют характеристики этих 15 выборок, подчиняясь следующим правилам:

SPI_CSR0 определяет сигналы выборки 0 .. 3.
SPI_CSR1 определяет сигналы выборки 4 .. 7.
SPI_CSR2 определяет сигналы выборки 8 .. 11.
SPI_CSR3 определяет сигналы выборки 12 .. 14.

MODFDIS: Mode Fault Detection, детектирование отказа режима работы с несколькими мастерами на шине.
0 = режим детектирования отказа разрешен.
1 = режим детектирования отказа запрещен.

LLB: Local Loopback Enable, разрешение внутреннего замыкания входа данных на выход.
0 = петля закольцовывания запрещена (нормальный режим работы).
1 = вход данных соединен с выходом (применяется для тестирования).

LLB управляет подключением петли обратной связи для закольцовывания сериализатора данных, что применяется для тестирования только в режиме Master (MISO внутри кристалла логически соединяется с MOSI).

PCS: Peripheral Chip Select, выборка периферийного подчиненного устройства.

Это поле используется только в том случае, когда работает режим фиксированной выборки периферийных устройств (Fixed Peripheral Select, PS = 0).

PCS = xxx0 NPCS[3:0] = 1110
PCS = xx01 NPCS[3:0] = 1101
PCS = x011 NPCS[3:0] = 1011
PCS = 0111 NPCS[3:0] = 0111
PCS = 1111 запрещенное состояние (выборка периферийных устройств не генерируется)

Здесь x означает любое возможное значение уровня. Если PCSDEC = 1, то значение PCS напрямую попадает на внешние сигналы выхода NPCS[3:0] (для формирования выборок должна использоваться схема внешней дешифрации).

DLYBCS: Delay Between Chip Selects, задержка между сигналами выборки.

Это поле определяет задержку от неактивного состояния сигнала NPCS до активации другого сигнала NPCS. Время DLYBCS гарантирует отсутствие перекрытия во времени выборок подчиненных периферийных устройств, и решает конкуренцию по шине, когда периферийные устройства имеют большие, плавающие времена реакции.

Если DLYBCS меньше или равно 6, то по умолчанию будет вставлена задержка в 6 периодов тактов MCK. Иначе для вычисления времени задержки будет использоваться следующая формула:

                            DLYBCS
Задержка между выборками = --------
                             MCK

Регистр данных приема SPI (SPI Receive Data Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
-
- - - - - - - - - - - PCS
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
RD

RD: Receive Data, принятые данные. Данные, которые принял интерфейс SPI, сохраняются в этом поле с выравниванием вправо. Не используемые биты равны 0.

PCS: Peripheral Chip Select, данные для выборки периферийных подчиненных устройств.

Только в режиме Master эти биты показывают уровни на сигналах выборки NPCS по окончании передачи. Иначе эти биты будут читаться как 0.

Регистр данных передачи SPI (SPI Transmit Data Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
-
- - - - - - LASTXFER - - - - PCS
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
TD

TD: Transmit Data, передаваемые данные. В этом регистре сохраняются данные, которые должен передать интерфейс SPI. Данные сохраняются в этом поле с выравниванием вправо.

PCS: Peripheral Chip Select, данные для выборки периферийных подчиненных устройств.

Это поле используется только когда активен режим переменной выборки периферийных устройств (Variable Peripheral Select, PS = 1). Если PCSDEC = 0:

PCS = xxx0 NPCS[3:0] = 1110
PCS = xx01 NPCS[3:0] = 1101
PCS = x011 NPCS[3:0] = 1011
PCS = 0111 NPCS[3:0] = 0111
PCS = 1111 запрещенное состояние (выборка периферийных устройств не генерируется)

Здесь x означает любое возможное значение уровня. Если PCSDEC = 1, то значение PCS напрямую попадает на внешние сигналы выхода NPCS[3:0] (для формирования выборок должна использоваться схема внешней дешифрации).

LASTXFER: Last Transfer, последняя передача.
0 = не оказывает эффекта.
1 = текущие выборки NPCS будут переведены в неактивный уровень после того, как будет переда последний записанный в регистр передачи SPI_TDR фрейм данных. Когда бит CSAAT установлен, это позволяет закрыть обмен с текущим периферийным устройством путем перевода в высокий уровень сигнала NPCS, так только передача завершится.

Это поле используется только если активен режим переменной выборки периферийных устройств (Variable Peripheral Select, PS = 1).

Регистр состояния SPI (SPI Status Register). Работает только на чтение.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
-
- - - - - - - - - - - - - - SPIENS
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
- - - - - - TXEMPTY NSSR TXBUFE RXBUFF ENDTX ENDRX OVRES MODF TDRE RDRF

RDRF: Receive Data Register Full, регистр данных приема заполнен новыми данными.
0 = не было принято новых данных с момента последнего чтения регистра SPI_RDR.
1 = был принят новый фрейм данных с момента последнего чтения регистра SPI_RDR.

TDRE: Transmit Data Register Empty, регистр данных передачи пуст.
0 = данные, которые были записаны в регистр SPI_TDR, еще не попали в сериализатор.
1 = данные, которые были записаны в регистр SPI_TDR, попали в сериализатор, и регистр SPI_TDR готов к получению новых данных.

TDRE равен 0, когда SPI запрещен, или после сброса. Команда, разрешающая SPI, установит этот бит в 1.

MODF: Mode Fault Error, ошибка режима.
0 = с момента последнего чтения SPI_SR не было детектировано состояние Mode Fault.
1 = с момента последнего чтения SPI_SR было детектировано состояние Mode Fault.

OVRES: Overrun Error Status, флаг ошибки, связанной с переполнением на приеме.
0 = с момента последнего чтения SPI_SR не было детектировано переполнения приема.
1 = с момента последнего чтения SPI_SR было детектировано переполнение приема.

Переполнение (overrun) происходит, когда регистр SPI_RDR был загружен как минимум дважды с момента последнего чтения SPI_RDR.

ENDRX: End of RX buffer, окончание буфера приема.
0 = регистр счетчика приема (Receive Counter Register) не достиг нуля с момента последней записи в регистры SPI_RCR(1) или SPI_RNCR(1).
1 = регистр счетчика приема достиг нуля с момента последней записи в регистры SPI_RCR(1) или SPI_RNCR(1).

ENDTX: End of TX buffer, окончание буфера передачи.
0 = регистр счетчика передачи (Transmit Counter Register) не достиг нуля с момента последней записи в регистры SPI_TCR(1) или SPI_TNCR(1).
1 = регистр счетчика передачи достиг нуля с момента последней записи в регистры SPI_TCR(1) или SPI_TNCR(1).

Примечание (1): регистры SPI_RCR, SPI_RNCR, SPI_TCR, SPI_TNCR физически находятся в контроллере прямого доступа к памяти (PDC, см. [6]).

RXBUFF: RX Buffer Full, буфер приема заполнен.
0 = в регистрах SPI_RCR(1) или SPI_RNCR(1) находится значение, отличное от 0.
1 = в обоих регистрах SPI_RCR(1) и SPI_RNCR(1) находится значение 0.

TXBUFE: TX Buffer Empty, буфер передачи пуст.
0 = в регистрах SPI_TCR(1) или SPI_TNCR(1) находится значение, отличное от 0.
1 = в обоих регистрах SPI_TCR(1) и SPI_TNCR(1) находится значение 0.

NSSR: NSS Rising, нарастание сигнала выборки.
0 = не было детектировано нарастание уровня на выводе NSS с момента последнего чтения.
1 = было детектировано нарастание уровня на выводе NSS с момента последнего чтения.

TXEMPTY: Transmission Registers Empty, регистры передачи пусты.
0 = в момент, когда данные только что были записаны в регистр SPI_TDR.
1 = регистр SPI_TDR и внутренний регистр сдвига оба пусты. Если определена задержка передачи, TXEMPTY установится после завершения этой задержки.

SPIENS: SPI Enable Status, состояние разрешения SPI.
0 = SPI запрещен.
1 = SPI разрешен.

Регистр разрешения прерываний SPI (SPI Interrupt Enable Register). Работает только на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
-
- - - - - - - - - - - - - - -
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
- - - - - - TXEMPTY NSSR TXBUFE RXBUFF ENDTX ENDRX OVRES MODF TDRE RDRF

RDRF: Receive Data Register Full Interrupt Enable, разрешение прерывания по событию заполненности регистра данных приема.

TDRE: SPI Transmit Data Register Empty Interrupt Enable, разрешение прерывания по событию опустошения регистра данных передачи.

MODF: Mode Fault Error Interrupt Enable, разрешение прерывания по событию ошибки режима.

OVRES: Overrun Error Interrupt Enable, разрешение прерывания по событию ошибки переполнения приема.

ENDRX: End of Receive Buffer Interrupt Enable, разрешение прерывания по событию окончания буфера приема.

ENDTX: End of Transmit Buffer Interrupt Enable, разрешение прерывания по событию окончания буфера передачи.

RXBUFF: Receive Buffer Full Interrupt Enable, разрешение прерывания по событию заполнения буфера приема.

TXBUFE: Transmit Buffer Empty Interrupt Enable, разрешение прерывания по событию опустошения буфера передачи.

NSSR: NSS Rising Interrupt Enable, разрешение прерывания по событию нарастания сигнала NSS.

TXEMPTY: Transmission Registers Empty Enable, разрешение прерывания по событию опустошения регистров передачи.

0 = не дает никакого эффекта.

1 = разрешает соответствующее прерывание.

Регистр запрета прерываний SPI (SPI Interrupt Disable Register). Работает только на запись. Все биты те же самые, что и у регистра SPI_IER, только запись в них 1 оказывает обратное действие - не разрешение, а запрет прерывания.

0 = не дает никакого эффекта.
1 = запрещает соответствующее прерывание.

Регистр маски прерываний SPI (SPI Interrupt Mask Register). Работает только на чтение. Все биты те же самые, что и у регистров SPI_IER и SPI_IER, только здесь они показывают состояние разрешенности соответствующего прерывания.

0 = соответствующее прерывание не разрешено.
1 = соответствующее прерывание разрешено.

Регистры управления выборкой SPI (SPI Chip Select Register). Работает на чтение и на запись.

   31      30       29       28       27       26       25       24       23       22       21       20       19       18       17       16   
DLYBCT DLYBS
   15       14       13       12       11       10       9       8       7       6       5       4       3       2       1       0   
SCBR BITS CSAAT - NCPHA CPOL

CPOL: Clock Polarity, полярность тактов бит.
0 = неактивное состояние значения, когда SPCK находится в лог. 0.
1 = неактивное состояние значения, когда SPCK находится в лог. 1.

CPOL используется для определения неактивного состояния тактов бит (SPCK). Бит CPOL совместно с битом NCPHA используется для выбора взаимодействия между тактами/данными главных и подчиненных устройств на шине SPI.

NCPHA: Clock Phase, фаза тактов бит.
0 = данные меняют свое значение по фронту нарастания уровня тактов SPCK, и значение данных захватывается по последующему спаду уровня тактов SPCK.
1 = данные захватываются по фронту нарастания уровня тактов SPCK, и данные меняют свое значение по последующему спаду уровня тактов SPCK.

NCPHA определяет, какой перепад SPCK приводит к изменению сигнала данных, и какой перепад приводит к считыванию значения бита данных. Бит NCPHA совместно с битом CPOL используется для выбора взаимодействия между тактами/данными главных и подчиненных устройств на шине SPI.

CSAAT: Chip Select Active After Transfer, активен ли сигнал выборки после передачи.
0 = сигнал выборки периферийного устройства перейдет в 1, как только будет выполнена последняя передача.
1 = сигнал выборки периферийного устройства не перейдет в 1, как только будет выполнена последняя передача. Сигнал выборки останется активным (лог. 0), пока не будет запрошена передача на другом выбранном периферийном устройстве.

BITS: Bits Per Transfer, определяет количество бит во фрейме данных.

Это поле определяет, сколько бит данных будет передано и принято. Зарезервированные значения не должны использоваться.

BITS Количество бит данных
0000 8
0001 9
0010 10
0011 11
0100 12
0101 13
0110 14
0111 15
1000 16
1001 .. 1111 Все эти значения зарезервированы.

SCBR: Serial Clock Baud Rate, настройка скорости.

В режиме Master интерфейс SPI использует счетчик по модулю, чтобы задавать требуемую скорость формирования бит SPCK. Частота бит SPCK получается путем деления главной частоты тактов процессора MCK. Скорость выбирается записью значения в поле SCBR от 1 до 255. Следующее выражение определяет частоту переключения тактов SPCK:

                 MCK
SPCK Baudrate = ------
                 SCBR

Программирование поля SCBR значением 0 запрещено. Запуск передачи, когда SCBR равно 0, может привести к непредсказуемым результатам. После сброса SCBR установлено в 0, и пользователь должен запрограммировать в поле SCBR ненулевое значение перед выполнением первой передачи.

DLYBS: Delay Before SPCK, задержка перед тактами.

Это поле определяет задержку от момента активизации выборки NPCS до первого перепада тактов SPCK.

Когда DLYBS равно 0, задержка между появлением допустимого сигнала NPCS и перепадом SPCK составляет 1/2 от длительности периода SPCK.

Иначе для определение задержки используется следующее выражение:

                     DLYBS
Delay Before SPCK = -------
                      MCK

DLYBCT: Delay Between Consecutive Transfers, задержка между следующими друг за другом передачами.

Это поле определяет задержку между двумя соседними передачами с одним и тем же периферийным устройством без снятия сигнала выборки. Эта задержка всегда вставляется после каждой передачи и перед снятием сигнала выборки, если это необходимо.

Когда DLYBCT равно 0, то задержка между соседними передачами не вставляется, и такты бит сохраняют свой рабочий цикл по всем передачам фреймов данных.

Иначе будет использоваться следующее выражение для вычисления задержки:

                                       32 * DLYBCT
Задержка между соседними передачами = -------------
                                           MCK

[Ссылки]

1. SAM7X512 / SAM7X256 / SAM7X128 DATASHEET site:atmel.com.
2. Интерфейс SPI.
3. AT91SAM7X: работа с портом SPI в режиме master.
4. AT91SAM7 Parallel Input/Output Controller (PIO).
5. Power Management Controller микроконтроллера AT91SAM7X.
6. AT91SAM7X: контроллер PDC.

 

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


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

Top of Page