- Какво представлява биенето на битове?
- Кога да се използва битово разбиване
- Алгоритъм за последователна комуникация чрез битово разбиване
- Разбиване на битове през SPI
- Пример за биене на битове: SPI комуникация в Arduino
- Недостатъци на биенето на битове
- UART чрез биене на битове в Arduino
Комуникационните интерфейси са един от факторите, които се вземат предвид при избора на микроконтролер, който да се използва за проект. Дизайнерът гарантира, че избраният микроконтролер има всички интерфейси, необходими за комуникация с всички останали компоненти, които ще се използват за продукта. Съществуването на някои от тези интерфейси като SPI и I2C на микроконтролера неизменно увеличава цената на такива микроконтролери и в зависимост от бюджета на спецификацията може да направи желания микроконтролер недостъпен. В ситуации като тези техниките като Bit Banging влизат в игра.
Какво представлява биенето на битове?
Удрянето на битове е техника за последователна комуникация, при която целият комуникационен процес се обработва чрез софтуер вместо специален хардуер. За предаване на данни техниката включва използването на софтуер за кодиране на данните в сигнали и импулси, които се използват за манипулиране на състоянието на I / O щифт на микроконтролер, който служи като Tx щифт за изпращане на данни към целевото устройство. За да се получат данни, техниката включва вземане на проби от състоянието на Rx щифта след определени интервали, което се определя от скоростта на комуникация в бод. Софтуерът задава всички параметри, необходими за постигане на тази комуникация, включително синхронизация, синхронизация, нива и т.н., които обикновено се решават от специален хардуер, когато не се използва разбиване на битове.
Кога да се използва битово разбиване
Bit-Banging обикновено се използва в ситуации, когато микроконтролер с необходимия интерфейс не е наличен или когато преминаването към микроконтролер с необходимия интерфейс може да е твърде скъпо. По този начин той осигурява евтин начин да се даде възможност на едно и също устройство да комуникира с помощта на няколко протокола. Микроконтролер, който преди това е разрешен само за UART комуникация, може да бъде оборудван за комуникация чрез SPI и 12C чрез бит бит.
Алгоритъм за последователна комуникация чрез битово разбиване
Докато кодът за внедряване на битово разбиване може да се различава при различните микроконтролери и може да варира за различните серийни протоколи, но процедурата / алгоритъмът за внедряване на битово разбиване е еднакъв на всички платформи.
За изпращане на данни например се използва псевдокодът по-долу;
- Започнете
- Изпрати начален бит
- Изчакайте времето да съответства на скоростта на предаване на приемника
- Изпращане на бит за данни
- Изчакайте продължителността отново да съответства на скоростта на предаване на приемника
- Проверете дали всички битове за данни са изпратени. Ако не, отидете на 4. Ако отговорът е да, отидете на 7
- Изпрати стоп бит
- Спри се
Получаването на данни има тенденция да бъде малко по-сложно, обикновено се използва прекъсване, за да се определи кога данните са налични на пина на приемника. Това помага да се гарантира, че микроконтролерът не губи твърде много процесорна мощ. Въпреки че някои реализации използват някой от I / O щифтовете на микроконтролерите, но шансът за шум и грешки, ако вероятно не се обработват, е по-голям. Алгоритъмът за получаване на данни чрез прекъсвания е обяснен по-долу.
- Започнете
- Активиране на прекъсване на 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 щифта High, за да спрете предаването.
- Спри се
Пример за биене на битове: 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. Причината за това е да се гарантира, че процесът е без грешки и комуникацията започва само когато е зададена на ниско ниво.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
След това започваме цикъла за изпращане на данни. Имайте предвид, че този цикъл ще продължи да изпраща данните многократно.
Започваме цикъла, като пишем SS щифта ниско, за да инициираме началото на комуникацията и извикваме функцията bitbangdata, която разбива предварително зададените данни на битове и изпраща. След това записваме SS пина HIGH, за да посочим края на предаването на данни.
цикъл void () { 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 Software Serial библиотека, която позволява на Arduino да комуникира през UART, без да използва специалните хардуерни UART пинове (D0 и D1). Това дава голяма гъвкавост, тъй като потребителите могат да свържат толкова серийни устройства, колкото може да поддържа броят на щифтовете на платката Arduino.