- ما هو Bit Banging؟
- متى تستخدم Bit Banging
- خوارزمية للاتصال التسلسلي عبر Bit Banging
- قليلا ضجيجا على SPI
- مثال على Bit Banging: اتصال SPI في Arduino
- مساوئ Bit Banging
- UART عبر Bit banging في Arduino
تعد واجهات الاتصال أحد العوامل التي يتم أخذها في الاعتبار عند اختيار وحدة تحكم دقيقة لاستخدامها في المشروع. يضمن المصمم أن المتحكم الدقيق الذي يتم اختياره يحتوي على جميع الواجهات المطلوبة للتواصل مع جميع المكونات الأخرى التي سيتم استخدامها للمنتج. إن وجود بعض هذه الواجهات مثل SPI و I2C على متحكم دقيق يزيد دائمًا من تكلفة هذه الميكروكونترولر ، واعتمادًا على ميزانية BOM ، قد يجعل المتحكم الدقيق المطلوب غير مقبول. في مثل هذه المواقف ، تأتي تقنيات مثل Bit Banging للعب.
ما هو Bit Banging؟
Bit banging هو أسلوب للاتصال التسلسلي يتم فيه التعامل مع عملية الاتصال بأكملها عبر البرامج بدلاً من الأجهزة المخصصة. لنقل البيانات ، تتضمن التقنية استخدام برنامج لتشفير البيانات إلى إشارات ونبضات تُستخدم لمعالجة حالة دبوس الإدخال / الإخراج الخاص بالمتحكم الدقيق الذي يعمل بمثابة دبوس Tx لإرسال البيانات إلى الجهاز المستهدف. لتلقي البيانات ، تتضمن التقنية أخذ عينات من حالة دبوس Rx بعد فترات زمنية معينة يتم تحديدها بواسطة معدل البث بالباود. يقوم البرنامج بتعيين جميع المعلمات اللازمة لتحقيق هذا الاتصال بما في ذلك المزامنة والتوقيت والمستويات وما إلى ذلك ، والتي يتم تحديدها عادةً بواسطة أجهزة مخصصة عند عدم استخدام ضرب البت.
متى تستخدم Bit Banging
عادةً ما يتم استخدام Bit-Banging في المواقف التي لا يتوفر فيها متحكم دقيق مع الواجهة المطلوبة أو عندما يكون التبديل إلى وحدة تحكم دقيقة مع الواجهة المطلوبة باهظ التكلفة. وبالتالي فهو يوفر طريقة رخيصة لتمكين نفس الجهاز من الاتصال باستخدام عدة بروتوكولات. يمكن تجهيز المتحكم الدقيق الذي تم تمكينه مسبقًا لاتصالات UART فقط ، للتواصل باستخدام SPI و 12 C عبر ضرب البت.
خوارزمية للاتصال التسلسلي عبر Bit Banging
في حين أن الكود الخاص بتنفيذ ضرب البتات قد يختلف عبر وحدات تحكم دقيقة متنوعة وقد يختلف أيضًا باختلاف البروتوكولات التسلسلية ، إلا أن الإجراء / الخوارزمية الخاصة بتنفيذ ضرب البتات هو نفسه عبر جميع الأنظمة الأساسية.
لإرسال البيانات على سبيل المثال ، يتم استخدام الرمز الزائف أدناه ؛
- بداية
- إرسال بت البداية
- انتظر حتى يتوافق التوقيت مع معدل الباود الخاص بجهاز الاستقبال
- إرسال البيانات بت
- انتظر حتى تتوافق المدة مع معدل البث بالباود لجهاز الاستقبال مرة أخرى
- تحقق مما إذا تم إرسال جميع بتات البيانات. إذا كانت الإجابة "لا" ، انتقل إلى 4. إذا كانت الإجابة بنعم ، انتقل إلى 7
- إرسال بت التوقف
- قف
يميل تلقي البيانات إلى أن يكون أكثر تعقيدًا بعض الشيء ، وعادة ما يتم استخدام مقاطعة لتحديد وقت توفر البيانات على دبوس جهاز الاستقبال. يساعد هذا في ضمان ألا يهدر الميكروكونترولر الكثير من طاقة المعالجة. على الرغم من أن بعض التطبيقات تستخدم أيًا من دبابيس الإدخال / الإخراج الخاصة بوحدات التحكم الدقيقة ، إلا أن فرص الضوضاء والأخطاء ، إذا لم يتم التعامل معها على الأرجح ، تكون أعلى. تم شرح خوارزمية تلقي البيانات باستخدام المقاطعات أدناه.
- بداية
- تمكين المقاطعة على Rx pin
- عندما يتم تشغيل المقاطعة ، احصل على بت البداية
- انتظر التوقيت وفقًا لمعدل الباود
- اقرأ دبوس Rx
- كرر من 4 حتى يتم استلام جميع البيانات
- انتظر التوقيت وفقًا لمعدل الباود
- تحقق من توقف بت
- قف
قليلا ضجيجا على SPI
كما ذكرنا سابقًا ، تعمل تقنية bit banging لبروتوكولات مختلفة بشكل مختلف ، ومن ثم فمن المهم أن تقرأ عن كل بروتوكول لفهم تأطير البيانات وتسجيل الوقت قبل محاولة التنفيذ. بأخذ وضع SPI 1 كمثال ، تكون القيمة الأساسية للساعة دائمًا 0 ويتم دائمًا إرسال البيانات أو استقبالها على الحافة الصاعدة للساعة. يظهر أدناه مخطط التوقيت لبروتوكول الاتصال SPI Mode 1.
لتنفيذ ذلك ، يمكن استخدام الخوارزمية التالية ؛
- بداية
- اضبط دبوس SS منخفضًا لبدء الاتصال
- اضبط دبوس Master Out Slave In (MOSI) على أول بت من البيانات التي سيتم إرسالها
- قم بتعيين دبوس الساعة (SCK) عاليًا بحيث يتم إرسال البيانات بواسطة السيد واستقبالها بواسطة التابع
- اقرأ حالة Master in Slave Out (MISO) لتلقي أول جزء من البيانات من التابع
- قم بتعيين SCK منخفض ، بحيث يمكن إرسال البيانات إلى الحافة الصاعدة التالية
- انتقل إلى 2 حتى يتم إرسال جميع بتات البيانات.
- اضبط SS pin High لإيقاف الإرسال.
- قف
مثال على Bit Banging: اتصال SPI في Arduino
على سبيل المثال ، دعنا ننفذ خوارزمية اتصال SPI عبر bit banging في Arduino لإظهار كيف يمكن ربط البيانات عبر SPI باستخدام الكود أدناه.
نبدأ بالإعلان عن استخدام دبابيس Arduino.
const int SSPin = 11 ؛ const int SCKPin = 10 ؛ const int MISOPin = 9 ؛ const int MOSIPin = 8 ؛ بايت sendData = 64 ؛ // القيمة المراد إرسالها بايت slaveData = 0 ؛ // لتخزين القيمة التي يرسلها العبد
بعد ذلك ، ننتقل إلى وظيفة الإعداد الفارغ () حيث يتم الإعلان عن حالة الدبابيس. يتم التصريح عن دبوس Master in Slave out (MISO) فقط كمدخل لأنه الدبوس الوحيد الذي يتلقى البيانات. يتم الإعلان عن جميع المسامير الأخرى كناتج. بعد الإعلان عن أوضاع الدبوس ، يتم ضبط دبوس SS على HIGH. والسبب في ذلك هو التأكد من أن العملية خالية من الأخطاء وأن الاتصال يبدأ فقط عند ضبطه على مستوى منخفض.
إعداد باطل () { pinMode (MISOPin ، INPUT) ؛ pinMode (SSPin ، الإخراج) ؛ pinMode (SCKPin ، الإخراج) ؛ pinMode (MOSIPin ، الإخراج) ؛ الكتابة الرقمية (SSPin ، عالية) ؛ }
بعد ذلك ، نبدأ الحلقة لإرسال البيانات. لاحظ أن هذه الحلقة ستستمر في إرسال البيانات بشكل متكرر.
نبدأ الحلقة بكتابة SS pin منخفض ، لبدء بداية الاتصال ، واستدعاء وظيفة bitbangdata التي تقسم البيانات المحددة مسبقًا إلى بتات وإرسالها. بعد ذلك ، نكتب SS pin HIGH للإشارة إلى نهاية نقل البيانات.
حلقة باطلة () { digitalWrite (SSPin، LOW) ؛ // SS low slaveData = bitBangData (sendData) ؛ // نقل البيانات digitalWrite (SSPin ، عالية) ؛ // ارتفاع SS مرة أخرى }
تمت كتابة دالة bitbangdata () أدناه. تأخذ الوظيفة البيانات المراد إرسالها وتقسيمها إلى بتات وترسلها عن طريق التكرار فوق رمز الإرسال كما هو موضح في الخطوة 7 من الخوارزمية.
بايت bitBangData (بايت _send) // هذه الوظيفة تنقل البيانات عبر bitbanging { byte _receive = 0 ؛ لـ (int i = 0 ؛ i <8 ؛ i ++) // 8 بت في بايت { digitalWrite (MOSIPin ، bitRead (_send ، i)) ؛ // Set MOSI digitalWrite (SCKPin، HIGH) ؛ // SCK high bitWrite (_receive، i، digitalRead (MISOPin)) ؛ // Capture MISO digitalWrite (SCKPin ، LOW) ؛ // SCK low } return _receive ؛ // إرجاع البيانات المستلمة }
مساوئ Bit Banging
ومع ذلك ، يجب أن يكون اعتماد ضرب البت قرارًا مدروسًا جيدًا نظرًا لوجود العديد من الجوانب السلبية لقرع البتات التي قد تجعلها غير موثوقة للتنفيذ في حلول معينة. يؤدي ضرب البتات إلى زيادة الطاقة التي يستهلكها الميكروكونترولر بسبب قوة المعالجة العالية التي تستهلكها العملية. مقارنة بالأجهزة المخصصة ، تحدث المزيد من أخطاء الاتصال مثل مواطن الخلل والتوتر عند استخدام ضرب البتات خاصةً عندما يتم إجراء اتصال البيانات بواسطة المتحكم الدقيق في نفس الوقت مثل المهام الأخرى. يحدث الاتصال عبر ضرب البتات بجزء بسيط من السرعة التي يحدث بها عند استخدام أجهزة مخصصة. قد يكون هذا مهمًا في بعض التطبيقات وقد يجعل بعض الشيء خيارًا "ليس جيدًا".
يستخدم Bit banging لجميع أنواع الاتصالات التسلسلية بما في ذلك ؛ RS-232 ، والاتصال التسلسلي غير المتزامن ، و UART ، و SPI ، و I2C.
UART عبر Bit banging في Arduino
إحدى التطبيقات الشائعة لقرع البتات هي مكتبة Arduino Software Serial التي تمكن Arduino من التواصل عبر UART دون استخدام دبابيس UART المخصصة للأجهزة (D0 و D1). يوفر هذا قدرًا كبيرًا من المرونة حيث يمكن للمستخدمين توصيل العديد من الأجهزة التسلسلية التي يمكن أن يدعمها عدد المسامير الموجودة على لوحة Arduino.