Как работает Bit Banging и как ее использовать для эмуляции интерфейса SPI в Arduino


Коммуникационные интерфейсы являются одним из факторов, которые учитываются при выборе микроконтроллера для использования в каком-либо электронном проекте. Разработчик гарантирует, что выбранный микроконтроллер имеет все интерфейсы, необходимые для связи со всеми другими компонентами, которые будут использоваться в продукте. Существование некоторых из этих интерфейсов, таких как SPI и I2C, на микроконтроллере неизменно увеличивает стоимость таких микроконтроллеров, что, конечно же, не может радовать. А что, если хочется использовать подобный интерфейс, а в микроконтроллере его нет? В этих ситуациях как раз на помощь и приходят такие методы, как Bit Banging.

Принцип использования Bit Banging для интерфейса SPI

Что такое Bit Banging?

Bit Banging (дословно - битовый обмен) — это метод последовательной связи, при котором весь процесс связи управляется с помощью программного обеспечения, а не специального оборудования. Для передачи данных этот метод предполагает использование программного обеспечения для кодирования данных в сигналы и импульсы, которые используются для управления состоянием контакта ввода-вывода микроконтроллера, который служит выводом Tx для отправки данных на целевое устройство. Для получения данных этот метод включает в себя проверку состояния контакта Rx через определенные интервалы, которые определяются скоростью передачи данных. Программное обеспечение устанавливает все параметры, необходимые для достижения этой связи, включая синхронизацию, время, уровни и т. д., которые обычно определяются специальным оборудованием, когда не используется технология Bit Banging.

Для технологии Bit Banging важно соблюдение правильных таймингов

Когда использовать Bit Banging

Bit-Banging обычно используется в ситуациях, когда микроконтроллер с требуемым интерфейсом недоступен или когда переход на микроконтроллер с требуемым интерфейсом может оказаться слишком дорогим. Таким образом, это обеспечивает дешевый способ позволить одному и тому же устройству взаимодействовать с использованием нескольких протоколов. Микроконтроллер, который ранее был доступен только для связи UART, может быть оборудован для связи с использованием SPI и I2C при помощи битового обмена (Bit-Banging).

Алгоритм последовательной связи посредством битового обмена

Хотя код реализации битовой обработки может отличаться в разных микроконтроллерах, а также может различаться для разных последовательных протоколов, процедура/алгоритм реализации битовой обработки одинаков на всех платформах.

Например, для отправки данных используется приведенный ниже псевдокод:

  1. Начать связь (Start).
  2. Отправить стартовый бит.
  3. Подождать, пока время не будет соответствовать скорости передачи данных приемника.
  4. Отправить бит данных.
  5. Подождать, пока продолжительность снова будет соответствовать скорости передачи данных приемника.
  6. Проверить, все ли биты данных отправлены. Если нет, перейдите к шагу 4. Если да, перейдите к шагу 7.
  7. Отправить стоп-бит.
  8. Остановиться.

Прием данных имеет тенденцию быть немного более сложным: обычно используются прерывания, чтобы определить, когда данные доступны на выводе приемника. Это помогает гарантировать, что микроконтроллер не тратит слишком много вычислительной мощности. Хотя в некоторых реализациях используются любые контакты ввода-вывода микроконтроллера, вероятность возникновения шума и ошибок, если их не устранить, выше. Алгоритм получения данных с использованием прерываний выглядит следующим образом:

  1. Начать связь (Start).
  2. Включить прерывание на выводе Rx.
  3. Когда срабатывает прерывание, получить стартовый бит.
  4. Подождать пока пройдет время, зависящее от скорости передачи данных.
  5. Считать информацию с контакта Rx.
  6. Повторять шаг 4 до тех пор, пока все данные не будут получены.
  7. Подождать пока пройдет время, зависящее от скорости передачи данных.
  8. Проверить наличие стоп-бита.
  9. Остановиться.

Bit Banging через интерфейс SPI

Как упоминалось выше, обработка битов для разных протоколов работает по-разному, поэтому важно прочитать о каждом протоколе, чтобы понять структуру данных и принцип синхронизации, прежде чем пытаться реализовать. Если взять в качестве примера режим 1 интерфейса SPI, то базовое значение тактового сигнала всегда равно 0, а данные всегда отправляются или принимаются по нарастающему фронту тактового сигнала. Временная диаграмма протокола связи SPI в Mode 1 показана на следующем рисунке.

Временная диаграмма протокола связи SPI в Mode 1

Для реализации этого режима можно использовать следующий алгоритм:

  1. Начать.
  2. Установить низкий уровень на выводе SS, чтобы начать связь.
  3. Установить вывод Master Out Slave In (MOSI) в соответствии с первым битом отправляемых данных.
  4. Установить высокий уровень на тактовом выводе (SCK), чтобы данные передавались ведущим и принимались ведомым.
  5. Прочитать состояние ведущего на выходе ведомого (MISO), чтобы получить первый бит данных от ведомого.
  6. Установить низкий уровень SCK, чтобы данные можно было отправлять по следующему фронту нарастания.
  7. Перейти к пункту 2, пока все биты данных не будут переданы.
  8. Установить высокий уровень на выводе SS, чтобы остановить передачу.
  9. Остановиться.

Пример использования Bit Banging для связи по интерфейсу SPI в Arduino

В качестве примера давайте реализуем алгоритм связи SPI посредством побитового преобразования в Arduino, то есть используем программный способ связи по интерфейсу SPI.

Начнем с объявления используемых контактов Arduino.

Далее в функции void setup() зададим режимы работы контактов. Только вывод Master-in-Slave Out (MISO) объявлен как вход, поскольку это единственный контакт, который будет получать данные. Все остальные контакты объявлены как выходные. После объявления режимов работы контакт SS устанавливается на ВЫСОКИЙ уровень. Причина этого заключается в том, чтобы гарантировать отсутствие ошибок в процессе и обмен данными, который начинается только тогда, когда он установлен на низкий уровень.

Далее мы запускаем цикл отправки данных. Обратите внимание, что этот цикл будет продолжать отправлять данные неоднократно.

Мы запускаем цикл , записывая на вывод SS низкий уровень, чтобы инициировать начало связи, и вызываем функцию bitbangdata, которая разбивает предопределенные данные на биты и отправляет. После этого мы записываем на контакт SS ВЫСОКИЙ уровень, чтобы указать конец передачи данных.

В функции bitbangdata() мы принимаем данные для отправки, разбиваем их на биты и отправляем, циклически перебирая код для передачи, как указано на шаге 7 алгоритма.

Недостатки Bit Banging

Однако внедрение битовой обработки должно быть хорошо продуманным решением, поскольку у этой технологии есть несколько недостатков, которые могут сделать ее ненадежной для реализации в определенных решениях. Использование этой технологии приводит к увеличению мощности, потребляемой микроконтроллером, из-за высокой вычислительной мощности, потребляемой этим процессом. По сравнению со специализированным оборудованием, при использовании технологии Bit Banging возникает больше ошибок связи, таких как сбои и дрожания, особенно когда передача данных выполняется микроконтроллером одновременно с другими задачами. Связь посредством битового обмена всегда составляет лишь некоторую долю от той скорости, с которой она происходит при использовании выделенного оборудования. А это может быть важно в некоторых приложениях и может сделать Bit Banging «не очень хорошим» выбором в этих случаях.

Технология Bit Banging используется для всех видов последовательной связи, в том числе RS-232, асинхронная последовательная связь, UART, SPI и I2C.

UART для Bit banging в Arduino

Одной из популярных реализаций технологии Bit Banging является библиотека Software Serial программного обеспечения Arduino, которая позволяет Arduino обмениваться данными через UART без использования выделенных аппаратных выводов UART (D0 и D1). Это дает большую гибкость, поскольку пользователи могут подключать столько последовательных устройств, сколько поддерживает количество контактов на плате Arduino. Пример использования данной библиотеки можно посмотреть в этой статье.

(Проголосуй первым!)
Загрузка...
32 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *