سؤال

أنا أستخدم أ microsd. بطاقة في تصميم مضمن. تتصل البطاقة بمركض متحكم باستخدام واجهة SPI. لقد عملت بشكل جيد لجميع البطاقات التي استخدمتها من قبل، ولكن الآن لن تتم تهيئة بطاقتي الجديدة. البطاقة هي بطاقة microSD 2 جيجابايت 2 جيجابايت (TS2GUSD).

بعد إرسال قطار الساعة الأولي للتبديل إلى وضع SPI، أقوم بما يلي:

  1. CMD0 (حجة 0، CRC 0x95) -> الاستجابة 0x01 -> موافق

  2. CMD8 (حجة 0x000001AA، CRC 0x87) -> استجابة 0x01 0x000001AA -> تعني أنها بطاقة SDC V2 +، مجموعة الجهد 2.7 فولت - 3.6 V مدعومة -> موافق

ثم يجب أن أرسل الأمر ACMD41، ولكن عند إرسال CMD55 (وسيطة 0، CRC 0) يجب أن يسبق CMD41، أحصل على استجابة 0x05 -> أمر غير قانوني. لقد حاولت أيضا إرسال CMD1 (بطاقات MMC)، لكنها تعطي مماثلة القيادة غير القانونية استجابة. الكود يعمل بشكل جيد مع بطاقة SanDisk 2 GB 2 غيغابايت.

كيف يمكنني حل هذه المشكلة؟

هل كانت مفيدة؟

المحلول

يبدو أنني قد وجدت القضية. عندما أقوم بحساب CRC الصحيح ل CMD55 وإرسال ذلك بدلا من CRC وهمية، يتم قبول الأمر (النتيجة 0x01). إذا نظرت في مواصفات الطبقة المادية في القسم 7.2.2، تقول صراحة:

تتم تهيئة واجهة SPI في وضع إيقاف تشغيل CRC بشكل افتراضي. (باستثناء الأوامر CMD0 و CMD8).

يبدو أن هذا هو الحال مع هذه السلسلة من بطاقات Transcend، وبالتالي انتهاك المواصفات. أيضا في حالة خطأ CRC يجب أن يكون الرد 0x09 بدلا من 0x05. لقد حاولت إيقاف تشغيل CRC بشكل صريح مع CMD59، لكن هذا لا يبدو للمساعدة.

=> حساب CRC الصحيح لأوامر (الكل؟) يجعل عمل البطاقة.

أنا على اتصال مع تدعم دعم حول هذا الموضوع. إذا تعلمت شيئا مفيدا، فأنت تعرف هنا.

لاحظ أنني استخدمت بطاقات Transcend الأخرى 2 غيغابايت من قبل، لكنها مصنوعة في تايوان، في حين أن الشخص الجديد مصنوع في كوريا (ويبدو أنه بطاقة سامسونج (MMAGR02GUDCA)).

نصائح أخرى

كان لدي تقريبا نفس القضية. عند إرسال ACMD41، أرسلت CMD55 تليها CMD41. كان استجابة CMD55 0x01، مما يدل على حالة الخمول وتشغيل عملية التهيئة (هذا أمر طبيعي، وأعتقد). سوف يستجيب CMD41 مع 0x05، مما يدل على القيادة غير القانونية. اتضح أن بطاقتي المعينة تقوم بفحص CRC بشكل افتراضي، حتى في وضع SPI، وأخطاء CRC CRC كأوامر غير قانونية (أي، لا تتبع المواصفات SD). عندما أقوم بحساب CRC المناسبة، فإنه يعمل بشكل جيد. فيما يلي رمز حساب CRC7 الذي استخدمته، لقد عمل جيدا بالنسبة لي:

https://github.com/hazelnusse/crc7.

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

قلت عليك أن تستخدم CRC 0 للقيادة الفاشلة. أفترض أنك تقصد أنك أرسلت البايت الأخير بأكمله 0x00. وبعد لاحظ أن CRC7 ليست سوى 7 بت أول 7 من البايت الأخير - آخر ما يسمى end bit يجب أن يكون دائما 1. وبعد لذلك إذا كنت ترسل 0x00 كما البايت الأخير، مع 0 كما آخر القليل، سيكون الفشل مفهوما، وحتى رمز الخطأ من المنطقي. إذا قمت بإرسال 1 كما آخر قليلا، يجب أن تعمل، أي. استخدام شيء مثل 0x01 أو 0xFF كما البايت الأخير.

من الطبيعي أن تكون مضخة الشحن الداخلية المستخدمة لجعل الجهد المسح الذي يستغرق وقتا أطول من المعتاد لتكون جاهزا ... عليك أن تصر على التحرير والسرد CMD55 + ACMD41 حتى تنتهي التهيئة.

يمكن أن يساعدك CMD58 أيضا في التحقق مما إذا كنت توضيح مستويات الجهد الصحيحة (في بعض الأحيان لها مآخذ مشاكل في الاتصال).

إرسال CMD0 مع رقاقة حدد (0) وحده لا تهيئة البطاقة في وضع SPI. هذا يحدد فقط وضع SPI. لا تتم تهيئة البطاقة حتى يتم قبول عائد ACMD41. ثم CRC غير متوفر بشكل افتراضي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top