- Что такое коммуникационный протокол SPI?
- Как работает протокол SPI?
- Разница между коммуникациями I2C и SPI
- SPI с PIC16F877A с использованием XC8 Compiler:
- Описание файла заголовка SPI:
- Основная программа Пояснение:
- Моделирование PIC с помощью отладчика SPI:
Микроконтроллеры PIC - мощная платформа, предоставляемая микрочипом для встраиваемых проектов; его универсальный характер позволил ему найти пути во многих приложениях, и ему еще предстоит значительно разрастись. Если вы следовали нашим руководствам по PIC, то вы бы заметили, что мы уже рассмотрели широкий спектр руководств по микроконтроллерам PIC, начиная с самых основ. В том же потоке мы продолжаем изучать протоколы связи, доступные с PIC, и способы их использования. Мы уже рассмотрели I2C с микроконтроллером PIC.
В огромной системе встроенных приложений ни один микроконтроллер не может выполнять все действия самостоятельно. На определенном этапе он должен связаться с другими устройствами для обмена информацией, существует множество различных типов протоколов связи для обмена этой информацией, но наиболее часто используемые из них - это USART, IIC, SPI и CAN. У каждого протокола связи есть свои преимущества и недостатки. Давайте пока сосредоточимся на протоколе SPI, поскольку это то, что мы собираемся изучить в этом руководстве.
Что такое коммуникационный протокол SPI?
Термин SPI означает « последовательный периферийный интерфейс ». Это общий протокол связи, который используется для передачи данных между двумя микроконтроллерами или для чтения / записи данных с датчика на микроконтроллер. Он также используется для связи с SD-картами, регистрами сдвига, контроллерами дисплея и многим другим.
Как работает протокол SPI?
Связь SPI является синхронной, то есть она работает с помощью тактового сигнала, который распределяется между двумя устройствами, которые обмениваются данными. Кроме того, это полнодуплексная связь, поскольку она может отправлять и получать данные по отдельной шине. Для связи SPI требуется 5 проводов. Ниже показана простая схема связи SPI между ведущим и ведомым устройством.
Для связи необходимы пять проводов: SCK (последовательные часы), MOSI (главный выход, подчиненный вход), MISO (главный вход, подчиненный выход) и SS (выбор подчиненного). Связь SPI всегда происходит только между ведущим и ведомым. К ведущему устройству может быть подключено несколько ведомых устройств. Мастер отвечает за генерацию тактового импульса, и он используется всеми подчиненными. Также все коммуникации могут быть инициированы только мастером.
Вывод SCK (также известный как последовательные часы SCL) разделяет тактовый сигнал, генерируемый ведущим устройством, с ведомыми устройствами. Вывод MOSI (также известный как SDA –Serial Data Out) используется для отправки данных от мастера к мази. Вывод MISO (он же SDI - Serial Data In) используется для передачи данных от мази мастеру. Вы также можете следить за стрелкой на рисунке выше, чтобы понять движение данных / сигнала. Наконец, вывод SS (он же CS –Chip select) используется, когда к ведущему подключено более одного подчиненного модуля. Это можно использовать для выбора необходимого ведомого. Пример схемы, в которой более одного подчиненного устройства подключено к главному устройству для связи SPI, показан на схеме ниже.
Разница между коммуникациями I2C и SPI
Мы уже изучили связь I2C с PIC, поэтому мы должны быть знакомы с тем, как работает I2C и где мы можем их использовать, например, I2C может использоваться для интерфейса модуля RTC. Но теперь зачем нам протокол SPI, когда у нас уже есть I2C. Причина в том, что коммуникации I2C и SPI по-своему являются преимуществами и, следовательно, зависят от приложения.
В некоторой степени связь I2C может рассматриваться как имеющая некоторые преимущества перед связью SPI, поскольку I2C использует меньшее количество выводов, и это становится очень удобным, когда к шине подключено большое количество ведомых устройств. Но недостатком I2C является то, что у него одна и та же шина для отправки и получения данных, и, следовательно, он сравнительно медленный. Таким образом, выбор между протоколом SPI и I2C для вашего проекта зависит исключительно от приложения.
SPI с PIC16F877A с использованием XC8 Compiler:
Хватит основ, теперь давайте узнаем, как мы можем использовать связь SPI на микроконтроллере PIC16F877A с помощью MPLABX IDE и компилятора XC8. Прежде чем мы начнем, проясним, что в этом руководстве говорится только о SPI в PIC16F877a с использованием компилятора XC8, процесс будет таким же для других микроконтроллеров, но могут потребоваться небольшие изменения. Также помните, что для продвинутых микроконтроллеров, таких как серия PIC18F, сам компилятор может иметь некоторую встроенную библиотеку для использования функций SPI, но для PIC16F877A ничего подобного не существует, поэтому давайте создадим ее самостоятельно. Библиотека, описанная здесь, будет представлена в виде файла заголовка для загрузки внизу, который можно использовать для PIC16F877A для связи с другими устройствами SPI.
В этом руководстве мы напишем небольшую программу, которая использует связь SPI для записи и чтения данных с шины SPI. Затем мы проверим то же самое с помощью моделирования Proteus. Весь код, относящийся к регистрам SPI, будет выполнен внутри заголовочного файла PIC16f877a_SPI.h. Таким образом, мы можем использовать этот заголовочный файл во всех наших будущих проектах, в которых требуется связь по SPI. А внутри основной программы мы просто будем использовать функции из заголовочного файла. Полный код вместе с файлом заголовка можно скачать здесь.
Описание файла заголовка SPI:
Внутри файла заголовка мы должны инициализировать связь SPI для PIC16F877a. Как всегда, лучше всего начать с таблицы данных PIC16F877A. Регистры, которые управляют связью SPI для PIC16F8777a, - это SSPSTAT и SSPCON Register. Вы можете узнать о них на страницах 74 и 75 таблицы данных.
При инициализации связи SPI необходимо выбрать множество параметров. Наиболее часто используемый вариант - тактовая частота будет установлена на Fosc / 4 и будет выполняться в середине, а тактовая частота будет установлена на низком уровне в идеальном состоянии. Таким образом, мы также используем ту же конфигурацию для нашего файла заголовка, вы можете легко изменить их, изменив соответствующие биты.
SPI_Initialize_Master ()
Функция SPI initialize Master используется для запуска связи SPI в качестве мастера. Внутри этой функции мы устанавливаем соответствующие контакты RC5 и RC3 как выходные контакты. Затем мы настраиваем SSPTAT и регистр SSPCON для включения связи SPI.
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // стр. 74/234 SSPCON = 0b00100000; // стр 75/234 TRISC3 = 0; // Установить в качестве выходного сигнала для ведомого режима }
SPI_Initialize_Slave ()
Эта функция используется для настройки микроконтроллера на работу в ведомом режиме для связи SPI. В ведомом режиме контакт RC5 должен быть установлен как выход, а контакт RC3 должен быть установлен как вход. SSPSTAT и SSPCON устанавливаются одинаково как для ведомого, так и для ведущего устройства.
void SPI_Initialize_Slave () { TRISC5 = 0; // Вывод SDO должен быть объявлен как вывод SSPSTAT = 0b00000000; // стр. 74/234 SSPCON = 0b00100000; // стр 75/234 TRISC3 = 1; // Установить как выход для основного режима }
SPI_Write (входящий символ)
Функция записи SPI используется для записи данных в шину SPI. Он получает информацию от пользователя через входящую переменную и затем использует ее для передачи в буферный регистр. SSPBUF будет очищен в последовательном тактовом импульсе, и данные будут посылаться в шину бит за битом.
void SPI_Write (входящий символ) { SSPBUF = incoming; // Записываем данные пользователя в буфер }
SPI_Ready2Read ()
Функция готовности к чтению SPI используется для проверки того, получены ли данные на шине SPI полностью и могут ли они быть прочитаны. В регистре SSPSTAT есть бит, называемый BF, который устанавливается после того, как данные были полностью получены, поэтому мы проверяем, установлен ли этот бит, если он не установлен, тогда нам нужно подождать, пока он не будет установлен для чтения чего-либо из шины SPI.
беззнаковый SPI_Ready2Read () { if (SSPSTAT & 0b00000001) возврат 1; иначе вернуть 0; }
SPI_Read ()
SPI Read используется для чтения данных из шины SPI в микроконтроллер. Данные, присутствующие в шине SPI, будут храниться в SSPBUF, нам нужно дождаться, пока полные данные будут сохранены в буфере, а затем мы сможем прочитать их в переменную. Мы проверяем бит BF регистра SSPSTAT перед чтением буфера, чтобы убедиться, что прием данных завершен.
char SPI_Read () // Считываем полученные данные { while (! SSPSTATbits.BF); // Удерживать, пока бит BF не будет установлен, чтобы убедиться, что данные прочитаны полностью return (SSPBUF); // возвращаем прочитанные данные }
Основная программа Пояснение:
Функции, описанные в предыдущем разделе, будут в файле заголовка, и их можно будет вызывать в основном файле c. Итак, давайте напишем небольшую программу, чтобы проверить, работает ли связь SPI. Мы просто запишем немного данных в шину SPI и воспользуемся имитацией протеуса, чтобы проверить, принимаются ли те же данные в отладчике SPI.
Как всегда, начните программу с установки битов конфигурации, а затем очень важно добавить файл заголовка, который мы только что объяснили, в программу, как показано ниже.
#включают
Если вы открыли программу из загруженного выше zip-файла, то по умолчанию файл заголовка будет находиться внутри каталога файла заголовка вашего файла проекта. В противном случае вам нужно вручную добавить файл заголовка в свой проект, после добавления файлы проекта будут выглядеть следующим образом
Внутри основного файла мы должны инициализировать PIC как Master для связи SPI, а затем внутри бесконечного цикла while мы будем записывать три случайных шестнадцатеричных значения в шину SPI, чтобы проверить, получаем ли мы то же самое во время моделирования.
void main () { SPI_Initialize_Master (); а (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Обратите внимание, что в программе используются случайные значения 0A, 0F и 15, и они являются шестнадцатеричными значениями, поэтому мы должны увидеть то же самое во время моделирования. То есть код готов, это всего лишь образец, но мы можем использовать ту же методологию для связи с другим MCU или с другим модулем датчиков, работающим по протоколу SPI.
Моделирование PIC с помощью отладчика SPI:
Теперь, когда наша программа готова, мы можем скомпилировать ее, а затем продолжить моделирование. Proteus имеет удобную удобную функцию, называемую отладчиком SPI , которую можно использовать для мониторинга данных по шине SPI. Поэтому мы используем то же самое и строим схему, как показано ниже.
Поскольку в моделировании присутствует только одно устройство SPI, мы не используем вывод SS, и когда он не используется, он должен быть заземлен, как показано выше. Просто загрузите шестнадцатеричный файл в микроконтроллер PIC16F877A и нажмите кнопку воспроизведения, чтобы смоделировать нашу программу. После запуска моделирования вы увидите всплывающее окно, в котором отображаются данные на шине SPI, как показано ниже.
Давайте внимательнее посмотрим на поступающие данные и проверим, совпадают ли они с теми, которые мы написали в нашей программе.
Данные принимаются в том же порядке, который мы записали в нашей программе, и для вас они будут выделены. Вы также можете попробовать смоделировать программу для связи с двумя микроконтроллерами PIC с использованием протокола SPI. Вы должны запрограммировать один PIC как ведущий, а другой как ведомый. Все необходимые для этого заголовочные файлы уже приведены в заголовочном файле.
Это всего лишь беглое представление о том, что умеет SPI, он также может читать и записывать данные на несколько устройств. Мы расскажем больше о SPI в наших следующих руководствах, сопоставляя различные модули, которые работают с протоколом SPI.
Надеюсь, вы поняли проект и узнали из него что-то полезное. Если у вас есть какие-либо сомнения, опубликуйте их в разделе комментариев ниже или воспользуйтесь форумом для получения технической помощи.
Полный основной код приведен ниже; вы можете скачать файлы заголовков со всем кодом отсюда