UART в модемах
Модемы для персональных компьютеров, которые подключаются к разъему на материнской плате, также должны иметь на карте функцию UART. Оригинальный чип 8250 UART, поставляемый с персональным компьютером IBM, имел по одному символьному буферу для приемника и передатчика, что означало, что коммуникационное программное обеспечение плохо работало на скоростях выше 9600 бит / с, особенно при работе в многозадачной системе или при обработке прерываний. с дисковых контроллеров. В высокоскоростных модемах использовались UART, которые были совместимы с исходным чипом, но включали дополнительные буферы FIFO, что давало программному обеспечению дополнительное время для ответа на входящие данные.
Взгляд на требования к производительности при высоких скоростях передачи данных показывает, почему 16-, 32-, 64- или 128-байтовый FIFO необходим. Спецификация Microsoft для системы DOS требует, чтобы прерывания не отключались более чем на 1 миллисекунду за раз. Некоторые жесткие диски и видеоконтроллеры нарушают эту спецификацию. 9600 бит / с доставляют символ примерно каждую миллисекунду, поэтому 1-байтовый FIFO должен быть достаточным при этой скорости в системе DOS, которая соответствует максимальному времени отключения прерывания. Ставки выше этого могут получить новый символ до того, как будет извлечен старый, и, таким образом, старый символ будет потерян. Это называется ошибкой переполнения и приводит к потере одного или нескольких символов.
16-байтовый FIFO позволяет получить до 16 символов, прежде чем компьютер должен будет обработать прерывание. Это увеличивает максимальную скорость передачи данных, которую компьютер может надежно обрабатывать, с 9600 до 153 000 бит / с, если у него есть мертвое время прерывания 1 миллисекунда. 32-байтовый FIFO увеличивает максимальную скорость до 300 000 бит / с. Второе преимущество наличия FIFO заключается в том, что компьютеру требуется обслуживать только 8–12% прерываний, что позволяет больше процессорного времени для обновления экрана или выполнения других рутинных операций. Таким образом, отклик компьютера также улучшится.
Примеры использования SoftSerial
Вот несколько типичных примеров использования. Во всех примерах я использую ПК Betaflight F4, но большинство шагов и примеров подойдет и для других полетников.
Подключаем «инвертированный» SmartPort к полетному контроллеру на F4
При использовании Softserial, можно подключать SmartPort к ПК на F4 без необходимости инвертировать сигнал.
В этом примере мы подключим TX порта UART1.
В консоли (CLI) наберите «resource» и найдите TX1, который на самом деле является портом A09 (на вашем ПК это может быть другой порт).
Давайте назначим A09 на SoftSerial 1, для этого наберем:
resource SERIAL_TX 11 A09 save
Замечу, что нумерация портов SoftSerial начинается с 11, т.е. SoftSerial 1 — это 11, а SoftSerial 2 — это 12.
Включаем фичу «SoftSerial» в Betaflight, теперь вы должны увидеть SoftSerial1 на закладке Ports. Выбираем «SmartPort» в столбце «Telemetry Output»
Все должно работать! Если нет, тогда идем в консоль и убеждаемся, что:
set tlm_halfduplex = on set tlm_inverted = off
Для инвертированного сигнала SPort нужно выбрать “tlm_inverted” со значением “off”, для неинвертированного должно быть «on». Если запутались, попробуйте оба значения.
После этих изменений нужно отключить питание полетного контроллера (выдернуть USB разъем) и включить снова. Иногда для включения SoftSerial перезагрузки недостаточно, приходится передергивать питание.
«Делим» один UART между SmartAudio и телеметрией регуляторов
Использование контактов TX и RX одного порта для двух устройств позволяет освободить целый порт для чего-нибудь другого.
Например, вы можете повесить телеметрию регулей на RX UART1 и настроить TX UART1 как SoftSerial для работы SmartAudio.
В консоли набираем «resource» и находим контакт для TX1, в нашем случае это A09.
Назначаем A09 на SoftSerial 1
resource SERIAL_TX 11 A09 save
Включаем фичу «SoftSerial» в Betaflight, теперь вы должны увидеть SoftSerial1 на закладке Ports. Выбираем «ESC» для UART1 и SmartAudio для SoftSerial1.
Возможно потребуется перезагрузить ПК, выдернув USB кабель и аккумулятор, и затем подключить все обратно.
Недостаточно последовательных портов? Давайте использовать LED_Strip для SmartPort
Если на вашем ПК имеется контакт LED_Strip и вы не подключили светодиоды, тогда можно превратить этот контакт в порт SoftSerial и использовать его для SmartPort или SmartAudio.
В консоли набираем «resource» и видим, что LED_Strip — это B06.
Назначаем B06 на SoftSerial 1, для этого вводим:
resource LED_STRIP 1 none resource SERIAL_TX 11 B06 save
Включаем фичу «SoftSerial» в Betaflight, теперь вы должны увидеть SoftSerial1 на закладке Ports. Выбираем «SmartPort» в столбце «Telemetry Output».
Если что-то не работает, см советы в первом примере.
Настройка тактирования — Clock.c
Настройка тактирования реализована в файле Clock.c, функция Clock_Init_HSE_PLL(). Данная функция настраивает частоту ядра на работу от генератора HSE c использованием умножителя PLL, который передается во входном параметре. В примере используется максимальный коэффициент умножения PLL_MUL = 16 (main.c).
Код легче понять, если ориентироваться на рисунок 3.
Увеличить фото
Рисунок 3 — структурная блок-схема формирования тактовой частоты
В основном, код состоит из включения мультиплексоров С1, С2, С3 и PLL. Но есть два важных момента:
-
Выборка команд из EEPROM не может происходить быстрее, чем 25МГц, поэтому необходимо выставлять задержку доступа к EEPROM при работе ядра на больших частотах. Ядро останавливается на время этой задержки, пока считывается очередная порция инструкций. За раз из EEPROM извлекается 16 байт, где может быть закодировано от 4 до 8 инструкций процессора. Установка задержки происходит функцией EEPROM_SetLatency(), при этом предварительно на блок EEPROM подается тактирование.
-
При работе на высоких частотах необходимо регулировать параметры внутреннего регулятора напряжения ядра(LDO). В спецификации это параметры SelectRI и LOW в регистре REG_0E, которые выбираются по частоте ядра и всегда должны быть равны. Раздельное управление этими параметрами возможно, но, согласно спецификации, не рекомендуется. Если используется много периферийных блоков, то случается, что без выставления данных параметров МК сбоит, поэтому рекомендуется выставлять эти параметры всегда — функция SetSelectRI().
В приведенном списке SelectRI присутствует значение RI_Gens_Off. Оно выставляется, когда тактирование снаружи микросхемы задается не резонатором, а внешним генератором. В таком варианте необходимость во внутреннем генераторе отпадает и частота напрямую (режим ByPass) идет на вход схемы тактирования, мультиплексор С1 вход HSE.
Резонатор генерирует синусоидальный сигнал, который далее генератором преобразуется в прямоугольные импульсы.
Ограничения, связанные с использованием SoftSerial
Нет ничего идеального, при использовании SoftSerial появляются некоторые ограничения:
- SoftSerial не подходит для задач, которые требуют частого обмена большим объемом информации, например OSD или SerialRX
- SoftSerial потребляет много процессорного времени:
- на ПК с F1 не получится включить SoftSerial в Betaflight, просто не хватит ресурсов проца
- возможно не лучший вариант и на платах с F3, особенно если вы хотите сократить время цикла (looptime), и использовать некоторые другие ресурсоёмкие функции
- на некоторых ПК, softSerial отключен в официальных прошивках, но его можно включить в кастомной прошивке
- Можно включить всего 2 SoftSerial одновременно
Порядок работы со стороны хоста
- Получаем информацию с устройства: размер флеша, ChipID, размер буфера приёма, адрес старта, версия загрузчика и чипа.
- Даём команду стирания либо всей прошивки, либо части указав размер стираемой области.
- По завершению стирания начинаем непрерывно отправлять команды записи блоками друг за другом, проверяя что текущая записанная позиция в устройстве увеличивается.
- Если позиция перестала увеличиваться (приняли два ответа на команду «запись» с одинаковым адресом), то скорректировать адрес на Хосте, сбросить буферы отправки и начать передавать с нового скорректированного адреса.
- По завершению записи подать команду «Старт» передав CRC32 всей прошивки, в ответ Устройство сообщит фактическое CRC32.
- Если фактическое CRC32 равно расчётному, то загрузка успешно закончена и прошивка запущена.
Как работает UART
Передатчик и приемник используют стартовый бит, стоповый бит и параметры синхронизации для взаимодействия друг с другом. Исходные данные находятся в параллельной форме. Например есть 4-х битные данные, и чтобы преобразовать их в последовательную форму нужен преобразователь из параллельного в последовательный. Обычно для проектирования преобразователей используются D-триггеры.
D-триггер, также известный как триггер данных, сдвигает один бит со стороны входа на сторону выхода только тогда, когда таймер изменяет переход из высокого состояния в низкое или из низкого состояния в высокое. Точно так же, если надо передать 4 бита данных, понадобится 4 триггера.
- D — входные данные.
- CLK — тактовые импульсы.
- Q — выходные данные.
Теперь спроектируем преобразователь из параллельного в последовательный и из последовательного в параллельный.
Где используются UART и USART?
Оба протокола используются в GPS модулях, flash-загрузчик в процессорах ATMEL, старой компьютерной периферии, а также в разнообразном промышленном оборудовании. В общем он все еще очень широко использхуется для обмена информацией между устройствами.
GPS модули поддерживают стандарт NMEA 0183, в котором определена поддержка модулями UART. Конечно, на подходе новый стандарт NMEA 2000, в котором будет использоваться протокол CAN, но пока ещё превалирует использование UART.Несмотря на то, что ещё можно найти компьютеры с портами RS-232, эти порты уже не найти на ноутбуках и других малогабаритных устройствах. Для обмена информацией с промышленным оборудованием и, к примеру, процессорами ATMEL и устройствами на их основе, как например популярная ARDUINO, часто используются чипы для преобразования последовательного протокола в USB. Благодаря этому UART еще будет жив какое-то время. Это перевод. Автор оригинальной статьи — Andrei Chichak. Кстати, у них очень интересный блог. Рекомендую.
Синхронизация и выборка
Стандартные цифровые данные бесполезны без какого-либо механизма синхронизации. На рисунке ниже показано почему:
Выборка двоичных данных при приеме через UART
Типовой сигнал данных представляет собой просто напряжение, уровень которого изменяется между состояниями логического нуля и единицы. Приемник может правильно преобразовать эти логические состояния в цифровые данные, только если он знает, когда сделать выборку сигнала. Это может быть легко выполнено с помощью отдельного тактового сигнала – например, передатчик обновляет сигнал данных при каждом нарастающем фронте тактового сигнала, а приемник затем делает выборку данных по каждому заднему фронту.
Однако, как следует из названия «универсальный асинхронный приемник/передатчик», интерфейс UART не использует тактовый сигнал для синхронизации устройств Tx и Rx. Так как же приемник узнает, когда сделать выборку сигнала данных передатчика?
Передатчик формирует битовый поток на основе своего тактового сигнала, а целью приемника является использование своего тактового сигнала для выборки входящих данных в середине каждого битового периода. Выполнение выборки в середине битового периода не является обязательным, но этот момент оптимален, так как выборка ближе к началу или к концу битового периода делает систему менее устойчивой к различиям тактовых частот приемника и передатчика.
Последовательность приемника начинается с заднего фронта стартового бита. Это очень важный момент процесса синхронизации. Внутренний тактовый генератор приемника полностью независим от внутреннего тактового генератора передатчика – другими словами, эта граница спада сигнала может соответствовать любой точке в тактовом сигнале приемника.
Момент прихода стартового бита в приемник UART
Чтобы гарантировать, что активный фронт тактового сигнала приемника будет приходиться примерно на середину битового периода, частота тактового сигнала битовой скорости, переданная в модуль приемника, значительно выше (в 8 или 16, или даже в 32 раза) реальной битовой скорости.
Допустим, что один битовый период соответствует 16 циклам тактового сигнала приемника. В этом случае синхронизация и выборка могут быть выполнены следующим образом:
- процесс приема запускается по границе спада стартового бита;
- приемник ждет в течение 8 циклов тактового сигнала, чтобы установить момент выборки, который находится близко к середине периода бита;
- приемник ждет в течение 16 циклов тактового сигнала, которые приводят его к середине периода первого бита данных;
- первый бит данных оцифровывается и сохраняется в регистре приемника, а затем модуль снова ожидает 16 циклов тактового сигнала перед выборкой второго бита данных;
- этот процесс повторяется до тех пор, пока все биты данных не будут выбраны и сохранены, а затем нарастающий фронт стопового бита возвращает интерфейс UART в режим ожидания.
Выборка данных при приеме через UART
Usage guide
#include"uart.h" int main() { char str_TxMsg_u8={"Good Morning"}; char var_uartData_u8='A'; uint16_t var_num_u16= 1234u; char str_readString_u850; char ch; UART_Init(9600); UART_TxString("\n\rProgram to illustrate the UART library usage "); UART_TxString(str_TxMsg_u8); /* Transmit the message stored in a string */ UART_TxString("\n\rChar:"); UART_TxChar('X'); /* Transmit the specified Ascii character */ UART_TxChar(var_uartData_u8); /* Transmit the char stored in a variable */ UART_TxString("\n\rDec:"); UART_TxDecimalNumber(1234,5); /* Transmit the specified digits of a number */ UART_TxString(" Hex:"); UART_TxHexNumber(0xABCD,5); /* Note here the number of digits to transmit=5 */ UART_TxString(" Bin:"); /* The number Transmitted on UART will be as below*/ UART_TxBinaryNumber(0xABCD,16);/* dec=01234, hex=0ABCD, bin=1010101111001101*/ UART_Printf("\n\rDec=%d Hex=%x Bin:%b str=%s",var_num_u16,var_num_u16,var_num_u16,a_TxMsg_u8); UART_Printf("\n\rDec=%d Hex=%x Bin:%b str=%s",123u,0xABCDu,0x55u,"hello,world"); UART_Printf("\n\rEnter a String: "); UART_RxString(str_readString_u8); UART_Printf("\n\rEntered string is: %s",str_readString_u8); do { UART_Printf("\n\rEnter 'E' to exit: "); ch = UART_RxChar(); UART_Printf("\n\rYou entered: %c",ch); }while((ch!='E') && (ch!='e')); UART_Printf("\n\rEnjoy Embedded Programming"); while(1); return ; }
Please enable JavaScript to view the comments powered by Disqus.
UART
Универсальный асинхронный приемник / передатчик, обычно называемый UART, представляет собой асинхронный приемник / передатчик, который является частью компьютерного оборудования. Он будет передавать данные вПоследовательная связьпротивПараллельное общениеЧтобы преобразовать между. Как микросхема, преобразующая параллельные входные сигналы в последовательные выходные сигналы, UART обычно интегрируется в соединение с другими интерфейсами связи.
Последовательный порт во встроенной системе обычно относится к порту UART, но мы часто не знаем разницы между ним и COM-портом, а также отношения между RS232, TTL и т. Д. Фактически, UART, COM относятся к форме физического интерфейса (аппаратного), а TTL, RS-232 относится к стандарту уровня (электрический сигнал).
UART имеет 4 контакта (VCC, GND, RX, TX), используя уровень TTL, низкий уровень — 0 (0 В), высокий уровень — 1 (3,3 В или выше).
Особенности UART: Как правило, контроллеры uart создаются вместе с процессорами во встроенных системах.Как и микросхема Freescale IMX6, существует несколько контроллеров uart.
Введение в интерфейс SPI
В последние несколько дней я наткнулся на флэш-память, использующую интерфейс SPI, и знаю, что флэш-память также может быть последовательной. Кажется, что это действительно была лягушка на дне колодца. Я нашел некоторую информацию об интерфейсе SPI. Позже я нашел информацию на английском языке, перевел ее и добавил Мое личное понимание было собрано в статью, надеюсь, она будет полезна новичкам.
Полное название интерфейса SPI — «Serial Peripheral Interface», что означает последовательный периферийный интерфейс. Впервые он был определен компанией Motorola для процессоров серии MC68HCXX. Интерфейс SPI в основном используется между EEPROM, FLASH, часами реального времени, аналого-цифровым преобразователем, процессором цифрового сигнала и декодером цифрового сигнала.
Интерфейс SPI — это синхронная последовательная передача данных между ЦП и периферийными низкоскоростными устройствами. Под импульсом сдвига ведущего устройства данные передаются в битах, старший бит находится спереди, а положение — сзади. Это полнодуплексная связь, и скорость передачи данных общая. Он быстрее шины I2C, а скорость может достигать нескольких Мбит / с.
Интерфейс SPI работает в режиме ведущий-ведомый. В этом режиме обычно есть ведущее устройство и одно или несколько ведомых устройств. Интерфейс включает следующие четыре сигнала:
(1) Вывод данных MOSI-ведущего устройства, ввод данных ведомого устройства
(2) Ввод данных MISO-ведущего устройства, вывод данных ведомого устройства
(3) Сигнал SCLK-clock, генерируемый ведущим устройством.
(4) / SS — сигнал включения ведомого устройства, управляемый ведущим устройством
В двухточечной связи интерфейс SPI не требует операций адресации и является полнодуплексным, что является простым и эффективным.
В системе с несколькими подчиненными устройствами каждое подчиненное устройство нуждается в независимом разрешающем сигнале, который немного сложнее аппаратно, чем система I2C.
Интерфейс SPI на самом деле представляет собой два простых регистра сдвига во внутреннем оборудовании.Передаваемые данные составляют 8 бит.Под сигналом включения ведомого и импульсом сдвига, генерируемым ведущим устройством, он передается бит за битом, причем старший бит находится спереди, а младший бит — сзади. . Как показано на рисунке ниже, данные изменяются по заднему фронту SCLK, и в то же время в регистре сдвига сохраняется один бит данных.
Схема внутреннего оборудования интерфейса SPI:
Наконец, один недостаток интерфейса SPI: нет назначенного управления потоком и нет механизма ответа, подтверждающего, получены ли данные.
Функция чтения приемного буфера
//чтение буфераunsigned char USART_GetChar(void){ unsigned char tmp = usartRxBuf; usartRxBuf = 0; return tmp; }Копируем значение буфера в локальную переменную, очищаем его. Локальную переменную возвращаем. Необходимый минимум готов. Оформляем его в виде программного модуля. usart.husart.c
Основная программа
Основная программа будет выглядеть так. Надеюсь дополнительных комментариев она не требует.
//*****************************************// Author(s)…: Pashgan http://ChipEnable.Ru // Target(s)…: ATMega8535// Compiler….: IAR EWA 5.11A// Description.: UART/USART. Получение первых результатов//******************************************#include <ioavr.h>#include «lcd_lib.h»#include «usart.h»int main( void ){ unsigned char sym; USART_Init(); LCD_Init(); __enable_interrupt(); LCD_SendString(«uart:»); while(1){ sym = USART_GetChar(); //читаем буфер if (sym){ //если что-то приняли, то LCD_Goto(6,0); LCD_WriteData(sym); //отображаем на lcd принятый символ USART_SendChar(‘O’); //отвечаем компу «Ok « USART_SendChar(‘k’); USART_SendChar(‘ ‘); } } return 0;}
полезный софт.
Пример интерфейса UART
Этот пример демонстрирует взаимодействие ESP8266 UART с MAX232. Микросхема MAX232 питается от источника 5 В, и включает в себя генератор емкостного напряжения для управления напряжением 232 уровня. Она поставляется с двумя передатчиками, также называемыми драйвером (Tin, Tout) и приемниками (Rin и Rout).
Здесь использовался ESP8266 (32-битный микроконтроллер) со встроенным UART. Связь может осуществляться с ESP8266 с использованием AT-команд через преобразователь уровня RS232 в TTL (MAX232). На схеме показано подключение ESP8266 к компьютеру.
Запрашивая действительные AT-команды через ПК, микросхема Wi-Fi ответит подтверждением. Вот шаги для реализации последовательной связи с ПК.
- Подключить передатчик (TX) ESP8266 к приемнику (RX) преобразователя уровня RS232 в TTL (MAX232) и приемника ПК.
- Подключить приемник (RX) ESP8266 к TX ПК и RX преобразователя TTL.
Обработка ошибок на уровне пакетов и таймаутов
- Если код команды не соответствует проверочному инверсному коду, то начало пакета не засчитывается, и поиск новой команды начинается со следующих байт.
- Если принят пакет с размером дополнительной информации больше чем внутренний буфер, то пакет игнорируется, и поиск новой команды начинается со следующих после размера байт.
- Если принятая в теле пакета CRC32 не равна фактически расчётной, то содержимое пакета игнорируется и поиск новой команды начинается с следующих после CRC32 байт.
- Если приходят байты, но сигнатура начала пакета не задетектирована. То эти байты считать отладочными текстовыми сообщениями и накапливать до кода 13 (перевод строки), а после этого кода выводить в отладочную консоль.
- Если с момента приёма последнего пакета прошло более 500мс, то загрузчик сбрасывается в изначальное состояние. Пакет, который не успел приняться до конца, игнорируется и так-же сбрасывается. О таймауте Устройство сообщает пакетом с специальным кодом команды «таймаут».
- При запуске загрузчика генерируется другой пакет со специальным кодом «перезагрузка».
Возможности и характеристики
Как вы, наверное, знаете, базовая система UART обеспечивает надежную, среднескоростную, полнодуплексную связь только с тремя сигналами: Tx (последовательно передаваемые данные), Rx (последовательно принимаемые данные) и земля. В отличие от других протоколов, таких как SPI и I2C, в нем не требуется никаких сигналов синхронизации, так как пользователь дает аппаратному обеспечению UART необходимую для синхронизации информацию.
Связь двух микроконтроллеров через UART
На самом деле, сигнал синхронизации существует, но он не передается от одного устройства связи к другому; и приемник, и передатчик имеют внутренние тактовые сигналы, которые управляют тем, как изменение логических уровней генерируется (на стороне Tx) и интерпретируется (на стороне Rx). Неудивительно, что связь через UART не работает, если передатчик и приемник настроены на разные частоты передачи данных. Кроме того, внутренние тактовые сигналы должны быть:
- достаточно точны и близки к ожидаемой частоте;
- достаточно стабильны в течение долгого времени и изменений температуры.
Ключевые термины
Давайте рассмотрим некоторые термины и попутно характеристики UART:
- Стартовый бит
- Первый бит в передаче одного байта через UART. Он указывает на то, что линия данных покидает состояние ожидания. В состоянии ожидания, как правило, на линии установлен высокий логический уровень, поэтому стартовый бит равен низкому логическому уровню. Стартовый бит является вспомогательным, это означает, что он обеспечивает связь между приемником и передатчиком, но не передает значимых данных.
- Стоповый бит
- Последний бит в передаче одного байта через UART. Его логический уровень равен логическому уровню в состоянии ожидания, то есть, логической единице. Это еще один вспомогательный бит.
Стартовый и стоповый биты в передаче байта через UART - Битовая скорость
- Приблизительная скорость (в битах в секунду, или бит/с, bps), с которой данные могут быть переданы. Более точное определение частоты (в бит/с) соответствует времени (в секундах), необходимому для передачи одного бита цифровых данных. Например, для системы 9600 бит/с, для передачи одного бита требуется 1/(9600 бит/с) ≈ 104,2 мкс. Эта система не может на самом деле передавать 9600 бит значимых данных в секунду, так как требуется дополнительное время для передачи служебных битов и, возможно, для задержек между передачами отдельных байтов.
Битовая скорость и время передачи одного бита через UART - Бит четности
- Бит обнаружения ошибок, добавленный к концу байта. Возможны два типа: «нечетность» означает, что бит четности будет равен логической 1, если байт данных содержит четное количество битов, равных логической 1, и «четность» означает, что бит четности будет равен логической 1, если байт данных содержит нечетное количество битов, равных логической 1. Это может показаться нелогичным, но идея состоит в том, что бит четности гарантирует, что количество битов, равных логической 1, всегда будет нечетным (для нечетности) или четным (для четности). Поэтому, если вы используете четность, и байт имеет три бита, равных логической 1, то общее количество битов, равных логической 1 в переданных данных, (то есть, сам байт плюс бит четности) будет четным.
Принудительно приводя количество битов, равных логической единице, к четному (при четности) или нечетному (при нечетности) количеству, бит четности обеспечивает грубый механизм обнаружения ошибок – если где-то в процессе передачи какой-либо бит будет перевернут, то количество битов, равных логической 1, не совпадет с выбранным режимом четности. Конечно, этот метод не поможет, если будут перевернуты значения сразу двух битов, поэтому бит четности не так уж и надежен. Если вам действительно нужна устойчивая к ошибкам связь, я бы рекомендовал использовать CRC.
SPI (Serial Peripheral Interface)
Это протокол последовательной связи синхронного типа, который состоит из двух линий данных (MOSI и MISO), одной тактовой линии (SCK) и линии выбора подчиненных (SS).
Перед тем, как двигаться дальше, нужно прояснить значения несколько терминов, которые вы должны знать:
Master (ведущий) — устройство, которое обеспечивает синхронизацию
Slave (ведомый) — устройство, отличное от мастера, использующее тактирование ведущего для связи
MOSI — Master Out Slave In (линия, по которой мастер отправляет данные своим подчиненным)
MISO — Master In Slave Out (линия, по которой ведомые передают ведомому данные в ответ)
SCK – линия тактирования (предоставляется ведущим устройством)
SS — Slave Select (линия, используемая для выбора ведомого устройства, к которому ведущий хочет установить связь)
В случае с SPI в любой момент времени может быть только одно ведущее устройство и несколько других ведомых, которые отвечают только на вызов ведущего. Вся связь обрабатывается самим ведущим; ни один подчиненный не может отправлять данные по своей воле. Ведущий отправляет данные через MOSI, а ведомые отвечают через линию MISO. Во всем процессе SCK (последовательное тактирование) играет очень важную роль, каждое подчиненное устройство зависит от этих часов, чтобы читать данные из MOSI и отвечать через MISO. SS (выбор ведомого) используется для того, чтобы конкретное подчиненное устройство проснулось, с кем мастер хочет общаться. Ниже представлена иллюстрация принципа подключения посредством интерфейса SPI:
Существует несколько регистров, которые используются для реализации связи SPI. Все нижеперечисленные регистры имеют длину 8 бит.
SPDR (регистр данных SPI) используется для хранения одного байта данных, который должен быть передан или получен.
SPSR (регистр состояния SPI) содержит биты состояния, участвующие в передаче SPI.
SPCR (регистр управления SPI) содержит контрольные биты, участвующие в передаче SPI.
Преимущества интерфейса SPI следующие. Во-первых он обеспечивает синхронную последовательную связь, которая намного надежнее асинхронной. Во-вторых, несколько устройств (ведомые устройства) могут быть подключены к одному ведущему устройству. В-третьих, это быстрая форма последовательной связи.
Недостатки SPI следующие. Во-перых, требуется несколько линий выбора ведомых для подключения нескольких подчиненных устройств. Во-вторых, только ведущий контролирует весь процесс коммуникации; никакие подчиненные не могут напрямую связываться друг с другом.
дальнейшее чтение
- Последовательный порт завершен: COM-порты, виртуальные COM-порты USB и порты для встроенных систем ; 2-е издание; Ян Аксельсон; Lakeview Research; 380 страниц; 2007; ISBN 978-1-931-44806-2 .
- Последовательный порт завершен: программирование и схемы для каналов и сетей RS-232 и RS-485 ; 1-е издание; Ян Аксельсон; Lakeview Research; 306 страниц; 1998; ISBN 978-0-965-08192-4 .
- Последовательный порт и микроконтроллеры: принципы, схемы и исходные коды ; 1-е издание; Гжегож Немировски; CreateSpace; 414 страниц; 2013; ISBN 978-1-481-90897-9 .
- Последовательное программирование (Wikibook) .