- Что такое Bit Banging?
- Когда использовать Bit Banging
- Алгоритм последовательной связи через Bit Banging
- Bit Banging через SPI
- Пример Bit Banging: связь SPI в Arduino
- Недостатки Bit Banging
- UART через Bit banging в Arduino
Коммуникационные интерфейсы являются одним из факторов, которые учитываются при выборе микроконтроллера для использования в проекте. Разработчик гарантирует, что выбранный микроконтроллер имеет все интерфейсы, необходимые для связи со всеми другими компонентами, которые будут использоваться для продукта. Наличие на микроконтроллере некоторых из этих интерфейсов, таких как SPI и I2C, неизменно увеличивает стоимость таких микроконтроллеров, и в зависимости от бюджета спецификации может сделать желаемый микроконтроллер недоступным. В подобных ситуациях пригодятся такие техники, как Bit Banging.
Что такое Bit Banging?
Bit banging - это метод последовательной связи, при котором весь процесс связи обрабатывается с помощью программного обеспечения, а не специального оборудования. Для передачи данных метод включает использование программного обеспечения для кодирования данных в сигналы и импульсы, которые используются для управления состоянием вывода ввода / вывода микроконтроллера, который служит выводом Tx для отправки данных на целевое устройство. Для получения данных метод включает выборку состояния вывода Rx через определенные интервалы, которые определяются скоростью передачи данных. Программное обеспечение устанавливает все параметры, необходимые для достижения этой связи, включая синхронизацию, синхронизацию, уровни и т. Д., Которые обычно определяются специальным оборудованием, когда не используется битовая синхронизация.
Когда использовать Bit Banging
Bit-Banging обычно используется в ситуациях, когда микроконтроллер с требуемым интерфейсом недоступен или когда переключение на микроконтроллер с требуемым интерфейсом может быть слишком дорогим. Таким образом, он обеспечивает дешевый способ подключения одного и того же устройства с использованием нескольких протоколов. Микроконтроллер, который ранее был задействован только для связи UART, может быть оборудован для связи с использованием SPI и 12C через битовую передачу.
Алгоритм последовательной связи через Bit Banging
Хотя код, реализующий перехват битов, может отличаться для разных микроконтроллеров, а также может отличаться для разных последовательных протоколов, но процедура / алгоритм для реализации переброса битов одинаковы для всех платформ.
Например, для отправки данных используется следующий псевдокод;
- Начало
- Отправить стартовый бит
- Подождите, пока время будет соответствовать скорости передачи данных приемника.
- Отправить бит данных
- Подождите, пока продолжительность снова не будет соответствовать скорости передачи данных приемника.
- Проверьте, все ли биты данных отправлены. Если нет, перейдите к 4. Если да, перейдите к 7
- Отправить стоповый бит
- Стоп
Получение данных, как правило, немного сложнее, обычно прерывание используется для определения, когда данные доступны на выводе приемника. Это помогает гарантировать, что микроконтроллер не тратит слишком много вычислительной мощности. Хотя в некоторых реализациях используются какие-либо выводы ввода-вывода микроконтроллеров, вероятность появления шума и ошибок, если они, вероятно, не устранены, выше. Алгоритм получения данных с использованием прерываний объясняется ниже.
- Начало
- Включить прерывание на выводе Rx
- При срабатывании прерывания получить стартовый бит
- Дождитесь отсчета времени в соответствии со скоростью передачи данных
- Прочтите пин Rx
- Повторяйте с 4 до тех пор, пока не будут получены все данные.
- Дождитесь отсчета времени в соответствии со скоростью передачи данных
- Проверить стоп-бит
- Стоп
Bit Banging через SPI
Как упоминалось выше, битовая синхронизация для разных протоколов работает по-разному, и поэтому важно прочитать о каждом протоколе, чтобы понять формирование данных и синхронизацию, прежде чем пытаться реализовать. Если взять режим SPI 1 в качестве примера, базовое значение тактового сигнала всегда равно 0, и данные всегда отправляются или принимаются по нарастающему фронту тактового сигнала. Временная диаграмма для протокола связи SPI Mode 1 показана ниже.
Для реализации этого можно использовать следующий алгоритм;
- Начало
- Установите низкий уровень на контакте SS, чтобы начать связь
- Установите вывод для Master Out Slave In (MOSI) на первый бит данных, которые должны быть отправлены
- Установите тактовый вывод (SCK) в высокий уровень, чтобы данные передавались ведущим и принимались ведомым
- Считайте состояние Master in Slave Out (MISO), чтобы получить первый бит данных от ведомого
- Установите SCK Low, чтобы данные можно было отправлять по следующему нарастающему фронту
- Переходите к 2, пока не будут переданы все биты данных.
- Установите высокий уровень на контакте SS, чтобы остановить передачу.
- Стоп
Пример Bit Banging: связь SPI в Arduino
В качестве примера давайте реализуем алгоритм для обмена данными по SPI в Arduino, чтобы показать, как данные могут передаваться по SPI с помощью приведенного ниже кода.
Начнем с объявления контактов Arduino, которые будут использоваться.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; байт sendData = 64; // Значение для отправки байт slaveData = 0; // для хранения значения, отправленного ведомым устройством
Затем мы переходим к функции void setup (), в которой объявляется состояние контактов. Только вывод Master in Slave Out (MISO) объявлен как вход, поскольку это единственный вывод, который принимает данные. Все остальные выводы объявлены как выходные. После объявления режимов вывода для вывода SS устанавливается значение HIGH. Причина этого состоит в том, чтобы гарантировать, что процесс не содержит ошибок, и связь начинается только тогда, когда он установлен на низкий уровень.
пустая настройка () { pinMode (MISOPin, INPUT); pinMode (SSPin, ВЫХОД); pinMode (SCKPin, ВЫХОД); pinMode (MOSIPin, ВЫХОД); digitalWrite (SSPin, HIGH); }
Далее мы запускаем цикл для отправки данных. Обратите внимание, что этот цикл будет повторно отправлять данные.
Мы начинаем цикл с записи низкого уровня на вывод SS, чтобы инициировать начало связи, и вызываем функцию bitbangdata, которая разбивает предопределенные данные на биты и отправляет их. После этого мы записываем на вывод SS HIGH, чтобы указать конец передачи данных.
void loop () { digitalWrite (SSPin, LOW); // SS low slaveData = bitBangData (sendData); // передача данных digitalWrite (SSPin, HIGH); // SS снова высокий }
Bitbangdata () Функция написано ниже. Функция принимает данные, которые должны быть отправлены, разбивает их на биты и отправляет их, перебирая код для передачи, как указано в шаге 7 алгоритма.
byte bitBangData (byte _send) // Эта функция передает данные через битовую передачу { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 бит в байте { digitalWrite (MOSIPin, bitRead (_send, i)); // Установите MOSI digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // Захват MISO digitalWrite (SCKPin, LOW); // низкий уровень SCK } return _receive; // Возвращаем полученные данные }
Недостатки Bit Banging
Тем не менее, использование побитовой обработки должно быть хорошо продуманным решением, так как есть несколько недостатков, которые могут сделать ее ненадежной для реализации в определенных решениях. Разрядность увеличивает мощность, потребляемую микроконтроллером, из-за высокой вычислительной мощности, потребляемой процессом. По сравнению со специализированным оборудованием, больше ошибок связи, таких как сбои и дрожание, возникает, когда используется перехват битов, особенно когда передача данных выполняется микроконтроллером одновременно с другими задачами. Обмен данными посредством передачи битов происходит с меньшей скоростью, чем при использовании выделенного оборудования. Это может быть важно в некоторых приложениях и может сделать выбор "не очень хорошим".
Bit banging используется для всех видов последовательной связи, включая: RS-232, асинхронная последовательная связь, UART, SPI и I2C.
UART через Bit banging в Arduino
Одной из популярных реализаций передачи битов является последовательная библиотека программного обеспечения Arduino, которая позволяет Arduino обмениваться данными через UART без использования специальных аппаратных выводов UART (D0 и D1). Это дает большую гибкость, поскольку пользователи могут подключать столько последовательных устройств, сколько может поддерживать количество контактов на плате Arduino.