- Bit Banging คืออะไร?
- เมื่อใดควรใช้ Bit Banging
- อัลกอริทึมสำหรับการสื่อสารแบบอนุกรมผ่าน Bit Banging
- บิตการต่อสู้มากกว่า SPI
- ตัวอย่าง Bit Banging: การสื่อสาร SPI ใน Arduino
- ข้อเสียของ Bit Banging
- UART ผ่าน Bit banging ใน Arduino
อินเทอร์เฟซการสื่อสารเป็นปัจจัยหนึ่งที่ได้รับการพิจารณาเมื่อเลือกไมโครคอนโทรลเลอร์ที่จะใช้สำหรับโครงการ ผู้ออกแบบตรวจสอบให้แน่ใจว่าไมโครคอนโทรลเลอร์ที่เลือกมีอินเทอร์เฟซทั้งหมดที่จำเป็นในการสื่อสารกับส่วนประกอบอื่น ๆ ทั้งหมดที่จะใช้สำหรับผลิตภัณฑ์ การมีอยู่ของอินเทอร์เฟซเหล่านี้บางส่วนเช่น SPI และ I2C บนไมโครคอนโทรลเลอร์ทำให้ต้นทุนของไมโครคอนโทรลเลอร์ดังกล่าวเพิ่มขึ้นอย่างสม่ำเสมอและขึ้นอยู่กับงบประมาณของ BOM อาจทำให้ไมโครคอนโทรลเลอร์ที่ต้องการมีราคาไม่แพง ในสถานการณ์เช่นนี้เทคนิคเช่นBit Bangingเข้ามาเล่น
Bit Banging คืออะไร?
การกัดบิตเป็นเทคนิคสำหรับการสื่อสารแบบอนุกรมซึ่งกระบวนการสื่อสารทั้งหมดได้รับการจัดการผ่านซอฟต์แวร์แทนที่จะใช้ฮาร์ดแวร์เฉพาะ ในการส่งข้อมูลเทคนิคนี้เกี่ยวข้องกับการใช้ซอฟต์แวร์เพื่อเข้ารหัสข้อมูลเป็นสัญญาณและพัลส์ซึ่งใช้ในการจัดการสถานะของพิน I / O ของไมโครคอนโทรลเลอร์ซึ่งทำหน้าที่เป็นพิน Tx เพื่อส่งข้อมูลไปยังอุปกรณ์เป้าหมาย ในการรับข้อมูลเทคนิคนี้เกี่ยวข้องกับการสุ่มตัวอย่างสถานะของพิน Rx หลังจากช่วงเวลาหนึ่งซึ่งกำหนดโดยอัตราการส่งข้อมูลการสื่อสาร ซอฟต์แวร์จะตั้งค่าพารามิเตอร์ทั้งหมดที่จำเป็นเพื่อให้เกิดการสื่อสารนี้รวมถึงการซิงโครไนซ์เวลาระดับ ฯลฯ ซึ่งโดยปกติจะตัดสินใจโดยฮาร์ดแวร์เฉพาะเมื่อไม่ได้ใช้การกระแทก
เมื่อใดควรใช้ Bit Banging
Bit-Banging มักจะใช้ในสถานการณ์ที่ไม่สามารถใช้งานไมโครคอนโทรลเลอร์ที่มีอินเทอร์เฟซที่ต้องการได้หรือเมื่อเปลี่ยนไปใช้ไมโครคอนโทรลเลอร์ที่มีอินเทอร์เฟซที่ต้องการอาจมีราคาแพงเกินไป ดังนั้นจึงเป็นวิธีที่ถูกในการทำให้อุปกรณ์เดียวกันสามารถสื่อสารโดยใช้โปรโตคอลต่างๆได้ ไมโครคอนโทรลเลอร์ซึ่งก่อนหน้านี้เปิดใช้งานสำหรับการสื่อสาร UART เท่านั้นสามารถติดตั้งเพื่อสื่อสารโดยใช้ SPI และ 12C ผ่านการกัดบิต
อัลกอริทึมสำหรับการสื่อสารแบบอนุกรมผ่าน Bit Banging
แม้ว่าโค้ดในการใช้ bit banging อาจแตกต่างกันไปตามไมโครคอนโทรลเลอร์ที่หลากหลายและอาจแตกต่างกันไปตามโปรโตคอลแบบอนุกรมที่แตกต่างกัน แต่ขั้นตอน / อัลกอริทึมสำหรับการใช้ bit banging นั้นเหมือนกันในทุกแพลตฟอร์ม
ในการส่งข้อมูลเช่นใช้รหัสหลอกด้านล่าง
- เริ่ม
- ส่งบิตเริ่มต้น
- รอจังหวะให้สอดคล้องกับอัตราการรับส่งข้อมูลของผู้รับ
- ส่งบิตข้อมูล
- รอให้ระยะเวลาสอดคล้องกับอัตราการรับส่งข้อมูลของผู้รับอีกครั้ง
- ตรวจสอบว่ามีการส่งบิตข้อมูลทั้งหมดหรือไม่ ถ้าไม่ไปที่ 4 ถ้าใช่ไปที่ 7
- ส่งบิตหยุด
- หยุด
การรับข้อมูลมีแนวโน้มที่จะซับซ้อนกว่าเล็กน้อยโดยปกติจะใช้อินเทอร์รัปต์เพื่อกำหนดเวลาที่ข้อมูลพร้อมใช้งานบนพินรับ สิ่งนี้ช่วยให้แน่ใจว่าไมโครคอนโทรลเลอร์จะไม่สิ้นเปลืองพลังงานในการประมวลผลมากเกินไป แม้ว่าการใช้งานบางอย่างจะใช้พิน I / O ของไมโครคอนโทรลเลอร์ แต่โอกาสที่จะเกิดเสียงรบกวนและข้อผิดพลาดหากไม่ได้รับการจัดการจะสูงกว่า อัลกอริทึมในการรับข้อมูลโดยใช้การขัดจังหวะมีคำอธิบายด้านล่าง
- เริ่ม
- เปิดใช้งานการขัดจังหวะบนพิน Rx
- เมื่อการขัดจังหวะถูกทริกเกอร์รับบิตเริ่มต้น
- รอจังหวะตามอัตราการส่งข้อมูล
- อ่านพิน Rx
- ทำซ้ำตั้งแต่ 4 จนกว่าจะได้รับข้อมูลทั้งหมด
- รอจังหวะตามอัตราการส่งข้อมูล
- ตรวจสอบบิตหยุด
- หยุด
บิตการต่อสู้มากกว่า SPI
ดังที่ได้กล่าวไว้ข้างต้นการโจมตีบิตสำหรับโปรโตคอลที่แตกต่างกันจะทำงานแตกต่างกันดังนั้นจึงเป็นเรื่องสำคัญที่จะต้องอ่านเกี่ยวกับแต่ละโปรโตคอลเพื่อทำความเข้าใจการจัดเฟรมข้อมูลและการตอกบัตรก่อนที่จะพยายามใช้ การใช้โหมด SPI 1 เป็นตัวอย่างค่าฐานของนาฬิกาจะเป็น 0 เสมอและข้อมูลจะถูกส่งหรือรับเสมอตามขอบนาฬิกาที่สูงขึ้น แผนภาพเวลาสำหรับโปรโตคอลการสื่อสาร SPI Mode 1 แสดงอยู่ด้านล่าง
ในการดำเนินการนี้สามารถใช้อัลกอริทึมต่อไปนี้
- เริ่ม
- ตั้งค่าพิน SS ต่ำเพื่อเริ่มการสื่อสาร
- ตั้งค่าพินสำหรับ Master Out Slave In (MOSI) เป็นบิตแรกของข้อมูลที่จะส่ง
- ตั้งเข็มนาฬิกา (SCK) ให้สูงเพื่อให้ข้อมูลถูกส่งโดยต้นแบบและทาสรับ
- อ่านสถานะของ Master ใน Slave Out (MISO) เพื่อรับข้อมูลบิตแรกจากทาส
- ตั้งค่า SCK ต่ำเพื่อให้สามารถส่งข้อมูลไปยังขอบที่เพิ่มขึ้นถัดไป
- ไปที่ 2 จนกว่าบิตข้อมูลทั้งหมดจะถูกส่ง
- ตั้ง SS pin High เพื่อหยุดการส่งข้อมูล
- หยุด
ตัวอย่าง Bit Banging: การสื่อสาร SPI ใน Arduino
ตัวอย่างเช่นเรามาใช้อัลกอริทึมสำหรับการสื่อสาร SPI ผ่านการกัดบิตใน Arduinoเพื่อแสดงว่าข้อมูลสามารถกระแทกบิตผ่าน SPI ได้อย่างไรโดยใช้โค้ดด้านล่าง
เราเริ่มต้นด้วยการประกาศพินของ Arduinoที่จะใช้
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; ไบต์ sendData = 64; // ค่าที่จะส่ง byte slaveData = 0; // สำหรับเก็บค่าที่ทาสส่ง
ต่อไปเราจะย้ายไปที่ฟังก์ชัน void setup () ที่มีการประกาศสถานะของพิน เฉพาะพิน Master in Slave out (MISO) เท่านั้นที่ถูกประกาศว่าเป็นอินพุตเนื่องจากเป็นพินเดียวที่รับข้อมูล พินอื่น ๆ ทั้งหมดถูกประกาศเป็นเอาต์พุต หลังจากประกาศโหมดพินแล้วพิน SS จะถูกตั้งค่าเป็น HIGH เหตุผลนี้คือเพื่อให้แน่ใจว่ากระบวนการไม่มีข้อผิดพลาดและการสื่อสารจะเริ่มต้นเมื่อตั้งค่าเป็นต่ำเท่านั้น
การตั้งค่าเป็นโมฆะ () { pinMode (MISOPin, INPUT); pinMode (SSPin, เอาท์พุท); pinMode (SCKPin, เอาท์พุท); pinMode (MOSIPin, เอาท์พุท); digitalWrite (SSPin, สูง); }
ถัดไปเราเริ่มต้น ห่วง ในการส่งข้อมูลโปรดทราบว่าลูปนี้จะส่งข้อมูลซ้ำไปเรื่อย ๆ
เราเริ่ม ลูป ด้วยการเขียนพิน SS ต่ำเพื่อเริ่มต้นการสื่อสารและเรียกใช้ฟังก์ชัน bitbangdata ซึ่งแบ่งข้อมูลที่กำหนดไว้ล่วงหน้าเป็นบิตและส่ง เมื่อเสร็จแล้วเราจึงเขียน SS พิน HIGH เพื่อระบุการสิ้นสุดการส่งข้อมูล
โมฆะ loop () { digitalWrite (SSPin, LOW); // SS ต่ำ slaveData = bitBangData (sendData); // การส่งข้อมูล digitalWrite (SSPin, HIGH); // SS สูงอีกแล้ว }
bitbangdata () ฟังก์ชั่นที่เขียนด้านล่าง ฟังก์ชั่นนี้รับข้อมูลที่จะส่งและแยกย่อยออกเป็นบิตและส่งต่อโดยการวนซ้ำโค้ดสำหรับการส่งข้อมูลตามที่ระบุไว้ในขั้นตอนที่ 7 ของอัลกอริทึม
byte bitBangData (byte _send) // ฟังก์ชันนี้ส่งข้อมูลผ่าน bitbanging { byte _receive = 0; สำหรับ (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 low } ส่งคืน _receive; // ส่งคืนข้อมูลที่ได้รับ }
ข้อเสียของ Bit Banging
อย่างไรก็ตามการใช้การต่อสู้เล็กน้อยควรเป็นการตัดสินใจที่ดีเนื่องจากมีข้อเสียหลายประการในการต่อสู้เล็กน้อยที่อาจทำให้ไม่น่าเชื่อถือสำหรับการนำไปใช้ในโซลูชันบางอย่าง การกระแทกบิตช่วยเพิ่มพลังงานที่ไมโครคอนโทรลเลอร์ใช้เนื่องจากกำลังประมวลผลสูงที่ใช้โดยกระบวนการ เมื่อเทียบกับฮาร์ดแวร์เฉพาะแล้วข้อผิดพลาดในการสื่อสารที่มากขึ้นเช่นความผิดพลาดและความกระวนกระวายใจจะเกิดขึ้นเมื่อมีการใช้บิตกระแทกโดยเฉพาะอย่างยิ่งเมื่อไมโครคอนโทรลเลอร์ดำเนินการสื่อสารข้อมูลในเวลาเดียวกันกับงานอื่น การสื่อสารด้วยการกัดบิตเกิดขึ้นด้วยความเร็วเพียงเศษเสี้ยวซึ่งเกิดขึ้นเมื่อใช้ฮาร์ดแวร์เฉพาะ สิ่งนี้อาจมีความสำคัญในบางแอปพลิเคชันและอาจทำให้การต่อสู้เป็นทางเลือกที่“ ไม่ดีนัก”
การกัดบิตใช้สำหรับการสื่อสารแบบอนุกรมทุกประเภทรวมถึง RS-232, การสื่อสารแบบอนุกรมอะซิงโครนัส, UART, SPI และ I2C
UART ผ่าน Bit banging ใน Arduino
หนึ่งในการใช้งานที่ได้รับความนิยมในการใช้งาน bit bang คือ Arduino Software Serial library ซึ่งทำให้ Arduino สามารถสื่อสารผ่าน UART ได้โดยไม่ต้องใช้หมุด UART ของฮาร์ดแวร์เฉพาะ (D0 และ D1) สิ่งนี้ให้ความยืดหยุ่นอย่างมากเนื่องจากผู้ใช้สามารถเชื่อมต่ออุปกรณ์อนุกรมได้มากเท่าที่จำนวนพินบนบอร์ด Arduino สามารถรองรับได้