Общение между электронными устройствами похоже на общение между людьми: обе стороны должны говорить на одном языке. В электронике эти языки называются протоколами связи.
Ранее я публиковал отдельные статьи о SPI, UART и I2C-связи. В этой статье я проведу некоторое сравнение между ними.
Электронные устройства общаются друг с другом, отправляя биты данных. Биты являются двоичными и могут быть только 1 или 0. Биты передаются от одного устройства к другому посредством быстрых изменений напряжения. В системе, работающей при напряжении 5 В, «0» передается посредством короткого импульса 0 В, а «1» — посредством короткого импульса 5 В.
Биты данных могут передаваться в параллельной или последовательной форме. При параллельной связи биты данных передаются одновременно по проводу. На изображении ниже показана параллельная передача буквы «С» в двоичном формате (01000011):
При последовательной связи биты передаются один за другим по одному проводу. На изображении ниже показана последовательная передача буквы «С» в двоичном формате (01000011):
SPI — это общий протокол связи для устройств. Его уникальное преимущество заключается в том, что он может передавать данные без перерывов и непрерывно отправлять или получать любое количество битов. В I2C и UART данные передаются в виде пакетов данных с ограниченным количеством бит.
В устройствах SPI устройства делятся на ведущие и подчиненные системы. Ведущее устройство — это управляющее устройство (обычно микроконтроллер), а ведомое устройство (обычно датчик, дисплей или микросхема памяти) получает инструкции от ведущего устройства.
Набор коммуникаций SPI содержит четыре сигнальные линии: MOSI (Master Output/Slave Input) – сигнальная линия, выход хоста, вход подчиненного устройства. MISO (Master Input/Slave Output) – сигнальная линия, главный вход, подчиненный выход. SCLK (Clock) – тактовый сигнал. SS/CS (Slave Select/Chip Select) – сигнал выбора чипа.
Возможности протокола SPI
На практике количество ведомых устройств ограничено емкостью нагрузки системы, что снижает способность ведущего устройства точно переключать уровни напряжения.
Принцип работы
тактовый сигнал
Один бит данных передается за каждый такт,Поэтому скорость передачи данных зависит от частоты тактового сигнала. тактовый сигнал генерируется конфигурацией Хозяин,Поэтому SPI-коммуникацию всегда запускает Хозяин.
Совместное использование устройств Любой протокол сигнальной связи называется синхронизацией. SPI — это протокол синхронной связи, существуют также асинхронные протоколы связи, не использующие тактовый протокол. сигнал。Например В UART-связь,Обе стороны настроены на предварительно настроенную скорость передачи данных.,Скорость передачи данных определяет скорость и время передачи данных.
сигнал выбора чипа
Ведущий включает связь, понижая уровень CS/SS ведомого. В состоянии ожидания/отсутствия передачи линия выбора чипа остается на высоком уровне. На ведущем устройстве может быть несколько контактов CS/SS, что позволяет ведущему взаимодействовать с несколькими различными ведомыми устройствами.
Если у ведущего устройства доступен только один вывод выбора чипа, эти ведомые устройства можно подключить через:
МОСИ ВА МИСО
Ведущий отправляет данные ведомому в последовательном режиме через MOSI, а ведомый также может отправлять данные ведущему через MISO, и то и другое можно делать одновременно. Таким образом, теоретически SPI — это полнодуплексный протокол связи.
Этапы переноса
1. Хозяинвыходтактовый сигнал
2. Ведущий устанавливает низкий уровень на выводе SS/CS, чтобы активировать ведомое устройство.
3. Мастер отправляет данные подчиненному через MOSI.
4. Если требуется ответ, ведомое устройство возвращает данные хосту через MISO.
У использования SPI есть некоторые преимущества и недостатки, которые следует полностью учитывать с учетом требований проекта при выборе между различными протоколами связи.
плюсы и минусы
преимущество
Связь SPI не имеет стартовых и стоповых битов, поэтому данные могут передаваться непрерывно без перерывов, отсутствует сложная система адресации подчиненных устройств, такая как I2C, а скорость передачи данных выше, чем у I2C (почти в два раза быстрее). Независимые линии MISO и MOSI могут отправлять и получать данные одновременно.
недостаток
SPI использует четыре провода (I2C и UART используют два провода), нет подтверждения успешного приема сигнала (у I2C есть такая функция) и нет никакой проверки ошибок (например, битов четности в UART и т. д.).
UART означает универсальный асинхронный приемник/передатчик, также известный как последовательная связь. Это не протокол связи, такой как SPI и I2C, а физическая схема в микроконтроллере или отдельной микросхеме. Основная цель UART — отправка и получение данных, самое лучшее в этом то, что для передачи данных между устройствами он использует всего два провода. Принципы UART легко понять, но если вы не читали SPI Протоколы связи — это может быть хорошим началом.
В UART-связь,Два UART напрямую взаимодействуют друг с другом. Отправьте UART для преобразования параллельных данных устройства управления (например, ЦП) в последовательную форму.,Отправьте его на принимающий UART последовательным образом. Для передачи данных между двумя UART необходимы всего два провода.,Данные передаются с вывода Tx передающего UART на вывод Rx принимающего UART:
UART — это асинхронная связь,Это значит нет тактового сигнала,Вместо этого к пакету добавляются стартовый и стоповый биты. Эти биты определяют начало и конец пакета.,Таким образом, принимающий UART знает, когда читать эти данные.
Когда принимающий UART обнаруживает стартовый бит, он считывает его с определенной скоростью передачи данных. Скорость передачи данных — это мера скорости передачи данных, выраженная в битах в секунду (бит/с). Оба UART должны работать примерно с одинаковой скоростью передачи данных, скорость передачи между передающим и принимающим UART может отличаться только примерно на 10%.
Принцип работы
После того, как отправляющий UART получает параллельные данные из шины данных, он добавляет стартовый бит, бит четности и стоповый бит, чтобы сформировать пакет данных и выводить его последовательно по битам с контакта Tx, принимающий UART выводит его последовательно на его вывод Rx. Прочитайте пакет по крупицам.
Данные UART состоят из 1 стартового бита, от 5 до 9 бит данных (в зависимости от UART), дополнительного бита четности и 1 или 2 стоповых битов:
Стартовый бит:
Линии передачи данных UART обычно остаются под высоким уровнем напряжения, когда данные не передаются. При запуске передачи передающий UART переводит линию передачи с высокого уровня на низкий за один такт. Когда принимающий UART обнаруживает переход от высокого напряжения к низкому, он начинает читать кадр данных на частоте битовой скорости.
Кадр данных:
Кадр данных содержит фактические передаваемые данные. Если используются биты четности, это может быть от 5 до 8 бит. Если биты четности не используются, длина кадра данных может составлять 9 бит.
Контрольная цифра:
Бит четности — это то, как принимающий UART определяет, изменились ли какие-либо данные во время передачи. После получения UART для чтения кадра данных он подсчитает количество бит со значением 1 и проверит, является ли общее число четным или нечетным и соответствует ли он данным.
Стоп-бит:
Чтобы сигнализировать об окончании пакета, отправляющий UART переводит линию передачи данных с низкого напряжения на высокое напряжение как минимум на два бита.
Этапы переноса
2. Отправьте UART, чтобы добавить стартовый бит, бит четности и стоповый бит в данные Кадр:
3. Весь пакет данных последовательно отправляется от передающего UART к принимающему UART. Принимающий UART производит выборку линии данных с предварительно настроенной скоростью передачи данных:
4. Принимающий UART отбрасывает стартовый бит в кадре данных, бит четности и Стоп-бит:
5. Принимающий UART преобразует последовательные данные обратно в параллельные данные и передает их на шину данных на принимающей стороне:
плюсы и минусы
Ни один протокол связи не идеален, но UART очень хорошо справляется со своей задачей. Вот некоторые плюсы и минусы, которые помогут вам решить, подходят ли они для нужд вашего проекта:
преимущество
недостаток
Шина I2C — это простая двунаправленная двухпроводная синхронная последовательная шина, разработанная Philips. Для передачи информации требуется всего два провода. он сочетает в себе SPI и UART изпреимущество,Вы можете подключить несколько слейвов к одному Хозяину (как это делает SPI),Также возможно использовать несколько Хозяинов для управления одним или несколькими ведомыми устройствами. Если вы хотите, чтобы несколько микроконтроллеров записывали данные на одну карту памяти или отображали текст на одном ЖК-дисплее.,Это будет очень полезно.
SDA (Serial Data) – линия данных.
SCL (Serial Clock) – линия синхронизации.
I2C — это протокол последовательной связи, поэтому данные передаются побитно по SDA. Как и SPI, I2C также требует сигнала синхронизации часов, и часы всегда управляются хостом.
Принцип работы
Передача данных I2C осуществляется в виде нескольких сообщений.,Каждое сообщение содержит кадр двоичного адреса ведомого устройства.,и один или несколькофрейм данные, также включает условие запуска и условие остановки, бит чтения/записиифрейм Подтверждение между данными / Бит NACK:
Условие запуска: когда SCL находится на высоком уровне, SDA переключается с высокого уровня на низкий уровень.
Условие остановки: когда SCL имеет высокий уровень, SDA переключается с низкого уровня на высокий уровень.
Адресный кадр: уникальная 7-битная или 10-битная последовательность для каждого ведомого устройства, используемая для идентификации адреса между главным и ведомым устройствами.
Бит чтения/записи: один бит, если хост отправляет данные подчиненному устройству, это низкий уровень, а при запросе данных — высокий уровень.
ACK/NACK: за каждым кадром сообщения следует бит ACK/NACK. Если адресный кадр или кадр данных успешно получен, принимающее устройство вернет бит ACK для подтверждения.
обращение
Поскольку I2C не имеет линии выбора чипа, такой как SPI, для подтверждения подчиненного устройства необходимо использовать другой метод, и этот метод —— обращение 。
Мастер отправляет каждому подчиненному устройству адрес подчиненного устройства, с которым он хочет связаться, и каждый подчиненный сравнивает его со своим собственным адресом. Если адреса совпадают, он отправляет хосту младший бит ACK. В случае несоответствия никакие действия не выполняются, и линия SDA остается на высоком уровне.
бит чтения/записи
Конец адресного кадра содержит бит чтение/запись. Если Хозяин хочет отправить данные подчиненному,Это низкий уровень. Если Хозяин запрашивает данные у слейва,Это высокий уровень.
фрейм данных
Когда Хозяин обнаруживает бит ACK ведомого устройства, он может отправить первый кадр. данных Понятно。фрейм данные всегда 8 бит, каждый кадр данные, за которыми следует подтверждение / Бит NACK для проверки статуса приема. Когда весь кадр отправлен После получения данных Хозяин может послать ведомому устройству условие остановки, чтобы прекратить связь.
Этапы переноса
1. Хост инициирует обмен данными по шине, переключая линию SDA с высокого уровня на низкий, пока линия SCL находится на высоком уровне.
2. Хозяин отправляет на шину 7-битный или 10-битный адрес слейва для связи, и бит чтения/записи:
3. Каждый подчиненный сравнивает адрес, отправленный ведущим, со своим собственным адресом. Если адреса совпадают, ведомое устройство возвращает бит ACK, переводя линию SDA на один бит ниже. Если адрес ведущего устройства не совпадает с адресом ведомого, ведомое устройство поднимает линию SDA на высокий уровень.
4. Хозяин Отправить или получить Кадр данных:
5. После передачи каждого кадра данныхназад,Принимающее устройство возвращает отправителю еще один бит ACK.,Чтобы подтвердить, что кадр был успешно получен:
6. Затем ведущий переключает высокий уровень SCL, а затем высокий уровень SDA, чтобы отправить подчиненному устройству условие остановки.
Один главный против нескольких подчиненных
Поскольку I2C использует функцию обращения,Несколько рабов могут управляться одним Хозяином. При использовании 7-битного адреса,Можно использовать максимум 128 (27) уникальных адресов. Использование 10-значных адресов встречается редко.,Однако можно указать 1024 (210) уникальных адресов. Если вы хотите подключить несколько слейвов к одному Хозяину,Для их подключения используйте подтягивающий резистор сопротивлением 4,7 к Ом.,Например подключим линии SDAиSCL к Vcc:
Несколько мастеров против нескольких ведомых
I2C поддерживает несколько Хозяинов, подключенных к нескольким подчиненным устройствам одновременно.,Когда два Хозяина пытаются одновременно отправить или получить данные по линии SDA,Проблемы возникнут. Таким образом, каждому Хозяину необходимо определить, находится ли линия SDA на низком или высоком уровне, прежде чем отправлять сообщение. Если линия SDA низкая,Это значит, что автобусом управляет другой Хозяин. Если линия SDA имеет высокий уровень,Тогда данные можно будет безопасно отправить. Если вы хотите подключить несколько Хозяинов к нескольким слейвам,Подключите линии SDAиSCL к Vcc, используя подтягивающий резистор сопротивлением 4,7 к Ом:
плюсы и минусы
I2C может показаться сложным по сравнению с другими протоколами. Вот некоторые плюсы и минусы, которые помогут вам решить, подходят ли они для нужд вашего проекта:
преимущество
недостаток
*Отказ от ответственности: авторские права принадлежат оригинальному автору. Если есть какие-либо нарушения, свяжитесь с нами, чтобы удалить их.