- Apa itu Bit Banging?
- Kapan menggunakan Bit Banging
- Algoritma untuk Komunikasi Serial melalui Bit Banging
- Sedikit Membenturkan SPI
- Contoh Bit Banging: komunikasi SPI di Arduino
- Kerugian dari Bit Banging
- UART melalui Bit banging di Arduino
Antarmuka Komunikasi adalah salah satu faktor yang dipertimbangkan ketika memilih mikrokontroler yang akan digunakan untuk suatu proyek. Perancang memastikan bahwa mikrokontroler yang dipilih memiliki semua antarmuka yang diperlukan untuk berkomunikasi dengan semua komponen lain yang akan digunakan untuk produk. Adanya beberapa antarmuka ini seperti SPI dan I2C pada mikrokontroler selalu meningkatkan biaya mikrokontroler tersebut, dan tergantung pada anggaran BOM dapat membuat mikrokontroler yang diinginkan tidak terjangkau. Dalam situasi seperti ini, teknik seperti Bit Banging ikut bermain.
Apa itu Bit Banging?
Bit banging adalah teknik untuk komunikasi serial di mana seluruh proses komunikasi ditangani melalui perangkat lunak, bukan perangkat keras khusus. Untuk mengirimkan data, teknik ini melibatkan penggunaan perangkat lunak untuk menyandikan data menjadi sinyal dan pulsa yang digunakan untuk memanipulasi keadaan pin I / O dari mikrokontroler yang berfungsi sebagai pin Tx untuk mengirim data ke perangkat target. Untuk menerima data, teknik ini melibatkan pengambilan sampel keadaan pin Rx setelah interval tertentu yang ditentukan oleh baud rate komunikasi. Perangkat lunak menetapkan semua parameter yang diperlukan untuk mencapai komunikasi ini termasuk sinkronisasi, waktu, level, dll., Yang biasanya ditentukan oleh perangkat keras khusus saat bit banging tidak digunakan.
Kapan menggunakan Bit Banging
Bit-Banging biasanya digunakan dalam situasi di mana mikrokontroler dengan antarmuka yang diperlukan tidak tersedia atau saat beralih ke mikrokontroler dengan antarmuka yang diperlukan mungkin terlalu mahal. Dengan demikian, ini menyediakan cara yang murah untuk memungkinkan perangkat yang sama berkomunikasi menggunakan beberapa protokol. Mikrokontroler yang sebelumnya hanya diaktifkan untuk komunikasi UART, dapat dilengkapi untuk berkomunikasi menggunakan SPI dan 12C melalui bit banging.
Algoritma untuk Komunikasi Serial melalui Bit Banging
Meskipun kode untuk mengimplementasikan bit banging mungkin berbeda di berbagai mikrokontroler dan mungkin juga berbeda untuk protokol serial yang berbeda, tetapi prosedur / algoritme untuk mengimplementasikan bit banging sama di semua platform.
Untuk mengirim data misalnya pseudo-code di bawah ini digunakan;
- Mulailah
- Kirim bit awal
- Tunggu waktu agar sesuai dengan baud rate penerima
- Kirim bit data
- Tunggu durasi agar sesuai dengan baud rate penerima lagi
- Periksa apakah semua bit data telah dikirim. Jika tidak, lanjutkan ke 4. Jika ya, buka 7
- Kirimkan stop bit
- Berhenti
Penerimaan data cenderung sedikit lebih kompleks, biasanya interupsi digunakan untuk menentukan kapan data tersedia di pin penerima. Ini membantu memastikan mikrokontroler tidak membuang terlalu banyak daya pemrosesan. Meskipun implementasi tertentu menggunakan salah satu pin I / O mikrokontroler tetapi kemungkinan kebisingan dan kesalahan, jika mungkin tidak ditangani, lebih tinggi. Algoritme untuk menerima data menggunakan interupsi dijelaskan di bawah ini.
- Mulailah
- Aktifkan interupsi pada pin Rx
- Ketika interupsi dipicu, dapatkan bit start
- Tunggu timing sesuai baud rate
- Baca pin Rx
- Ulangi dari 4 sampai semua data telah diterima
- Tunggu timing sesuai baud rate
- Periksa bit stop
- Berhenti
Sedikit Membenturkan SPI
Seperti disebutkan di atas, bit banging untuk protokol yang berbeda bekerja secara berbeda dan oleh karena itu penting untuk membaca tentang setiap protokol, untuk memahami pembingkaian data dan pencatatan jam kerja sebelum mencoba menerapkannya. Mengambil mode SPI 1 sebagai contoh, nilai dasar jam selalu 0 dan data selalu dikirim atau diterima di tepi naik jam. Diagram waktu untuk protokol komunikasi SPI Mode 1 ditunjukkan di bawah ini.
Untuk mengimplementasikan ini, algoritma berikut dapat digunakan;
- Mulailah
- Setel pin SS rendah untuk memulai komunikasi
- Atur pin untuk Master Out Slave In (MOSI) ke bit pertama dari data yang akan dikirim
- Atur clock pin (SCK) tinggi sehingga data dikirim oleh master dan diterima oleh slave
- Baca status Master di Slave Out (MISO) untuk menerima bit data pertama dari slave
- Setel SCK Rendah, sehingga data dapat dikirim ke tepi naik berikutnya
- Pergi ke 2 sampai semua bit data telah dikirim.
- Setel pin SS Tinggi untuk menghentikan transmisi.
- Berhenti
Contoh Bit Banging: komunikasi SPI di Arduino
Sebagai contoh, mari kita terapkan algoritma untuk komunikasi SPI melalui bit banging di Arduino untuk menunjukkan bagaimana data dapat di-bit-bang melalui SPI menggunakan kode di bawah ini.
Kami mulai dengan mendeklarasikan pin Arduino yang akan digunakan.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; byte sendData = 64; // Nilai yang akan dikirim byte slaveData = 0; // untuk menyimpan nilai yang dikirim oleh budak
Selanjutnya, kita pindah ke fungsi void setup () di mana status pin dideklarasikan. Hanya pin Master in Slave out (MISO) yang dideklarasikan sebagai input karena ini adalah satu-satunya pin yang menerima data. Semua pin lainnya dideklarasikan sebagai keluaran. Setelah mendeklarasikan mode pin, pin SS diatur ke TINGGI. Alasannya adalah untuk memastikan proses bebas dari kesalahan dan komunikasi hanya dimulai ketika disetel ke rendah.
batal penyiapan () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Selanjutnya, kami memulai loop untuk mengirim data. Perhatikan bahwa loop ini akan terus mengirimkan data berulang kali.
Kami memulai loop dengan menulis pin SS rendah, untuk memulai awal komunikasi, dan memanggil fungsi bitbangdata yang memecah data yang telah ditentukan menjadi bit dan mengirim. Setelah ini selesai, kami kemudian menulis pin SS TINGGI untuk menunjukkan akhir dari transmisi data.
void loop () { digitalWrite (SSPin, LOW); // SS rendah slaveData = bitBangData (sendData); // transmisi data digitalWrite (SSPin, HIGH); // SS tinggi lagi }
The bitbangdata () function ditulis di bawah ini. Fungsi ini mengambil data yang akan dikirim dan memecahnya menjadi bit-bit dan mengirimkannya dengan mengulang kode untuk transmisi seperti yang ditunjukkan pada langkah 7 dari algoritma.
byte bitBangData (byte _send) // Fungsi ini mengirimkan data melalui bitbanging { byte _receive = 0; untuk (int i = 0; i <8; i ++) // 8 bit dalam satu byte { digitalWrite (MOSIPin, bitRead (_send, i)); // Setel MOSI digitalWrite (SCKPin, HIGH); // SCK bitWrite tinggi (_receive, i, digitalRead (MISOPin)); // Tangkap MISO digitalWrite (SCKPin, LOW); // SCK low } return _receive; // Kembalikan data yang diterima }
Kerugian dari Bit Banging
Namun, mengadopsi bit banging harus menjadi keputusan yang dipikirkan dengan matang karena ada beberapa kelemahan bit banging yang mungkin membuatnya tidak dapat diandalkan untuk diterapkan dalam solusi tertentu. Bit banging meningkatkan daya yang dikonsumsi oleh mikrokontroler karena tingginya daya pemrosesan yang dikonsumsi oleh proses tersebut. Dibandingkan dengan perangkat keras khusus, lebih banyak kesalahan komunikasi seperti gangguan dan kegugupan terjadi ketika bit banging digunakan terutama ketika komunikasi data dilakukan oleh mikrokontroler pada saat yang sama dengan tugas lainnya. Komunikasi melalui bit banging terjadi pada sebagian kecil dari kecepatan yang terjadi saat perangkat keras khusus digunakan. Ini mungkin penting dalam aplikasi tertentu dan mungkin membuat pilihan yang "tidak terlalu bagus".
Bit banging digunakan untuk semua jenis komunikasi serial termasuk; RS-232, Komunikasi Serial Asinkron, UART, SPI, dan I2C.
UART melalui Bit banging di Arduino
Salah satu implementasi populer dari bit banging adalah pustaka Serial Perangkat Lunak Arduino yang memungkinkan Arduino untuk berkomunikasi melalui UART tanpa menggunakan pin UART perangkat keras khusus (D0 dan D1). Ini memberikan banyak fleksibilitas karena pengguna dapat menghubungkan sebanyak mungkin perangkat serial sebanyak jumlah pin pada papan Arduino dapat mendukung.