दरअसल, एसडी इनिशियलाइजेशन पर आपको मिलने वाली ज्यादातर जानकारी / कोड या तो डेटेड या इनोसेंट है, क्योंकि यह एसडीएचसी और एसडीएक्ससी को सालों से पहले से देखता है। प्रक्रिया आजकल अधिक जटिल है, क्योंकि यह आपको पुराने हार्डवेयर के साथ एक बैकवर्ड-संगत तरीके से निपटने के लिए मजबूर करती है।
सबसे पहले, जैसा कि दूसरों द्वारा बताया गया है, एक कम प्रारंभिक घड़ी दर (आमतौर पर 100 kHz - 400 kHz रेंज में, यदि संभव हो तो 400 kHz का उपयोग करें) का चयन करें; यदि डिवाइस इसके लिए अनुमति देता है, तो आप बाद में उच्च घड़ी पर स्विच करने में सक्षम होंगे। जबकि नए कार्ड सुरक्षित रूप से मेगाहर्ट्ज-ईश क्लॉकिंग का सामना कर सकते हैं, पुराने शिकायत करेंगे (यानी संचार नहीं करेंगे या कचरा नहीं लौटाएंगे)।
अगली बात यह है कि आपको CMD1एसडी / एसडीएचसी / एसडीएक्ससी कार्ड को इनिशियलाइज़ करने के लिए उपयोग नहीं करना चाहिए जब तक कि आपका कार्ड पहचान नहीं करता है CMD55/ ACMD41; एसडी कार्ड विनिर्देश में कहा गया है:
किसी भी मामले में CMD1 की सिफारिश नहीं की जाती है क्योंकि होस्ट के लिए मल्टीमीडिया कार्ड और एसडी मेमोरी कार्ड के बीच अंतर करना मुश्किल हो सकता है।
यदि आप CMD1उन्हें जारी करते हैं तो कुछ नियंत्रक (नए और उच्च क्षमता वाले अधिकतर कार्ड) केवल आईडीएलई में बने रहेंगे । आपको पहले CMD8 0x1AAरीसेट ( CMD0) के बाद जारी करना चाहिए , और फिर उपयोग करने का प्रयास करना चाहिए CMD55 + ACMD41। यदि और केवल यदि वह विफल रहता है, तो उपयोग करें CMD1।
tl; SPI मोड में कार्ड को इनिशियलाइज़ करने के लिए ;
CMD0arg:, 0x0CRC: 0x95(प्रतिक्रिया :) 0x01- ध्यान दें कि 0xFFया विकृत प्रतिक्रिया के मामले में आपको बस इस चरण को दोहराना चाहिए; अधिक जानकारी के लिए नीचे देखें।
CMD8arg:, 0x000001AACRC: 0x87(response:, 0x01arg की गूंज के बाद, इस मामले में 0x000001AA) - जबकि ऐसा लग सकता है कि यह कमांड वैकल्पिक है, यह नए कार्ड के लिए पूरी तरह से अनिवार्य है। जबकि 0x1AAयहाँ एक सामान्य arg मूल्य है, आप वास्तव में अन्य मान भी पास कर सकते हैं; "टेबल 7-5: एसपीआई मोड में सीएमडी 8 के लिए कार्ड ऑपरेशन" देखें, पी। विवरण के लिए 108 कल्पना में।
3 ए। CMD55arg:, 0x0CRC: कोई भी, 0x65वास्तव में (प्रतिक्रिया 0x01:; प्रत्येक केCMD55 लिए उपसर्ग ; यदि प्रतिक्रिया है , तो आपको एक पुराना कार्ड मिल गया है - / के बजाय arg [CRC ] के साथ दोहराएं ) ACMD0x05CMD10x00xF9CMD55ACMD41
3 बी। ACMD41, arg:, 0x40000000CRC: कोई भी, 0x77वास्तव में (ध्यान दें कि यह तर्क मानता है कि कार्ड HCS एक है, जो आमतौर पर होता है। पुराने कार्ड के लिए 0x0arg [CRC 0xE5] का उपयोग करें )। यदि प्रतिक्रिया है 0x0, तो आप ठीक हैं; अगर यह है 0x01, गोटो 3 ए; यदि यह है 0x05, तो ऊपर नोट देखें (3 ए में।); यदि यह नहीं है, तो इसके साथ कुछ गलत है (नीचे भी देखें)।
CMD1CMD0CMD8CMD55ACMD41CMD55ACMD41CMD0CMD8CMD1CMD1CMD55ACMD41CMD10x05nn0प्रकट नहीं होता है (अर्थात यदि उपकरण किसी कारणवश IDLE मोड में रहता है)। इसके अलावा, प्राप्त करने 0xFFसे CMD0आम है अगर एक युक्ति है कि पहले कुछ "अजीब" स्थिति में था (लटका दिया जैसे, एस एस [उच्च] deasserted मिला है, था खत्म / undervoltage पर कुछ पिंस आदि) - बस यह कुछ समय देते हैं, कुल्ला और दोहराने बार। करने के लिए एक ठीक से प्रदर्शित प्रतिक्रिया कभी कभी काफी ठीक है - यदि आप इसे एक दो बार भेजा है और प्रतिक्रिया अब भी है न है और न ही , साथ आगे जाने की कोशिश । अगर यह काम करता है - आप जाने के लिए अच्छा है; अगर यह नहीं है - यह शायद टूट गया है ।nCMD00xFF0x01CMD8
ध्यान दें कि MSB सेट पर जो प्रतिक्रियाएं होती हैं, लेकिन 0xFFआमतौर पर यह सुझाव नहीं दिया जाता है कि आपके SPI को क्लॉकिंग में एक बदलाव मिला (उदाहरण के लिए Vcc ड्रॉप, जो नियमित रूप से तब होता है जब आप SD हॉटप्लग कर रहे होते हैं)। इसे ठीक करने के लिए, आप डिवाइस को पूरी तरह से रीसेट करने की कोशिश कर सकते हैं (पावर ऑन / ऑफ, डेज़र / एससर एसओएस आदि); यह आम तौर पर काम करता है।
इसके अलावा, युक्ति का कहना है
अंतिम एसडी मेमोरी कार्ड बस लेनदेन के बाद, होस्ट को आवश्यक है, कार्ड को बंद करने से पहले ऑपरेशन को पूरा करने के लिए 8 (आठ) घड़ी चक्र प्रदान करने के लिए।
यह इसके बिना काम कर सकता है, लेकिन 8 चक्र = 1 एसपीआई आउटपुट बाइट के बाद से, यह ज्यादा चोट नहीं पहुंचाएगा और इसे रखना अच्छा है।
ध्यान दें कि आपको S̲S̲ (उर्फ सीएस) को कम से कम पहले और बाद में जोर देना चाहिए CMD- यह पूरी तरह से अनिवार्य है CMD0( यदि इसके बिना डिवाइस चालू नहीं होगा) और वास्तव में, अन्य सभी के लिए आवश्यक है CMDयदि आपके पास कोई मानक है -प्राप्त एसडी कार्ड। स्थायी रूप से कार्ड के S̲S̲ को GND से कनेक्ट करना प्रतीत हो सकता हैएक अच्छा विचार होना चाहिए कि कार्ड एकमात्र एसपीआई क्लाइंट है जिसे आपका होस्ट कभी भी कनेक्ट करेगा, क्योंकि यह आपको यूसी आउटपुट पिन और कोड द्वारा इसे प्रबंधित करने की आवश्यकता दोनों को बचाएगा, और क्योंकि कार्ड को यह सब चुनना चाहिए। समय की। वास्तव में, कुछ कार्ड (यदि उनमें से अधिकांश नहीं) वास्तव में उच्च-से-कम ढलान की अपेक्षा करते हैं, तो बस कम का पता लगाने के बजाय चालू करने के लिए, और इस तरह गुस्सा हो जाता है यदि आप S̲S at बिट को बिल्कुल भी नहीं टालते हैं, और फिर अंतराल घड़ियों या थूक कचरा; कुछ (आमतौर पर नए) कार्ड काम करने चाहिए, कुछ (पुराने) नहीं हो सकते, YMMV (अभी तक फिर से)। फिर भी, किसी भी अधिक मजबूत एसपीआई कॉन्फ़िगरेशन (> 1 स्लेव डिवाइस) के लिए दिए गए एसडी कार्ड के साथ किसी भी वास्तविक लेनदेन से पहले पिन को कम करना याद रखें।
इसके अलावा, जबकि युक्ति का कहना है कि केवल CMD0और CMD8एसपीआई मोड में सीआरसी होना चाहिए, कुछ एसडी कार्ड (जैसे ट्रांसेंड वाले) के लिए उचित सीआरसी की आवश्यकता होती है CMD55/ ACMD41- यदि आप सुरक्षित पक्ष पर होना चाहते हैं, तो बस उनके लिए एक पूर्व निर्धारित मूल्य का उपयोग करें।
इसके अलावा, जबकि SPI को खुद से पुलअप / डाउन की आवश्यकता नहीं है, MISO पर 47k पुलअप फेंकना एक अच्छा विचार हो सकता है; कुछ डिवाइस विशिष्ट परिस्थितियों में अपने डीओ पिन हाई-जेड को छोड़ देते हैं (उदाहरण के लिए प्रारंभिक नहीं), और फ्लोटिंग पिन हमेशा अजीब समस्याओं का स्रोत हो सकते हैं। यदि आपके uC में 3.3 Vcc है, तो आप आंतरिक पुलअप का उपयोग कर सकते हैं; यदि यह 5V है, तो ऐसा न करें जब तक कि आपके MISO लाइन में उचित 5-> 3.3V तर्क अनुवाद न हो।
आगे की पढाई:
एमएमसी / एसडीसी का उपयोग कैसे करें
एसडी विनिर्देश भाग 1 सरलीकृत भौतिक परत सरलीकृत विशिष्टता - सबसे महत्वपूर्ण खंड 6.4.1 पावर अप और 7.2.1 मोड चयन और चित्र 7-1 के साथ प्रारंभ : एसडी मेमोरी कार्ड स्टेट डायग्राम (एसपीआई मोड)
CMD8पहले से जारी किए बिना बिल्कुल भी शुरू नहीं होंगे । इसके अलावा, घड़ी आमतौर पर एक मुद्दा नहीं है, जब तक कि यह समझदार सीमा के भीतर है।