Коммуникационные интерфейсы являются одним из факторов, которые учитываются при выборе микроконтроллера для использования в каком-либо электронном проекте. Разработчик гарантирует, что выбранный микроконтроллер имеет все интерфейсы, необходимые для связи со всеми другими компонентами, которые будут использоваться в продукте. Существование некоторых из этих интерфейсов, таких как SPI и I2C, на микроконтроллере неизменно увеличивает стоимость таких микроконтроллеров, что, конечно же, не может радовать. А что, если хочется использовать подобный интерфейс, а в микроконтроллере его нет? В этих ситуациях как раз на помощь и приходят такие методы, как Bit Banging.
Что такое Bit Banging?
Bit Banging (дословно - битовый обмен) — это метод последовательной связи, при котором весь процесс связи управляется с помощью программного обеспечения, а не специального оборудования. Для передачи данных этот метод предполагает использование программного обеспечения для кодирования данных в сигналы и импульсы, которые используются для управления состоянием контакта ввода-вывода микроконтроллера, который служит выводом Tx для отправки данных на целевое устройство. Для получения данных этот метод включает в себя проверку состояния контакта Rx через определенные интервалы, которые определяются скоростью передачи данных. Программное обеспечение устанавливает все параметры, необходимые для достижения этой связи, включая синхронизацию, время, уровни и т. д., которые обычно определяются специальным оборудованием, когда не используется технология Bit Banging.
Когда использовать Bit Banging
Bit-Banging обычно используется в ситуациях, когда микроконтроллер с требуемым интерфейсом недоступен или когда переход на микроконтроллер с требуемым интерфейсом может оказаться слишком дорогим. Таким образом, это обеспечивает дешевый способ позволить одному и тому же устройству взаимодействовать с использованием нескольких протоколов. Микроконтроллер, который ранее был доступен только для связи UART, может быть оборудован для связи с использованием SPI и I2C при помощи битового обмена (Bit-Banging).
Алгоритм последовательной связи посредством битового обмена
Хотя код реализации битовой обработки может отличаться в разных микроконтроллерах, а также может различаться для разных последовательных протоколов, процедура/алгоритм реализации битовой обработки одинаков на всех платформах.
Например, для отправки данных используется приведенный ниже псевдокод:
- Начать связь (Start).
- Отправить стартовый бит.
- Подождать, пока время не будет соответствовать скорости передачи данных приемника.
- Отправить бит данных.
- Подождать, пока продолжительность снова будет соответствовать скорости передачи данных приемника.
- Проверить, все ли биты данных отправлены. Если нет, перейдите к шагу 4. Если да, перейдите к шагу 7.
- Отправить стоп-бит.
- Остановиться.
Прием данных имеет тенденцию быть немного более сложным: обычно используются прерывания, чтобы определить, когда данные доступны на выводе приемника. Это помогает гарантировать, что микроконтроллер не тратит слишком много вычислительной мощности. Хотя в некоторых реализациях используются любые контакты ввода-вывода микроконтроллера, вероятность возникновения шума и ошибок, если их не устранить, выше. Алгоритм получения данных с использованием прерываний выглядит следующим образом:
- Начать связь (Start).
- Включить прерывание на выводе Rx.
- Когда срабатывает прерывание, получить стартовый бит.
- Подождать пока пройдет время, зависящее от скорости передачи данных.
- Считать информацию с контакта Rx.
- Повторять шаг 4 до тех пор, пока все данные не будут получены.
- Подождать пока пройдет время, зависящее от скорости передачи данных.
- Проверить наличие стоп-бита.
- Остановиться.
Bit Banging через интерфейс SPI
Как упоминалось выше, обработка битов для разных протоколов работает по-разному, поэтому важно прочитать о каждом протоколе, чтобы понять структуру данных и принцип синхронизации, прежде чем пытаться реализовать. Если взять в качестве примера режим 1 интерфейса SPI, то базовое значение тактового сигнала всегда равно 0, а данные всегда отправляются или принимаются по нарастающему фронту тактового сигнала. Временная диаграмма протокола связи SPI в Mode 1 показана на следующем рисунке.
Для реализации этого режима можно использовать следующий алгоритм:
- Начать.
- Установить низкий уровень на выводе SS, чтобы начать связь.
- Установить вывод Master Out Slave In (MOSI) в соответствии с первым битом отправляемых данных.
- Установить высокий уровень на тактовом выводе (SCK), чтобы данные передавались ведущим и принимались ведомым.
- Прочитать состояние ведущего на выходе ведомого (MISO), чтобы получить первый бит данных от ведомого.
- Установить низкий уровень SCK, чтобы данные можно было отправлять по следующему фронту нарастания.
- Перейти к пункту 2, пока все биты данных не будут переданы.
- Установить высокий уровень на выводе SS, чтобы остановить передачу.
- Остановиться.
Пример использования Bit Banging для связи по интерфейсу SPI в Arduino
В качестве примера давайте реализуем алгоритм связи SPI посредством побитового преобразования в Arduino, то есть используем программный способ связи по интерфейсу SPI.
Начнем с объявления используемых контактов Arduino.
1 2 3 4 5 6 7 |
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; byte sendData = 64; // значение которое будем передавать byte slaveData = 0; // для хранения значения, посланного slave'ом |
Далее в функции void setup() зададим режимы работы контактов. Только вывод Master-in-Slave Out (MISO) объявлен как вход, поскольку это единственный контакт, который будет получать данные. Все остальные контакты объявлены как выходные. После объявления режимов работы контакт SS устанавливается на ВЫСОКИЙ уровень. Причина этого заключается в том, чтобы гарантировать отсутствие ошибок в процессе и обмен данными, который начинается только тогда, когда он установлен на низкий уровень.
1 2 3 4 5 6 7 8 |
void setup() { pinMode(MISOPin, INPUT); pinMode(SSPin, OUTPUT); pinMode(SCKPin, OUTPUT); pinMode(MOSIPin, OUTPUT); digitalWrite(SSPin, HIGH); } |
Далее мы запускаем цикл отправки данных. Обратите внимание, что этот цикл будет продолжать отправлять данные неоднократно.
Мы запускаем цикл , записывая на вывод SS низкий уровень, чтобы инициировать начало связи, и вызываем функцию bitbangdata, которая разбивает предопределенные данные на биты и отправляет. После этого мы записываем на контакт SS ВЫСОКИЙ уровень, чтобы указать конец передачи данных.
1 2 3 4 5 6 |
void loop() { digitalWrite(SSPin, LOW); // SS low slaveData = bitBangData(sendData); // data transmission digitalWrite(SSPin, HIGH); // SS high again } |
В функции bitbangdata() мы принимаем данные для отправки, разбиваем их на биты и отправляем, циклически перебирая код для передачи, как указано на шаге 7 алгоритма.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
byte bitBangData(byte _send) // This function transmit the data via bitbanging { byte _receive = 0; for(int i=0; i<8; i++) // 8 bits in a byte { digitalWrite(MOSIPin, bitRead(_send, i)); // Set MOSI digitalWrite(SCKPin, HIGH); // SCK high bitWrite(_receive, i, digitalRead(MISOPin)); // Capture MISO digitalWrite(SCKPin, LOW); // SCK low } return _receive; // Return the received data } |
Недостатки 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. Пример использования данной библиотеки можно посмотреть в этой статье.
117 просмотров