- Що таке розбиття бітів?
- Коли використовувати Bit Banging
- Алгоритм послідовного зв'язку за допомогою розбиття бітів
- Розбиття бітів через SPI
- Приклад розбиття бітів: зв’язок SPI в Arduino
- Недоліки розбиття бітів
- UART через розбиття бітів в Arduino
Інтерфейси зв'язку - це один із факторів, який враховується при виборі мікроконтролера, який буде використовуватися для проекту. Дизайнер гарантує, що обраний мікроконтролер має всі інтерфейси, необхідні для зв'язку з усіма іншими компонентами, що використовуються для виробу. Існування деяких з цих інтерфейсів, таких як SPI та I2C, на мікроконтролері незмінно збільшує вартість таких мікроконтролерів, і залежно від бюджету специфікації це може зробити бажаний мікроконтролер недоступним. У таких ситуаціях застосовуються такі методи, як Bit Banging.
Що таке розбиття бітів?
Розбиття бітів - це техніка послідовного зв'язку, при якій весь процес зв'язку обробляється за допомогою програмного забезпечення, а не спеціального обладнання. Для передачі даних техніка передбачає використання програмного забезпечення для кодування даних у сигнали та імпульси, які використовуються для маніпулювання станом виводу вводу-виводу мікроконтролера, який служить виводом Tx для передачі даних цільовому пристрою. Для отримання даних методика включає вибірку стану виводу Rx через певні проміжки часу, що визначається швидкістю передачі даних в боді. Програмне забезпечення встановлює всі параметри, необхідні для досягнення цього зв'язку, включаючи синхронізацію, синхронізацію, рівні тощо, які, як правило, приймаються спеціальним обладнанням, коли не використовується биття бітів.
Коли використовувати Bit Banging
Bit-Banging зазвичай використовується в ситуаціях, коли мікроконтролер з необхідним інтерфейсом недоступний або при переході на мікроконтролер з необхідним інтерфейсом може бути занадто дорого. Таким чином, це забезпечує дешевий спосіб дозволити одному пристрою спілкуватися за допомогою декількох протоколів. Мікроконтролер, який раніше вмикався лише для зв'язку UART, може бути обладнаний для спілкування за допомогою SPI та 12C за допомогою розбиття бітів.
Алгоритм послідовного зв'язку за допомогою розбиття бітів
Хоча код для реалізації розбиття бітів може відрізнятися у різних мікроконтролерів, а також може відрізнятися для різних послідовних протоколів, але процедура / алгоритм реалізації розбиття бітів однаковий на всіх платформах.
Для надсилання даних, наприклад, використовується псевдо-код нижче;
- Почніть
- Відправити початковий біт
- Зачекайте, поки синхронізація відповідатиме швидкості передачі даних приймача
- Надіслати біт даних
- Зачекайте, поки тривалість знову відповідатиме швидкості передачі даних приймача
- Перевірте, чи всі біти даних надіслані. Якщо ні, перейдіть до 4. Якщо так, перейдіть до 7
- Надіслати стоп-біт
- Стій
Отримання даних, як правило, є дещо складнішим, зазвичай переривання використовується для визначення, коли дані доступні на штифті приймача. Це допомагає забезпечити, щоб мікроконтролер не витрачав занадто багато обробної потужності. Хоча певні реалізації використовують будь-який з висновків вводу-виводу мікроконтролерів, але ймовірність шуму та помилок, якщо це, мабуть, не обробляється, вища. Алгоритм отримання даних із використанням переривань пояснюється нижче.
- Почніть
- Увімкнути переривання на штифті Rx
- Коли спрацьовує переривання, отримайте стартовий біт
- Зачекайте часу відповідно до швидкості передачі
- Прочитайте штифт Rx
- Повторюйте з 4 до отримання всіх даних
- Зачекайте часу відповідно до швидкості передачі
- Перевірте стоп-біт
- Стій
Розбиття бітів через SPI
Як вже згадувалося вище, розбиття бітів для різних протоколів працює по-різному, і тому важливо прочитати про кожен протокол, зрозуміти процес кадрового та синхронізації даних перед спробою реалізації. Взявши в якості прикладу режим SPI 1, базове значення годинника завжди дорівнює 0, а дані завжди надсилаються або приймаються по висхідному краю годинника. Часова діаграма для протоколу зв'язку SPI Mode 1 показана нижче.
Для реалізації цього може бути використаний наступний алгоритм;
- Почніть
- Встановіть штифт SS низьким, щоб розпочати зв’язок
- Встановіть штифт для Master Out Slave In (MOSI) на перший біт даних, що надсилаються
- Установіть високий штифт тактової частоти (SCK) так, щоб дані передавалися ведучим і приймали веденим
- Прочитайте стан Master in Slave Out (MISO), щоб отримати перший біт даних від slave
- Встановіть SCK Low, щоб дані могли надсилатися на наступному висхідному фронті
- Перейдіть до 2, поки не будуть передані всі біти даних.
- Встановіть високий штифт SS, щоб зупинити передачу.
- Стій
Приклад розбиття бітів: зв’язок 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 встановлюється на ВИСОКИЙ. Причиною цього є переконання, що процес не містить помилок, а зв’язок починається лише тоді, коли встановлено низький рівень.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, ВИХІД); digitalWrite (SSPin, HIGH); }
Далі ми запускаємо цикл для надсилання даних. Зверніть увагу, що цей цикл буде продовжувати надсилати дані неодноразово.
Ми починаємо цикл , записуючи низький рівень виводу SS, щоб ініціювати початок зв'язку, і викликаємо функцію bitbangdata, яка розбиває попередньо визначені дані на біти та надсилає. Після цього ми потім пишемо SS-штифт HIGH, щоб вказати кінець передачі даних.
void loop () { digitalWrite (SSPin, LOW); // SS низький slaveData = bitBangData (sendData); // передача даних digitalWrite (SSPin, HIGH); // SS знову високий }
Bitbangdata () Функція написано нижче. Функція приймає дані, що надсилаються, розбиває їх на біти і надсилає, перебираючи код для передачі, як зазначено на кроці 7 алгоритму.
byte bitBangData (byte _send) // Ця функція передає дані за допомогою bitbanging { 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; // Повернення отриманих даних }
Недоліки розбиття бітів
Однак прийняття розбиття бітів має бути продуманим рішенням, оскільки є кілька недоліків удару розрядів, які можуть зробити його ненадійним для реалізації в певних рішеннях. Розбиття бітів збільшує потужність, споживану мікроконтролером, завдяки високій обробній потужності, споживаній процесом. У порівнянні зі спеціальним обладнанням, більше помилок зв'язку, таких як збої та тремтіння, виникає, коли використовується розбиття бітів, особливо коли передача даних здійснюється мікроконтролером одночасно з іншими завданнями. Зв'язок за допомогою розбиття бітів відбувається з часткою швидкості, з якою це відбувається, коли використовується спеціальне обладнання. Це може бути важливим у певних програмах і може зробити "биття" "не дуже хорошим" вибором.
Розбиття бітів використовується для всіх видів послідовного зв'язку, включаючи; RS-232, Асинхронний послідовний зв’язок, UART, SPI та I2C.
UART через розбиття бітів в Arduino
Однією з популярних реалізацій розбиття бітів є послідовна бібліотека програмного забезпечення Arduino, яка дозволяє Arduino обмінюватися даними через UART без використання спеціальних апаратних виводів UART (D0 та D1). Це надає велику гнучкість, оскільки користувачі можуть підключати стільки послідовних пристроїв, скільки може підтримувати кількість контактів на платі Arduino.