بروتوكول SPI وتطبيق على إستخدامه مع SD card


بروتوكول SPI وإسمه الكامل The Serial Peripheral Interface bus وهو نوع من طرق الإتصالات المتزامنة المتسلسلة وهو مخصص للمسافات القصيرة وتحديدا يمكننا القول بأنه مخصص للتواصل بين الشرائح أو اللوحات الإلكترونية. طورته موتورولا سنة 1980 ويستخدم مثلا الآن في SD card وفي شاشات العرض ذات البلوري. وهو يعتبر من نوع full duplex وهذا النوع يصف بأن جهازين أو لوحتين إلكترونيتين يمكنهما الإتصال مع بعض بشكل مزدوج أي يمكن للأولى أن ترسل للثانية وكذلك يمكن للثانية الإرسال للأولى ولكن ننبه أنه رغم أنه full duplex إلا أن في SPI هناك master device وهناك  slave device.

 
لدى هذا البروتوكول 4 خيوط أساسية أو يتكون ال bus الخاص به من 4 خطوط ذات إشارة رقمية أو Digital signal أو تكون 1 أو  0 ، وهي:
- SCLK: وهي إشارة خاصة بالمزامن أو Clock وهذه الإشارة ينتجها الMaster.
- MOSI: وهي إشارة البيانات التي ينتجها ال Master نحو ال salve.
- MISO: وهي إشارة البيانات التي ينتجها ال salve ، نحو ال Master.
- SS: وهي إشارة لتفعيل ال salve وفي الحالة العادية تكون 1 وحينما نريد تفعيل الإتصال مع salve نجعلها 0. 

ويمكن للصورة التالية أن تساعدك على فهم كيف تعمل الخطوط 3، حيث أنك تلاحظ أنه حينما تصبح إشارة Slave ب 0 يتفعل المزامن Clock ويقوم الماستر بإستقبال بيانات عبر ال MOSI ويقوم الماستر بإرسال بيانات نحو slave عبر MISO.

وربما هناك من هو ليس ملم كثيرا بالإلكترونيك لذلك عليك توضيح عمل ال Clock تحديدا، فعمله هو تنظيم الإتصال بين ال Master و Salve، وذلك أن ال Master لن يستطيع إرسال بيانات جديدة إلا في حالة كان ال Clock في وضع 1 وكذلك بالنسبة لل salve، وحينما تشاهد المنحنيات البيانية السابقة ستلاحظ بأن ال MISO و MOSI قد إنطلقا في نقل البيانات في لحظة إنطلاق أو في اللحظة الأولى حينما أصبح Clock في الوضع 1.

ولأنه ليس هناك إتفاقية واضحة في هذا البروتوكول فكل قطعة كيف جعلت أول bit و آخر bit في الرسالة المرسلة. لذلك كل قطعة إلكترونية ستجد لها مفهوما مختلفا في كيفية تركيب الرسالة. 

بالنسبة لشرح طريقة العمل الفيزيائية، فإن الجهاز أو القطعة التي هي Master تقوم بإرسال ال bit عبر مدخل/بورت MOSI وتستقبل عبر مدخل/بورت MISO، والبيتات المستقبلة يتم تخزينها في register يسمى ب the SPI data register. هذا register يحمل 8 بت (8 bits)، حيث أنه حينما يرسل ال Master البت ذا درجة 7 يقوم ال slave بإرسال البت ذا درجة 0 ويتم هذا حتى نهاية البيتات 8 ويتم تركيب كل هذا كما في الصورة التالية:

حيث نفترض بأن SP0DR هو الريجيستر الذي نتحدث عنه، ففي الجهاز Master هناك ريجيستر من هذا النوع وفي Salve هناك ريجيستر أيضا من نفس النوع، وحينما ينقل البت 7 من Master إلى Salve فإنه يوضع في الدرجة 0، وفي المرحلة التالية حينما يرسل البت 6 من Master إلى Salve فالبت السابق الذي وضع في الدرجة 0 يتحرك إلى الدرجة 1 ويأتتي البت 6 في الدرجة 0 وفي نفس الوقت يقوم ال Salve بتحريك البيتات في الريجيستري ال Master. ويمكن تلخيص كل هذا بهذا الرسم (لقد أخذ مني وقتا طويلا للرسم ) حيث أنني قمت بتمثيل الregister الخاص بالماستر والآخر الخاص ب salve وذلك بأن وضعت البيتات الخاصة ب salve باللون الأخضر وبالبيتات الخاصة ب master باللون الأخضر وفي كل لحظة لاحظ حركة البيتات:


ولدى ال SPI ريجيستر آخر ويسمى ريجيستري التعديلات، أو ريجيستر التحكم، حيث من خلال هذا الريجيستر تستطيع تحديد سرعة نقل البيانات وغيرها من الخصائص ولكل قطعة أو لكل لوحة إلكترونية تمتلك بروتوكول SPI طريقة معينة للتعديل وتجد هذا في Datasheet الخاص بها، حيث توضح لك طريقة برمجة ال SPI  وماهي إستطاعته وغيرها من المعلومات.

ومن أمثلة خصائص ال SPI التي يتم تعديلها عبر ريجيستر التحكم. الأنماط الزمنية ل SPI حيث تعرفك على ماهي اللحظة في Clock التي تعتبر هي اللحظة التي يتفعل فيها إرسال البيانات، فهناك مثلا من يرسل في أول لحظة لدخول Clock وهناك من يرسل حينما يكون ال clock في الوضع 1 وهناك من يرسل في نهاية الpulse الخاصة بالclock ويمكنك ملاحظة الفرق هنا: 


وأيضا في حالة لديك مجموعة كبيرة من salve فإنك تقوم بربطهم بهذه الطريقة:


بالنسبة للأشخاص المهتمين بسرعة نقل البيانات، ففي العموم وفي العالم التطبيقي ليس هناك نقل يفوق 10 Mhz/s أو 8، ولكن يمكن أن تجد أجهزة تفوق ذلك وأفضل شيء يمكن القيام به في هذه الحالة هو الإطلاع على Datasheet الخاص بالقطعة فهو بالضبط من يحدد لك سرعة نقل البيانات وكيف تقوم بضبطها.

إلى هنا يمكن أن نقول أننا فهمنا نظريا ماهو هذا البروتوكول وماهي أساسيته أو مبادئه، وأريد أن نخطوا خطوة للامام في فهم إحدى تطبيقاته في مجال الذاكرات أو بطاقات الذاكرة SD card، وبطاقات الذاكرة هي ذاكرة نظامية (نظامية او standard أي إتفقت عدة شركات عليها) للأجهزة المحمولة. تحتوي هذه البطاقات من الداخل على سلسلة من ذاكرة فلاش flash memory array و ميكروكنترول ( ميكروكنترول + PCB + ذاكرة مبنية بإستخدام NAND):
وللتوسع أكثر نلاحظ هذا diagram الخاص ب SD card: 



حيث نلاحظ أنها تتكون من 9 أطراف (9 pins ) ومن متحكم وواجهة ذاكرة وذاكرة. وحيث أن الأطراف 9 مهمتهم هو تبادل البيانات بين النظام ومتحكم البطاقة card controller، والمتحكم يستطيع كتابة أو قراءة البيانات من وإلى الذاكرة (memory core ) بإستخدام واجهة الذاكرة (memory core interface). ومن جهة أخرى الرجيسترات الداخلية تعطينا فكرة عن حالة البطاقة.

وبالرغم من أنه من الصعب إيجاد سبيل لفهم الطريقة لأن أغلب ماهو موجود الآن على الإنترنات يشبوه التبسيط الكبير وهو المشكل الذي يعاني منه المحتوى الذي على الإنترنات وخاصة المحتوى العلمي والتقني، فمثلا لفهم كيف تعمل ال SD card مع بروتوكول SPI نحتاج لخوارزمية لذلك ولكن كيما نجد بأنه لا توجد خورزميات واضحة، بل هناك فقط مكتبات تستخدمها للوصول لإستخدام SPI وهذه المكتبات تحتاج لتحليلها لفهم الأمر ولم يضع مطورها الخوارزمية التي إعتمدها وهنا حصلت المشكلة الحقيقية.


وجدت مثلا أنه للتواصل مع SD card يتم إستخدام ألوغوريتم/خوارزمية مثل هذه:

إضغط على المخطط لتكبيره

 وسأقوم بشرح جزء من هذا الديقرام أو الألغوريتم وذلك بسبب أنه كبير جدا وإذا شرحته سيأخذ وقت كبيرا جدا، سننطلق من Start وهي عبارة فقط لا تعني شيئا وتعني فقط باننا سنبدأ العمل (هههه) وأولا سنرسل الطاقة الكهربائية للكارت أو نغذي الكارت ب 2.7 أو 3.6 فولت وننتظر أقل من 1 ميلي ثانية ثم نضع CS و DI  في الوضع high يعني في البت 1 ثم ننتظر حوالي 74 دورة لل clock ، ثم نرسل الكود CMD0 الذي هو حسب هذا الألغوريتم 0x0000000 بالرغم من أنني وجدت في مصدر آخر بأنه:
01 000000 00000000 00000000 00000000 00000000 1001010
وربما هناك سبب يتعلق بالداتاشيت أو خواص مختلفة ولكن لنكمل فقط، بعد ذلك سننتظر الرد والذي تم تسميته ب R1 resp فإذا جاء الكود وحصل أن وجدنا خطئا من خلال الكود CRC أو لم يأتي شيئا فهنا لم يتم التعرف على البطاقة وستلغى الطاقة الكهربائية المتجهة إليها ونحصل على Failed أي فشل، ولكن إذا حصلنا على رد بإشارة أو كود 0x01 فهنا سننتقل لمرحلة أخرى وهي أننا نرسل كود آخر إسمه CMD8 وهو كما يلي: 0x000001AA ونتأكد الآن من شيء آخر لم أفهمه حقيقة في هذا الديقرام، ونكمل في الإرسال والتحقق حتى ننهي إلى النجاح.

وفي هذا المقال كنت أريد أن أضع جزءا تطبيقيا دقيقا حول ال SPI مع SD card ولكن لم أجد توضيحا كبيرا حول ذلك ولكنني سأعمل في البحث عن هذا في الكتب لعلي أجد خوارزمية واضحة للشرح أكثر من الخوارزمية السابقة. وأعيد بأنني لا أريد خوارزمية سطحية بل أريد خوارزمية عميقة بحيث أرى فيها كيف يتم تفعيل البطاقة عبر إرسال بيتات معينة وغيرها. لذلك قد تكون هذه الإصدارة الأولى لهذا المقال وسأحدثه في حالة توفر معلومات أكثر، لأنني لم أرد ألا أنشره في وقته فقد بقيت معه يوما كاملا من البحث عن خوارزمية ولم أجد واحدة ترضيني فكريا.

ولقد وجعت هذا الملف من منظمة SD وهو يحتوي على الألوغريتمات للتعامل مع بطاقات SD ولذلك عليك تخصيص وقت لقراءته فهو في عدة إصدارات ومن ثم سأقوم بتحديث المقال بالجزء الجديد الخاص بالتعامل بين SPI و SD card:


ملاحظة مهمة: أي شخص قرأ هذا المقال ولديه خوارزمية واضحة لكيفية عمل ال SD card يتواصل معي عبر الفورم بجانب هذا المقال عبر وضع الإسم والبريد الإلكتروني والموضوع ومن ثم الضغط على إرسال. وسأرى الخوارزمية المرسلة وأحدث المقال بها.

المراجع والمصادر:

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel