Таблица 2.
Описание режимов SPI
SPICLK | Режим | Описание | |
Полярность | Фаза | ||
0 | 0 | 0 | Неактивный уровень SPICLK - низкий, фронт импульса позитивен. Данные, выводятся на SPIMOSI по спаду импульса. Считывание с SPIMISO происходит по фронту импульса |
0 | 1 | 1 | Неактивный уровень SPICLK - низкий, фронт импульса позитивен. Данные выводятся на SPIMOSI по фронту импульса. Считывание с SPIMISO происходит по спаду импульса. |
1 | 0 | 2 | Неактивный уровень SPICLK - высокий, фронт импульса негативен. Данные выводятся на SPIMOSI по фронту импульса. Считывание с SPIMISO происходит по спаду импульса. |
1 | 1 | 3 | Неактивный уровень SPICLK - высокий, фронт импульса негативен. Данные выводятся на SPIMOSI по спаду импульса. Считывание с SPIMISO происходит по фронту импульса. |
Выбор линии SPISELn осуществляют функцией vAHI_SpiSelect (). Если более, чем одна линия SPISEL должна использоваться в системе, они должны использоваться в числовом порядке, например если 3 линии выбора SPI должны использоваться, они должны быть SPISEL0, 1 и 2. Количеством линий SPISEL, которое будет использоваться в системе, управляют функцией vAHI_SpiConfigure (). Линия SPISEL может автоматически деутверждаться между транзакциями, если это необходимо, или остается утвержденной до вызова vAHI_SpiSelect ().
Для устройств, таких как блоки памяти, способных передать большое количество данных контроллеру, возможность линии выбора оставаться утвержденной является преимуществом, так как это разрешает работу устройства в течение всей передачи.
Транзакция по шине SPI начинается с установки конфигурации функцией vAHI_SpiConfigure (), и затем выбора подчиненного устройства, используя vAHI_SpiSelect (). Передача начинается с вызова функции vAHI_SpiStartTransferxx (), где хх определяет разрядность передачи (8, 16 или 32 бита). Данные помещаются в FIFO буфер данных и передаются синхронно с SPICLK бит за битом. Так как передача является полнодуплексной, то же самое число бит, что и переданное, может быть получено от подчиненного устройства. Данные, которые получены во время этой передачи, могут читаться, используя u32AHI_SpiReadTransferxx () (хх - 8, 16 или 32 бита). После завершения транзакции может быть сгенерировано прерывание. Эта опция задается функцией vAHI_SpiConfigure (). Альтернативно интерфейс может быть опрошен, используя функции bAHI_SpiPollBusy () или vAHI_SpiWaitBusy (). Если подчиненное устройство желает сообщить JN513x, что у него есть данные для контроллера, для этой цели оно это может быть подключено к одному из выводов DIO, запрограммированный на прием внешнего прерывания.
10.1. Пример программы
Программа инициализирует SPI и выполняет простое чтение из подчиненного устройства. Читаемое устройство требует 40 тактов для посылки 8-битовой команды, 24-битового адреса и получения 8-битовых данных. Это не может быть выполнено посредством единственной передачи, таким образом множественные передачи объединены без автоматического деутверждения выборов. Формы волны, сгенерированные кодом программы, показаны на рисунке 20.
Текст программы:
PRIVATE void vReadFromFlash(uint32 u32Addr,
uint32 u32NumWords,
uint32 *pau32Buffer )
{
#define FLASHREADCMD 0x03
#define SPI_SLCT_NONE 0x00
uint32 u32Temp;
uint32 i;
vAHI_SpiConfigure( 1, /* количество используемых линий */
E_AHI_SPIM_MSB_FIRST, /* посылать данные,
начиная со старшего бита */
E_AHI_SPIM_TXNEG_EDGE, /* передача данных
по спаду импульса */
E_AHI_SPIM_RXNEG_EDGE, /* прием данных по спаду импульса */
0, /* частота SPICLK 16MHz */
E_AHI_SPIM_INT_DISABLE, /* Отключить прерывание SPI */
E_AHI_SPIM_AUTOSLAVE_DSABL); /* Отключить автоподчинение
устройства */
/* объединить команду чтения в единственное значение, которое будет послано в SPI */ u32Temp = (u32Addr & 0x00FFFFFF) | (FLASHREADCMD << 24);
/* выбор SPI устройства */
vAHI_SpiSelect(E_AHI_SPIM_SLAVE_ENBLE_0);
/* посылка команды чтения и адреса устройству */
vAHI_SpiStartTransfer32(u32Temp);
vAHI_SpiWaitBusy();
for (i=0; i<=u32NumWords; i++)
{
/* чтение данных по 4 байта за раз */
vAHI_SpiStartTransfer32(u32Addr);
vAHI_SpiWaitBusy();
/* чтение в переменную temp */
u32Temp = u32AHI_SpiReadTransfer32();
/* копирование данных в буфер */
memcpy( (pau32Buffer+i), &u32Temp, sizeof(u32Temp) );
}
/* отключение SPI устройства */
vAHI_SpiSelect(SPI_SLCT_NONE);
}
Рис. 20. Временные диаграммы SPI.
11. Интеллектуальный периферийный интерфейс
Интеллектуальный Периферийный Интерфейс (IP) предназначен для работы с более сложными системами, где есть процессор, требующий беспроводной периферии (рис. 21). Как пример, JN513x может обеспечить реализацию IEEE802.15.4, ZigBee или другую беспроводную сеть на телефон, компьютер, карманный компьютер или игровую консоль. Никакие ресурсы не требуются от главного процессора по сравнению с приемопередатчиком, поскольку выполнение беспроводного протокола может происходит на внутреннем центральном процессоре JN513x.
Интеллектуальный периферийный интерфейс - подчиненный интерфейс SPI, использует штырьки, мультиплексные с линиями DIO. Интерфейс создан для передачи сообщений и данных. Данные, полученные и переданные по интерфейсу IP, скопированы непосредственно в и из специализированной области памяти без вмешательства от центрального процессора. Эта область памяти - интеллектуальный блок внешней памяти - содержит 64 32-разрядных слова, образующие буфер передачи / приема.
Рис. 21. Интеллектуальный периферийный интерфейс.
Интерфейс соответствует протоколу SPI. Имеется возможность выбора фронта синхроимпульса IP_CLK, по которому данные считываются с линии IP_DI интерфейса, и изменяется состояние линии вывода данных IP_DO. Порядок передачи - MSB сначала. Когда устройство неактивно, то есть устройство не выбрано через IP_SEL, выход данных IP_DO в третьем состоянии. Линия IP_INT вывода прерывания позволяет JN513x может сообщить ведущему устройству, что контроллера есть данные для передачи.
Интерфейс IP передает сигналы по линиям IP_CLK, IP_DO, IP_DI, IP_SEL, IP_INT – мультиплексны со штырьками DIO14 - 18 соответственно.
11.1. Формат передаваемых данных
Передачи инициализируются отдаленным процессором активизацей им линии IP_SEL, а заканчиваются деактивизацией IP_SEL.
Передачи данных двунаправлены, трафик в оба направления состоит байта состояния, байта длины данных (числа 32-разрядных передаваемых слов) и пакета данных (от принимающего, и передающего буферов). Первый байт, переданный в любом направлении, является байтом состояния со следующим форматом:
Таблица 3.
Описание полей байта состояния
Бит | Поле | Описание |
7:2 | RSVD | Зарезервированы, установлены в 0 |
1 | TXRDY | 1: Данные поставлены в очередь для передачи |
0 | RXRDY | 1: Буфер готов к приему данных |
Если данные поставлены в очередь для передачи, и получатель указал о готовности к приему (RXRDY во входящем байте состояния установлен в 1), следующий переданный байт будет является длиной данных. Если у JN513x или у отдаленного процессора нет никаких данных для передачи, то длина данных должна быть установлена в нуль. Передача может быть закончена отдаленным процессором после посылки ему байта состояния, если невозможно отправить данные ни в одном из направлений. Это может быть причиной того, что ни у какой стороны нет данных для передачи или получатель не имеет буфера в наличии. Если длина данных является ненулевой, данные из буфера передачи JN513x передаются, начиная с начала буфера. В то же самое время, приемный буфер JN513x заполняется входящими данными с его начала.
Отдаленный процессор, действуя как ведущий, должен определить большую из его приходящих или уходящих передач данных и деактивизировать IP_SEL, когда все передаваемые и получаемые данные переданы. Данные передаются в или из буферов, начиная с самого младшего адреса в буфере; каждое слово транслируется, начиная с MSB на последовательных линиях данных (рис 22).
Рис. 22. Временные диаграммы работы IP.
11.2. Передача по инициативе JN513x
Отправляемые JN513x данные записываются или в 0, или в 1 буфер интеллектуальной области внешней памяти. Затем вызовом функции bAHI_IpSendData () записывается буферное число вместе с длиной данных. Если вызов успешен, активизируется линия прерывания IP_INT, сообщая отдаленному процессору о наличии сообщения, готовом к отправке от JN513x. Когда отдаленный процессор начинает передачу в JN513x активизацией IP_SEL, линия IP_INT деактивизируется. Если передача неудачна и данные не переданы, тогда IP_INT снова активизируется для указания того, что данные все еще ожидают отправки.
Интерфейс может быть сконфигурирован на выработку внутреннего прерывания всякий раз, когда транзакция завершается (например, IP_SEL деактивизируется после начала передачи). Можно замаскировать это прерывание. О конце передачи может сообщить прерывание, или опрос интерфейса функцией bAHI_IpTxDone ()