- Bit Banging nedir?
- Bit Banging ne zaman kullanılır?
- Bit Banging ile Seri İletişim için Algoritma
- SPI üzerinden Bit beceriyor
- Bit Patlama Örneği: Arduino'da SPI iletişimi
- Bit Banging'in dezavantajları
- Arduino'da Bit becererek UART
İletişim Arayüzleri, bir proje için kullanılacak mikrodenetleyiciyi seçerken dikkate alınan faktörlerden biridir. Tasarımcı, seçilen mikro denetleyicinin ürün için kullanılacak diğer tüm bileşenlerle iletişim kurmak için gerekli tüm arabirimlere sahip olmasını sağlar. Mikrodenetleyici üzerinde SPI ve I2C gibi bu arabirimlerin bazılarının varlığı, bu tür mikro denetleyicilerin maliyetini her zaman arttırır ve ürün reçetesi bütçesine bağlı olarak, istenen bir mikro denetleyiciyi karşılanamaz hale getirebilir. Bu gibi durumlarda Bit Banging gibi teknikler devreye girer.
Bit Banging nedir?
Bit vurma, tüm iletişim sürecinin özel donanım yerine yazılım aracılığıyla yürütüldüğü bir seri iletişim tekniğidir. Verileri iletmek için, teknik, verileri hedef cihaza veri göndermek için Tx pini olarak görev yapan bir mikro denetleyicinin bir G / Ç pini durumunu değiştirmek için kullanılan sinyallere ve darbelere kodlamak için yazılımın kullanılmasını içerir. Veri almak için teknik, iletişim baud hızı tarafından belirlenen belirli aralıklardan sonra Rx pininin durumunun örneklenmesini içerir. Yazılım, bit banging kullanılmadığında genellikle özel donanım tarafından karar verilen senkronizasyon, zamanlama, seviyeler vb.
Bit Banging ne zaman kullanılır?
Bit-Banging, genellikle gerekli arayüze sahip bir mikro denetleyicinin mevcut olmadığı veya gerekli arabirime sahip bir mikro denetleyiciye geçmenin çok pahalı olabileceği durumlarda kullanılır. Bu nedenle, aynı cihazın birkaç protokol kullanarak iletişim kurmasını sağlamanın ucuz bir yolunu sağlar. Daha önce yalnızca UART iletişimi için etkinleştirilen bir mikro denetleyici, bit vurma yoluyla SPI ve 12C kullanarak iletişim kuracak şekilde donatılabilir.
Bit Banging ile Seri İletişim için Algoritma
Bit vuruşunu uygulamaya yönelik kod, çeşitli mikro denetleyiciler arasında farklılık gösterebilir ve farklı seri protokoller için de değişebilir, ancak bit vuruşunu uygulamaya yönelik prosedür / algoritma, tüm platformlarda aynıdır.
Örneğin veri göndermek için aşağıdaki sözde kod kullanılır;
- Başlat
- Başlangıç bitini gönder
- Zamanlamanın alıcının baud hızına karşılık gelmesini bekleyin
- Veri biti gönder
- Alıcının baud hızına tekrar denk gelmesi için süre bekleyin
- Tüm veri bitlerinin gönderilip gönderilmediğini kontrol edin. Hayır ise, 4'e gidin. Cevabınız evet ise, 7'ye gidin
- Durdurma biti gönder
- Dur
Verilerin alınması biraz daha karmaşık olma eğilimindedir, genellikle verilerin alıcı piminde ne zaman mevcut olduğunu belirlemek için bir kesme kullanılır. Bu, mikro denetleyicinin çok fazla işlem gücü harcamamasını sağlamaya yardımcı olur. Bazı uygulamalar mikro denetleyicilerin G / Ç pinlerinden herhangi birini kullansa da, gürültü ve hata olasılığı, muhtemelen ele alınmazsa daha yüksektir. Kesintileri kullanarak veri alma algoritması aşağıda açıklanmıştır.
- Başlat
- Rx pininde kesmeyi etkinleştir
- Kesme tetiklendiğinde, başlangıç bitini alın
- Baud hızına göre zamanlamayı bekleyin
- Rx pinini okuyun
- 4'ten tüm veriler alınana kadar tekrarlayın
- Baud hızına göre zamanlamayı bekleyin
- Durdurma bitini kontrol edin
- Dur
SPI üzerinden Bit beceriyor
Yukarıda bahsedildiği gibi, farklı protokoller için bit vuruşu farklı şekilde çalışır ve bu nedenle uygulamaya başlamadan önce veri çerçevelemesini ve saatini anlamak için her protokolü okumak önemlidir. SPI modu 1'i örnek olarak alırsak, saatin temel değeri her zaman 0'dır ve veriler her zaman saatin yükselen kenarında gönderilir veya alınır. SPI Mod 1 iletişim protokolü için zamanlama diyagramı aşağıda gösterilmiştir.
Bunu gerçekleştirmek için aşağıdaki algoritma kullanılabilir;
- Başlat
- İletişime başlamak için SS pinini düşük ayarlayın
- Master Out Slave In (MOSI) pinini gönderilecek verinin ilk bitine ayarlayın
- Saat pinini (SCK) yüksek olarak ayarlayın, böylece veriler ana cihaz tarafından iletilir ve ikincil cihaz tarafından alınır
- Slave'den ilk veri bitini almak için Master in Slave Out (MISO) durumunu okuyun
- SCK'yı Düşük olarak ayarlayın, böylece veriler bir sonraki yükselen kenarda gönderilebilir
- Tüm veri bitleri iletilene kadar 2'ye gidin.
- İletimi durdurmak için SS pinini Yüksek olarak ayarlayın.
- Dur
Bit Patlama Örneği: Arduino'da SPI iletişimi
Örnek olarak, aşağıdaki kodu kullanarak verilerin SPI üzerinden nasıl bit-bang yapılabileceğini göstermek için Arduino'da bit banging yoluyla SPI iletişimi için algoritmayı uygulayalım.
Kullanılacak Arduino'nun pinlerini ilan ederek başlıyoruz.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; bayt sendData = 64; // Gönderilecek değer bayt slaveData = 0; // Slave tarafından gönderilen değeri saklamak için
Daha sonra pinlerin durumunun bildirildiği void setup () fonksiyonuna geçiyoruz. Verileri alan tek pin olduğu için sadece Master in Slave out (MISO) pini giriş olarak ilan edilir. Diğer tüm pinler çıktı olarak ilan edilir. Pin modlarını bildirdikten sonra, SS pini HIGH olarak ayarlanır. Bunun nedeni, sürecin hatasız olmasını ve iletişimin yalnızca düşük ayarlandığında başlamasını sağlamaktır.
geçersiz kurulum () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Ardından, veri göndermek için döngüyü başlatıyoruz. Bu döngünün verileri tekrar tekrar göndermeye devam edeceğini unutmayın.
Biz başlatmak döngü üzerindeki iletişimin başlangıcını ve aramayı başlatmak için, SS pin düşük yazarak bitbangdata bit ve gönderme içine önceden tanımlanmış veri kırar fonksiyonu. Bunu yaptıktan sonra, veri iletiminin sonunu belirtmek için SS pinini HIGH yazıyoruz.
geçersiz döngü () { digitalWrite (SSPin, LOW); // SS düşük slaveData = bitBangData (sendData); // veri iletimi digitalWrite (SSPin, HIGH); // SS tekrar yüksek }
Bitbangdata () fonksiyonu aşağıda yazılmıştır. Fonksiyon, gönderilecek veriyi alır ve bitlere böler ve algoritmanın 7. adımında belirtildiği gibi iletim için kod üzerinden döngü yaparak gönderir.
bayt bitBangData (bayt _send) // Bu işlev, verileri bit değiştirme yoluyla iletir { bayt _receive = 0; for (int i = 0; i <8; i ++) // baytta 8 bit { digitalWrite (MOSIPin, bitRead (_send, i)); // MOSI digitalWrite (SCKPin, HIGH); // SCK yüksek bitWrite (_receive, i, digitalRead (MISOPin)); // MISO digitalWrite (SCKPin, LOW); // SCK düşük } return _receive; // Alınan verileri döndür}
Bit Banging'in dezavantajları
Bununla birlikte, bit becerisini benimsemek, bazı çözümlerde uygulama için güvenilir olmayabilecek biraz çarpmanın birkaç dezavantajı olduğundan iyi düşünülmüş bir karar olmalıdır. Bit vurma, işlem tarafından tüketilen yüksek işlem gücü nedeniyle mikro denetleyici tarafından tüketilen gücü artırır. Özel donanıma kıyasla, özellikle mikro denetleyici tarafından diğer görevlerle aynı anda veri iletişimi gerçekleştirilirken bit çarpması kullanıldığında, aksaklıklar ve titreme gibi daha fazla iletişim hatası meydana gelir. Bit vurma yoluyla iletişim, özel donanım kullanıldığında meydana geldiği hızın çok altında gerçekleşir. Bu, belirli uygulamalarda önemli olabilir ve biraz "çok iyi olmayan" bir seçim yapabilir.
Bit banging, aşağıdakiler dahil her türlü seri iletişim için kullanılır; RS-232, Asenkron Seri İletişim, UART, SPI ve I2C.
Arduino'da Bit becererek UART
Bit vurmanın popüler uygulamalarından biri, Arduino'nun özel donanım UART pinlerini (D0 ve D1) kullanmadan UART üzerinden iletişim kurmasını sağlayan Arduino Yazılım Seri kitaplığıdır. Bu, kullanıcılar Arduino kartındaki pin sayısının destekleyebileceği kadar çok seri cihazı bağlayabildiğinden çok fazla esneklik sağlar.