- Apa itu Bit Banging?
- Bila hendak menggunakan Bit Banging
- Algoritma untuk Komunikasi Bersiri melalui Bit Banging
- Bit Banging atas SPI
- Contoh Bit Banging: Komunikasi SPI di Arduino
- Kekurangan Bit Banging
- UART melalui Bit banging di Arduino
Interface Komunikasi adalah salah satu faktor yang dipertimbangkan semasa memilih mikrokontroler yang akan digunakan untuk projek. Pereka memastikan bahawa mikrokontroler yang dipilih mempunyai semua antara muka yang diperlukan untuk berkomunikasi dengan semua komponen lain yang akan digunakan untuk produk. Kewujudan beberapa antaramuka seperti SPI dan I2C pada mikrokontroler selalu meningkatkan kos mikrokontroler tersebut, dan bergantung pada anggaran BOM mungkin menjadikan mikrokontroler yang diinginkan tidak terjangkau. Dalam situasi seperti ini, teknik seperti Bit Banging masuk untuk dimainkan.
Apa itu Bit Banging?
Bit banging adalah teknik untuk komunikasi bersiri di mana keseluruhan proses komunikasi dikendalikan melalui perisian dan bukannya perkakasan khusus. Untuk mengirimkan data, teknik ini melibatkan penggunaan perisian untuk menyandikan data ke dalam isyarat dan denyutan yang digunakan untuk memanipulasi keadaan pin I / O mikrokontroler yang berfungsi sebagai pin Tx untuk mengirim data ke perangkat sasaran. Untuk menerima data, teknik ini melibatkan pengambilan sampel keadaan pin Rx setelah selang waktu tertentu yang ditentukan oleh kadar komunikasi baud. Perisian menetapkan semua parameter yang diperlukan untuk mencapai komunikasi ini termasuk penyegerakan, pemasaan, tahap dan lain-lain, yang biasanya diputuskan oleh perkakasan khusus ketika bit banging tidak digunakan.
Bila hendak menggunakan Bit Banging
Bit-Banging biasanya digunakan dalam situasi di mana mikrokontroler dengan antara muka yang diperlukan tidak tersedia atau ketika beralih ke mikrokontroler dengan antara muka yang diperlukan mungkin terlalu mahal. Oleh itu, ia menyediakan cara yang murah untuk membolehkan peranti yang sama berkomunikasi menggunakan beberapa protokol. Pengawal mikro yang sebelumnya hanya diaktifkan untuk komunikasi UART, boleh dilengkapi untuk berkomunikasi menggunakan SPI dan 12C melalui bit banging.
Algoritma untuk Komunikasi Bersiri melalui Bit Banging
Walaupun kod untuk menerapkan bit banging mungkin berbeza di antara mikrokontroler yang berbeza dan mungkin juga berbeza untuk protokol bersiri yang berbeza, tetapi prosedur / algoritma untuk melaksanakan bit banging adalah sama di semua platform.
Untuk menghantar data misalnya, kod pseudo di bawah digunakan;
- Mulakan
- Hantar sedikit permulaan
- Tunggu masa untuk disesuaikan dengan kadar baud penerima
- Hantar bit data
- Tunggu selama tempoh untuk bersesuaian dengan kadar baud penerima lagi
- Periksa sama ada semua bit data telah dihantar. Sekiranya tidak, pergi ke 4. Jika ya, pergi ke 7
- Hantar sedikit berhenti
- Berhenti
Menerima data cenderung sedikit lebih kompleks, biasanya gangguan digunakan untuk menentukan kapan data tersedia pada pin penerima. Ini membantu memastikan mikrokontroler tidak membuang terlalu banyak daya pemprosesan. Walaupun pelaksanaan tertentu menggunakan pin I / O mikrokontroler tetapi kemungkinan kebisingan dan kesalahan, jika tidak mungkin ditangani, lebih tinggi. Algoritma untuk menerima data menggunakan gangguan dijelaskan di bawah.
- Mulakan
- Dayakan gangguan pada pin Rx
- Apabila gangguan dicetuskan, dapatkan bit permulaan
- Tunggu masa mengikut kadar baud
- Baca pin Rx
- Ulangi dari 4 hingga semua data diterima
- Tunggu masa mengikut kadar baud
- Periksa bit berhenti
- Berhenti
Bit Banging atas SPI
Seperti yang disebutkan di atas, biting untuk protokol yang berbeza berfungsi dengan berbeza dan dengan itu penting untuk membaca mengenai setiap protokol, untuk memahami pembingkaian data dan penjadualan sebelum cuba melaksanakannya. Mengambil mod SPI 1 sebagai contoh, nilai asas jam selalu 0 dan data selalu dihantar atau diterima di tepi jam yang meningkat. Rajah masa untuk protokol komunikasi SPI Mode 1 ditunjukkan di bawah.
Untuk melaksanakannya, algoritma berikut dapat digunakan;
- Mulakan
- Tetapkan pin SS rendah untuk memulakan komunikasi
- Tetapkan pin untuk Master Out Slave In (MOSI) ke bit pertama data yang akan dihantar
- Tetapkan pin jam (SCK) tinggi sehingga data dihantar oleh tuan dan diterima oleh hamba
- Baca keadaan Master in Slave Out (MISO) untuk menerima sedikit data pertama dari hamba
- Tetapkan SCK Low, sehingga data dapat dikirimkan di tepi kenaikan berikutnya
- Pergi ke 2 sehingga semua bit data dihantar.
- Tetapkan pin SS Tinggi untuk menghentikan penghantaran.
- Berhenti
Contoh Bit Banging: Komunikasi SPI di Arduino
Sebagai contoh, mari kita laksanakan algoritma untuk komunikasi SPI melalui bit banging di Arduino untuk menunjukkan bagaimana data dapat dipukul sedikit melalui SPI menggunakan kod di bawah.
Kita mulakan dengan menyatakan pin Arduino akan digunakan.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; bait sendData = 64; // Nilai yang akan dihantar byte slaveData = 0; // kerana menyimpan nilai yang dihantar oleh hamba
Seterusnya, kita beralih ke fungsi setup void di mana keadaan pin dinyatakan. Hanya pin Master in Slave out (MISO) yang dinyatakan sebagai input kerana satu-satunya pin yang menerima data. Semua pin lain dinyatakan sebagai output. Setelah menyatakan mod pin, pin SS diatur ke TINGGI. Sebabnya adalah untuk memastikan prosesnya bebas dari ralat dan komunikasi hanya bermula apabila ia ditetapkan ke rendah.
batal persediaan () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, TINGGI); }
Seterusnya, kita memulakan gelung untuk menghantar data. Perhatikan bahawa gelung ini akan terus menghantar data berulang kali.
Kami memulakan gelung dengan menulis pin SS rendah, untuk memulakan permulaan komunikasi, dan memanggil fungsi bitbangdata yang memecah data yang telah ditentukan menjadi bit dan hantar. Dengan ini, kami kemudian menulis pin SS TINGGI untuk menunjukkan akhir penghantaran data.
gelung kosong () { digitalWrite (SSPin, LOW); // SS slaveData rendah = bitBangData (sendData); // penghantaran data digitalWrite (SSPin, TINGGI); // SS tinggi lagi }
The bitbangdata () fungsi ditulis di bawah. Fungsi mengambil data yang akan dikirim dan memecahnya menjadi bit dan mengirimkannya dengan mengulangi kod untuk transmisi seperti yang ditunjukkan pada langkah 7 algoritma.
byte bitBangData (byte _send) // Fungsi ini menghantar data melalui bitbanging { byte _receive = 0; untuk (int i = 0; i <8; i ++) // 8 bit dalam bait { digitalWrite (MOSIPin, bitRead (_send, i)); // Tetapkan MOSI digitalWrite (SCKPin, TINGGI); // SCW bitWrite tinggi (_receive, i, digitalRead (MISOPin)); // Tangkap MISO digitalWrite (SCKPin, RENDAH); // SCK rendah } pulangan _receive; // Kembalikan data yang diterima }
Kekurangan Bit Banging
Mengamalkan bit banging harus menjadi keputusan yang dipikirkan dengan baik kerana terdapat beberapa kelemahan untuk membenturkan bit yang mungkin menjadikannya tidak dapat dipercayai untuk dilaksanakan dalam penyelesaian tertentu. Bit banging meningkatkan daya yang digunakan oleh mikrokontroler kerana daya pemprosesan yang tinggi yang digunakan oleh proses tersebut. Berbanding dengan perkakasan khusus, lebih banyak kesalahan komunikasi seperti gangguan dan kegelisahan berlaku ketika bit banging digunakan terutamanya ketika komunikasi data dilakukan oleh mikrokontroler pada masa yang sama dengan tugas lain. Komunikasi melalui bit banging berlaku pada sebahagian kecil dari kelajuan yang berlaku ketika perkakasan khusus digunakan. Ini mungkin penting dalam aplikasi tertentu dan mungkin membuat pilihan "tidak begitu baik".
Bit banging digunakan untuk semua jenis komunikasi bersiri termasuk; RS-232, Komunikasi Serial Asinkron, UART, SPI, dan I2C.
UART melalui Bit banging di Arduino
Salah satu pelaksanaan bit banging yang popular adalah perpustakaan Serdu Perisian Arduino yang membolehkan Arduino berkomunikasi melalui UART tanpa menggunakan pin UART perkakasan khusus (D0 dan D1). Ini memberi banyak fleksibiliti kerana pengguna dapat menyambungkan seberapa banyak peranti bersiri sebanyak pin yang dapat disokong oleh papan Arduino.