SPI में माइक्रोएसडी कार्ड आरंभीकरण के लिए सही कमांड अनुक्रम क्या है?


19

मैं एक सिलिकॉन लैब C8051F931 नियंत्रक के साथ एक माइक्रोएसडी कार्ड (2 जीबी, किंग्स्टन, सैंडिस्क ) को इंटरफ़ेस करने की कोशिश कर रहा हूं ।

मुझे उस अनुक्रम के बारे में बहुत भ्रम है जो मुझे आरंभीकरण के लिए पालन करना है। पुस्तक में SD कार्ड प्रोजेक्ट्स का उपयोग करके PIC Microcontroller , पृष्ठ 135 का उल्लेख किया गया है:

इसलिए एसपीआई मोड में एसडी कार्ड को स्विच करने के लिए कदम इस प्रकार होना चाहिए:
पावर-अप।
CS और डेटा रूपरेखा के साथ कार्ड पर कम से कम 74 घड़ी दालें भेजें "1."
• सेट सीडी लाइन कम।
• एसपीआई मोड में कार्ड डालने के लिए 6-बाइट CMD0 कमांड "40 00 00 00 95" भेजें।
• कोई त्रुटि बिट सेट नहीं हैं यह सुनिश्चित करने के लिए R1 प्रतिक्रिया की जाँच करें।
• कमांड सीएमडी 1 को बार-बार भेजें जब तक कि आर 1 प्रतिक्रिया में "इन-आइडल-स्टेट" बिट "0," पर
सेट न हो। • कोई त्रुटि बिट सेट नहीं हैं। कार्ड अब रीड / राइट ऑपरेशन के लिए तैयार है।

मैंने यह कोशिश की, लेकिन मुझे सीडीएम 1 के लिए भी 01 मिल रहा है। 00 अपेक्षित है।

यहाँ भी मैं एक अलग कमांड अनुक्रम देखता हूँ जहाँ वह CMD8 के बाद CMD8 भेजता है। लेकिन किताब कहती है कि मुझे सीएमडी 1 भेजना होगा।

सही क्रम क्या है?

जवाबों:


35

दरअसल, एसडी इनिशियलाइजेशन पर आपको मिलने वाली ज्यादातर जानकारी / कोड या तो डेटेड या इनोसेंट है, क्योंकि यह एसडीएचसी और एसडीएक्ससी को सालों से पहले से देखता है। प्रक्रिया आजकल अधिक जटिल है, क्योंकि यह आपको पुराने हार्डवेयर के साथ एक बैकवर्ड-संगत तरीके से निपटने के लिए मजबूर करती है।

सबसे पहले, जैसा कि दूसरों द्वारा बताया गया है, एक कम प्रारंभिक घड़ी दर (आमतौर पर 100 kHz - 400 kHz रेंज में, यदि संभव हो तो 400 kHz का उपयोग करें) का चयन करें; यदि डिवाइस इसके लिए अनुमति देता है, तो आप बाद में उच्च घड़ी पर स्विच करने में सक्षम होंगे। जबकि नए कार्ड सुरक्षित रूप से मेगाहर्ट्ज-ईश क्लॉकिंग का सामना कर सकते हैं, पुराने शिकायत करेंगे (यानी संचार नहीं करेंगे या कचरा नहीं लौटाएंगे)।

अगली बात यह है कि आपको CMD1एसडी / एसडीएचसी / एसडीएक्ससी कार्ड को इनिशियलाइज़ करने के लिए उपयोग नहीं करना चाहिए जब तक कि आपका कार्ड पहचान नहीं करता है CMD55/ ACMD41; एसडी कार्ड विनिर्देश में कहा गया है:

किसी भी मामले में CMD1 की सिफारिश नहीं की जाती है क्योंकि होस्ट के लिए मल्टीमीडिया कार्ड और एसडी मेमोरी कार्ड के बीच अंतर करना मुश्किल हो सकता है।

यदि आप CMD1उन्हें जारी करते हैं तो कुछ नियंत्रक (नए और उच्च क्षमता वाले अधिकतर कार्ड) केवल आईडीएलई में बने रहेंगे । आपको पहले CMD8 0x1AAरीसेट ( CMD0) के बाद जारी करना चाहिए , और फिर उपयोग करने का प्रयास करना चाहिए CMD55 + ACMD41यदि और केवल यदि वह विफल रहता है, तो उपयोग करें CMD1

tl; SPI मोड में कार्ड को इनिशियलाइज़ करने के लिए ;

  1. CMD0arg:, 0x0CRC: 0x95(प्रतिक्रिया :) 0x01- ध्यान दें कि 0xFFया विकृत प्रतिक्रिया के मामले में आपको बस इस चरण को दोहराना चाहिए; अधिक जानकारी के लिए नीचे देखें।

  2. 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 के साथ प्रारंभ : एसडी मेमोरी कार्ड स्टेट डायग्राम (एसपीआई मोड)


4

एसडी कार्ड के लिए चश्मा sdcard.org पर उपलब्ध हैं । सरलीकृत संस्करण ने कुछ विवरण छोड़ दिए, लेकिन आपको भाग 1 में आंकड़ा 7-2 पर उदाहरण के लिए देखना चाहिए, जहां एसडीएचसी और एसडी कार्ड के लिए प्रारंभिक अनुक्रम समझाया गया है।

माइक्रोएसडी कार्ड <= 2 जीबी पुराने कार्ड की तरह काम कर सकते हैं, इसलिए उन्हें आपको अंततः0x00 परिणाम देना चाहिए । इसके लिए कुछ से अधिक रिट्रीट की आवश्यकता हो सकती है, क्योंकि कार्ड कुछ आंतरिक प्रसंस्करण को चलाने के लिए एसपीआई बस से बाहरी घड़ी का उपयोग कर सकता है।CMD1


2

@Vaxquis उत्कृष्ट उत्तर को जोड़ते हुए, मैं " भौतिक परत सरलीकृत विशिष्टता संस्करण 4.10 से संबंधित चार्ट को उद्धृत करना चाहता हूं । © कॉपीराइट 2001-2013 एसडी ग्रुप (पैनासोनिक, सैनडिस्क, तोशिबा) और एसडी कार्ड एसोसिएशन" (चित्रा 7-2) : एसपीआई मोड इनिशियलाइज़ेशन फ्लो):

एसडी कार्ड एसपीआई इनिट अनुक्रम

यहां आप देख सकते हैं कि किस आदेश को किस क्रम में भेजना है और क्या प्रतिक्रियाएं हमें कार्ड के प्रकार के बारे में बताती हैं। मुझे लगता है कि यह वांछनीय है कि एक उपकरण यथासंभव अधिक से अधिक कार्ड का समर्थन करता है; और जब तक यह 512 बाइट्स के ब्लॉक को पढ़ने और लिखने के बुनियादी कार्यों की बात आती है, तब तक कम से कम सभी V1.x और V2.0 एसडी और HC कार्ड के लिए उपयुक्त होना चाहिए।


2

मैं इसे एक और संभावना के रूप में पेश करता हूं .. एसपीआई मोड में, सैमसंग माइक्रोएसडी ईवीओ 32 जीबी में सभी कमांड कोडों को वैध सीआरसी कोड की आवश्यकता होती है। मुझे यकीन है कि वे अकेले नहीं हैं। मैंने एक टिप्पणी पढ़ी, जहां व्यक्ति का मानना ​​था कि 32GB से ऊपर के सभी कार्ड इस तरह से हो सकते हैं। मैं एक हफ्ते के लिए बग पर डिबगिंग कर रहा हूं। मेरा कोड तब तक काम नहीं करेगा जब तक कार्ड में भेजे गए सभी कोड में मान्य crc कोड नहीं होंगे। मैंने इसका उपयोग सभी CRC कोडों की गणना करने के लिए किया था https://github.com/hazelnusse/crc7/blob/master/crc7.cc मैंने सीआरसी कोड को बंद करने के लिए एक कमांड 59 का उपयोग करके भी कोशिश की, नहीं। मुझे उम्मीद है कि यह किसी और को बहुत समय और प्रयास बचाता है।

CRC मूल्यों के साथ मेरा इनिशियलाइज़ेशन कोड ।।

Power On..
Clock card at least 74 (I use 80) cycles with cs high
CMD0 0, crc=0x95
CMD8 0x01aa, crc=0x87
CMD58 0, crc=0xfd
CMD55 0, crc=0x65
CMD41 0x40000000, crc=0x77
CMD9 0, crc=0xaf
CMD16, 512, crc=0x81 (If you want block length of 512)

Some random other commands..
CMD17 0, crc=0x3b (Read one block)
CMD18 0, crc=0x57 (Read multiple blocks)
CMD24 0, crc=0x6f (set write address for single block)
CMD25 0, crc=0x03 (set write address for first block)

-2

क्या आप सुनिश्चित हैं कि आपकी SPI बस 400 kHz पर है? एसपीआई बस के साथ 400 kHz पर चलने वाली इनिशियलाइज़ेशन तब तक होनी चाहिए जब तक कि SD कार्ड रिपोर्ट न करें कि यह निष्क्रिय अवस्था में है, जिस पर SPI बस क्लॉक रेट को बढ़ाया जा सकता है (सटीक अधिकतम निर्माता से निर्माता में भिन्न होता है, लेकिन ऐसा लगता है 12 मेगाहर्ट्ज अधिकांश कार्ड के लिए एक सुरक्षित शर्त है)।

इसके अनुसार, इस के अनुसार: http://elm-chan.org/docs/mmc/mmc_e.html CMD1 उचित प्रारंभिक मानकीकरण है। सीएमडी 8 को केवल वोल्टेज रेंज की क्वेरी करने की आवश्यकता होती है, जो कि गैर-एसडीएचसी (<= 2 जीबी) कार्ड के साथ कोई समस्या नहीं होनी चाहिए।


वास्तव में, कई एसडी कार्ड (ज्यादातर नए वाले, मेरे Sony SR-32C4 32GB एक हैं) CMD8पहले से जारी किए बिना बिल्कुल भी शुरू नहीं होंगे । इसके अलावा, घड़ी आमतौर पर एक मुद्दा नहीं है, जब तक कि यह समझदार सीमा के भीतर है।
vaxquis

-3

शायद यह बहुत देर हो चुकी है, लेकिन कार्ड से प्रतिक्रिया ठीक है! CMD0 के बाद, प्रतिक्रिया 0x01 होनी चाहिए - इसका मतलब यह है कि कार्ड आईडीएल राज्य में है और काम के लिए तैयार है। यदि आपके पास कुछ है जैसे 0b00000101 1 2-nd जगह पर कहता है कि यह गैरकानूनी कमांड है और 0-s स्थान पर 1 कहता है कि अभी भी IDLE अवस्था में है और काम के लिए तैयार है। यदि प्रतिक्रिया 0x00 है तो इसका मतलब है कि कार्ड IDLE स्थिति में नहीं है और आपको एक और RESET कमांड भेजना होगा।


क्या आपने सवाल पढ़ा है? ओपी स्पष्ट रूप से कहा I tried this, but I am getting 01 even for CDM1- के जवाब में प्रयोग में नहीं हो रही है CMD1में नहीं ठीक है। आप अपनी वास्तविक समस्या को अपने "उत्तर" से संबोधित नहीं कर रहे हैं।
vaxquis
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.