Разница между SPI, I2C и UART тремя протоколами последовательной шины:
Первый, разница, конечно же, в названии:
SPI (последовательный периферийный интерфейс: последовательный периферийный интерфейс);
I2C(INTER IC BUS)
UART (универсальный асинхронный приемный передатчик: универсальный асинхронный приемный передатчик)
Во-вторых, разница заключается в линии электрического сигнала:
Шина SPI состоит из трех сигнальных линийСостав: последовательные часы (SCLK), последовательный вывод данных (SDO), последовательный ввод данных (SDI). Шина SPI может соединять несколько устройств SPI друг с другом. Устройство SPI, которое обеспечивает последовательные часы SPI, является ведущим или ведущим SPI, а другие устройства являются ведомыми или ведомыми (ведомыми) SPI. Полнодуплексная связь может быть реализована между ведущими и ведомыми устройствами.При наличии нескольких ведомых устройств может быть добавлена строка выбора ведомого устройства.
Если вы используете универсальный порт ввода-вывода для имитации шины SPI, у вас должен быть выходной порт (SDO), входной порт (SDI), а другой порт зависит от типа реализованного устройства.Если вы хотите реализовать устройство ведущее-ведомое, вам понадобится порт ввода и вывода. , Если реализовано только ведущее устройство, порта вывода достаточно; если реализовано только ведомое устройство, требуется только порт ввода.
Шина I2C — это стандарт двустороннего, двухпроводного (SCL, SDA), последовательного интерфейса и интерфейса с несколькими ведущими устройствами.Он имеет механизм арбитража шины и очень подходит для передачи данных между устройствами на короткие расстояния и нечасто. В его системе протокола адрес устройства-получателя всегда переносится при передаче данных, поэтому может быть реализована сеть устройств.
Если порт ввода-вывода общего назначения используется для имитации шины I2C и достижения двунаправленной передачи, требуется порт ввода-вывода (SDA), а также порт вывода (SCL). (Примечание: данные I2C относительно плохо изучены, описание здесь может быть очень неполным)
Шина UART — это асинхронный последовательный портСледовательно, он, как правило, намного сложнее, чем структура первых двух синхронных последовательных портов. Он обычно состоит из генератора скорости передачи (генерируемая скорость передачи в 16 раз больше скорости передачи), приемника UART и передатчика UART.На оборудовании есть два провода: один для отправки, а другой для приема.
Очевидно, что если универсальный порт ввода-вывода используется для моделирования шины UART, требуются один входной порт и один выходной порт.
В-четвертых, посмотрите на мнение быдла!
Wudanyu: Количество линий I2C меньше. Я думаю, что он более мощный, чем UART и SPI, но технически более проблематичный, потому что I2C требует поддержки двунаправленного ввода-вывода иИспользуйте подтягивающий резистор, Я думаю, что способность к помехам слабая, обычно используется для связи между чипами на одной плате и меньше используется для междугородной связи. Реализация SPI проще. UART требует фиксированной скорости передачи данных, что означает, что интервал между двумя битами данных должен быть одинаковым. SPI не имеет значения, потому что это синхронизированный протокол.
Quickmouse: скорость I2C немного ниже, чем у SPI, и протокол немного сложнее, чем SPI, но соединение меньше, чем у стандартного SPI.
Что у меня получилось
Я решил по-максимуму задействовать возможности периферии микроконтроллера, но вместе с тем не впадать в пучину предварительных оптимизаций. Читаемость и поддерживаемость кода для меня гораздо важнее, чем незначительный прирост производительности. Тем более, что с производительностью и так все вышло очень хорошо.
Что реализовано:
- три независимых последовательных порта;
- поддержка аппаратного контроля потока (RTS/CTS) на двух из трех портов;
- поддержка управляющих сигналов DSR/DTR/DCD/RI;
- поддержка 7 и 8-битной длины слова;
- поддержка контроля четности;
- 1, 1.5 и 2 стоповых бита;
- совместимость со стандартными драйверами Linux, macOS и Windows;
- подписанный INF файл для Windows XP, 7 и 8;
- поддержка произвольных скоростей (более 2 Мбит/с);
- сигнал TXA для управления трансиверами RS-485 (DE, /RE);
- DMA на передачу и прием данных USART;
- встроенный командный интерпретатор для конфигурации;
- нет зависимостей от сторонних библиотек кроме CMSIS;
- проект с открытым исходным кодом, лицензия MIT;
Командный интерпретатор позволяет настраивать следующие параметры:
- тип выхода: двухтактный, открытый сток;
- тип подтяжки входных линий: вверх, вниз, плавающая;
- инверсия для управляющих сигналов: активный высокий/низкий;
Командный интерпретатор активируется на первом CDC порту при подключении пина PB5 к земле, поддерживает часть управляющих последовательностей ANSI (стрелочки, backspace), и принимает вполне дружелюбные на вид команды:
Командный интерпретатор не позволяет переназначать сигналы с одних пинов на другие. Во-первых, далеко не все сигналы можно переназначить, а во-вторых, такая возможность по-настоящему становится востребованной только при использовании прошивки в контексте какой-либо иной платы. В этом случае проще и правильнее переназначить сигналы используя конфигурацию, хранящуюся в исходном коде.
Распиновка вышла следующей:
Signal | Direction | UART1 | UART2 | UART3 |
---|---|---|---|---|
RX | IN | PA10 | PA3 | PB11 |
TX | OUT | PA9 | PA2 | PB10 |
RTS | OUT | N/A | PA1 | PB14 |
CTS | IN | N/A | PA0 | PB13 |
DSR | IN | PB7 | PB4 | PB6 |
DTR | OUT | PA4 | PA5 | PA6 |
DCD | IN | PB15 | PB8 | PB9 |
RI | IN | PB3 | PB12 | PA8 |
TXA | OUT | PB0 | PB1 | PA7 |
Пины, выделенные жирным шрифтом, являются толерантными к 5 В.
Сигнал TXA (TX Active) служит для управления микросхемами трансиверов RS-485 (DE, /RE). TXA активен во время передачи данных и переключается в неактивное состояние не более чем за 0.6 мкс после завершения передачи. Это соответствует спецификациям RS-485 на скоростях до 920 кБод c почти двукратным запасом по времени переключения.
К сожалению, реализовать RTS/CTS на UART1 не вышло из-за того, что соответсвующие пины заняты сигналами USB. Можно было вывести RTS на какой-нибудь другой пин, поскольку RTS управляется программно, в зависимости от степени заполнения кольцевых буферов на прием, но порт c RTS и без CTS мне показался странной штукой и я решил, что так делать не надо.
Проект написан на языке C, и подразумевает использование arm-none-eabi-gcc для сборки. Я использовал специфичный для GCC синтаксис атрибутов и расширения языка С. Совместимость проекта с проприетарными компиляторами меня не интересует, но если кто-то считает это важным, то я готов принять соответствующий пул-реквест.
В результате у меня получилось удобное и мощное устройство которое полностью закрывает все мои потребности в последовательных портах. STM32 Blue Pill можно использовать как самостоятельно, так и в составе схем обеспечивающих согласование уровней и развязку. Возможность настройки сигнальных линий позволяет упростить разработку таких схем.
Основные особенности реализации
- в качестве базового решения взят проект , который, в свою очередь, основан на ;
- по сравнению с базовым решением из проекта исключен код, связанный с шиной Wishbone. Он заменен на соответствующий интерфейсный модуль для AHB-Lite (mfp_ahb_lite_uart16550) ;
- весь заимствованный из базового проекта код размещен в каталоге uart16550 ;
- модуль mfp_ahb_lite_uart16550 включен в состав системы на постоянной основе, опция MFP_USE_DUPLEX_UART [] в файле mfp_ahb_lite_matrix_config.vh определяет доступность сигналов UART_SRX и UART_STX;
- для уже имеющихся сигналов UART_RX и UART_TX предусмотрен следующий порядок использования:UART_RX — вне зависимости от режима используется только для загрузки прошивки в память системы, как это и было ранее (модуль mfp_uart_receiver, к UART16550 не относится). Если опция MFP_USE_DUPLEX_UART не активна, то UART_TX используется для передачи данных от UART16550 наружу, прием в этом случае не доступен. Если опция MFP_USE_DUPLEX_UART активна, то UART_TX — не используются, для передачи данных из/в mfp_ahb_lite_uart16550 служат UART_SRX и UART_STX [];
- вывод интерфейса управления модемом на уровень top модуля не производился. Соответствующие линии доступны в интерфейсе модуля ahb_lite_uart16550 и могут быть использованы при необходимости (UART_RTS, UART_CTS, UART_DTR, UART_DSR, UART_RI, UART_DCD) [];
- сигнала прерывания (UART_INT) подключен к входу hw3 (сигнал SI_Int) для режимов обратной совместимости и векторного. И к eic5 (сигнал EIC_input) для контроллера внешних прерываний [];
- при запуске в режиме симуляции линия UART_STX замкнута на UART_SRX [];
- работоспособность полученного решения в режиме симуляции проверена с помощью Modelsim;
- работоспособность на железе проверена на плате Terasic DE10-Lite ;
- в качестве примера работы с UART16550 написаны две программы: 05_uart и 08_uart_irq : после сброса выполняется настройка uart (8n1, 115200), отправка приветствия после чего код каждого принятого символа отображается на LED и 7-сегментных индикаторах. При запуске на плате каждый принимаемый по uart символ отправляется обратно;
- отладка разработанного модуля доступна «в отрыве» от кода mipsfpga+ в рамках проекта ;
- для программного конфигурирования модуля следует использовать документацию базового проекта, . Рекомендую бегло ознакомиться с ней, чтобы лучше понимать приводимый ниже пример;
- работа с шиной AHB-Lite детально описана в ;
Порядок запуска
-
проверить, что в файле mfp_ahb_lite_matrix_config.vh установлена следующая настройка []:
- перейти в каталог с программой: mipsfpga-plus/programs/05_uart , либо 08_uart_irq ;
-
в файле main.c установить []:
-
выполнить сборку программы и ее запуск в симуляторе:
- после завершения работы скрипта симуляции нажать «нет», чтобы предотвратить закрытие симулятора;
- то, как работает этот код «на железе», видно на заглавной gif-ке.
Описание программы и конфигурации системы
- так как пример 08_uart_irq предусматривает помимо настройки самого UART16550 еще и использование генерируемых им прерываний, то ниже рассматривается именно эта конфигурация;
- директивы, обеспечивающие работу с регистрами контроллера вынесены в заголовочный файл uart16550.h ;
-
при запуске производится настройка UART16550 []:
-
настройка прерываний [] (детально разобрана в ):
-
обработка прерывания предполагает проверку того, что оно вызвано именно наличием данных во входящем FIFO []:
-
после чего следует их чтение (до тех пор, пока FIFO не опустеет) и вывод []:
- в случае, если работа идет на «железе», то все полученные данные отправляются обратно []:
-
ниже представлен результат работы программы. Так как при настройке модуля мы выставили режим срабатывания прерывания после приема 4х символов, то передача на время прерывается для приема. Оставшиеся символы получены нами после еще одного такого же прерывания, но которое уже было вызвано не наличием 4х символов в очереди, а не пустой очередью и таймаутом (контроллер понял, что больше символов не будет и сообщил, что очередь не пустая);
-
для программы 05_uart прием выполняется уже после завершения передачи, все это время принятые данные ждут в FIFO приемника:
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: нет назначенного управления потоком и нет механизма ответа, подтверждающего, получены ли данные.
Возможности и характеристики
Как вы, наверное, знаете, базовая система 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.
Как работает UART
Передатчик и приемник используют стартовый бит, стоповый бит и параметры синхронизации для взаимодействия друг с другом. Исходные данные находятся в параллельной форме. Например есть 4-х битные данные, и чтобы преобразовать их в последовательную форму нужен преобразователь из параллельного в последовательный. Обычно для проектирования преобразователей используются D-триггеры.
D-триггер, также известный как триггер данных, сдвигает один бит со стороны входа на сторону выхода только тогда, когда таймер изменяет переход из высокого состояния в низкое или из низкого состояния в высокое. Точно так же, если надо передать 4 бита данных, понадобится 4 триггера.
- D — входные данные.
- CLK — тактовые импульсы.
- Q — выходные данные.
Теперь спроектируем преобразователь из параллельного в последовательный и из последовательного в параллельный.
Пример интерфейса 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.