एमएमसी मदद?

C

conkhicon

Guest
मैं बाहर एमएमसी कार्ड से नहीं पढ़ सकता है जब उपयोग PIC18F8720
- मैं इसे init करना ठीक है
- मैं ठीक (यह वापसी है स्थिति से संबंधित में लिखना)
- मैं 512 पते पर पढ़ें
एमएमसी मुझे 0 लौटने r1 (ठीक)
लेकिन मैं पाश भेज एक datatoken 0xfebut के शुरू मेल नहीं खाते wating को 0xff.
तुम मेरी मदद कर सकता हूँ?

# 16 BLOCK_LEN परिभाषित

मेरा फोन:

(0,512, bufMMC) readBlockMMC;

मेरी sourcecode:

अहस्ताक्षरित चार readBlockMMC (अहस्ताक्षरित लंबे int DWAddr, अहस्ताक्षरित वर्ण * pdes)
(
अहस्ताक्षरित localRD चार;
अहस्ताक्षरित चार dataToken;

Nop ();
lowerSS (); / / सक्रिय कार्ड
writeCMD (17, DWAddr, 0xff); / / कमान पढ़ें (सीआरसी कोई नहीं)
अगर MCCResponse (()! = 0) (
0x30 = MMC_Err;
वापसी (1);
)
Nop ();
समय (1) (/ / प्रतीक्षा आंकड़े टोकन
WriteSPI (0xff);
dataToken ReadSPI = ();
अगर (dataToken == 0xfe) तोड़; / / सफलता
अगर (dataToken (0xe0) == 0) (/ / त्रुटि टोकन
Nop ();
0x31 = MMC_Err;
वापसी (1);
)
)
Nop ();
(localRD = 0; localRD <BLOCK_LEN; localRD ) के लिए (
WriteSPI (0xff);
* = ReadSPI pdes ();pdes ; )
WriteSPI (0xff); / / सीआरसी
WriteSPI (0xff);
raiseSS () /; / कार्ड निष्क्रिय
Nop ();
वापसी (0);
)

 
कोशिश भेजने और HFF बस से पहले आप कम एस एस.
यदि यह मदद करता है, यहाँ मेरी AVR ASM कोड है.कोड:

read_sec []

'************************************************* **************

'मुद्दे पढ़ें कार्ड को क्षेत्र के आदेश

'************************************************* **************

'उप Read_sec के रूप में (lbasector लांग, Byval बाइट के रूप में Sec2xfer)

'lbasector = 2 वाय, वाई 3 Sec2xfer = वाई 0, 1 वाई

'प्रवेश बिंदु अगर रजिस्टरों को नरम द्वारा लोड करने की आवश्यकता ढेर

Read_sec:

ldd एक्सएल, 0 वाई

ldd Xh, वाई 1 'एक्स रजिस्टर Sec2xfer को जोड़ा अंक

r24, ld 'एक्स r24 Sec2xfer हैं

ldd एक्सएल, 2 वाय

ldd Xh, वाई '3 एक्स रजिस्टर lbasector को जोड़ा अंक

ld r16, एक्स r16 0 बिट्स हैं - LBA और पोस्ट incr के 7 '

ld r17, एक्स r17 8 बिट्स हैं - LBA और पोस्ट incr के 15 '

ld r18, एक्स r18 16 बिट्स हैं - LBA और पोस्ट incr के 23 '

r19, 'एक्स r19 केवल 27 LBA के 31-24 बिट्स हैं ld प्रयोग किया जाता है

'प्रवेश बिंदु अगर रजिस्टर लोड पूर्व

'r24 = क्षेत्रों हस्तांतरण को r16 को r19 lbasector =

Readsec []

$ विदेश Lba2add, Txrxspi, Txrxspi_wait4resp, Chk4error

Readsec:

rcall 'Txrxspi255 कार्ड बफर फ्लश चुनें चिप के बिना 255 भेजें

सीबीआई Spiport, 'Sdmmccs एसडी / एमएमसी चिप चुनें सक्रिय करना

rcall 'Lba2add LBA परिवर्तित करने का पता

r23 ldi, Read_multiple_block

rcall Txrxspi

r23, r19 mov 'पता ही भेजें

rcall Txrxspi

r23 mov, r18

rcall Txrxspi

r23 mov, r17

rcall Txrxspi

r23 mov, r16

rcall 'Txrxspi_wait4resp पता लो भेजने और प्रतिक्रिया के लिए प्रतीक्षा

किसी भी त्रुटि के लिए rcall 'Chk4error की जांच

गीला करना

[समाप्त]get_sec []

'************************************************* **************

'कार्ड से डा क्षेत्र डेटा प्राप्त है और यह डा राम में रहो

'************************************************* **************

'उप Get_sec बफर ((), Byval बाइट के रूप में Sec_expected)

बफर '() = Y 2, वाई 3 Sec_expected = 0 वाई, 1 वाई

'प्रवेश बिंदु अगर रजिस्टरों को नरम द्वारा लोड करने की आवश्यकता ढेर

Get_sec:

ldd एक्सएल, 0 वाई

ldd Xh, वाई 1 'एक्स रजिस्टर में जोड़ी अंक Sec_expected

ld r24, 'एक्स r24 Sec_expected हैं

ldd एक्सएल, वाई 2 'एक्स रजिस्टर जोड़ी अंक बफर के लिए

ldd Xh, 3 Y

'प्रवेश बिंदु अगर रजिस्टर लोड पूर्व

'r24 = क्षेत्र के काउंटर Sec_expected ()

'एक्सएल & = (एक्स रजिस्टर जोड़ी Xh) को बफर अंक

Getsec []

$ विदेश Txrxspi_wait4token, Txrxspi, Txrxspi_wait4resp, Chk4error

Getsec:

डेटा के लिए rcall 'Txrxspi_wait4token इंतज़ार टोकन

r25 ldi ', 0 शब्द काउंटर

Getsec_loop:

r25 भाकपा, और 'HFF है हम 2 बाइट्स मिल जाना?

brne Getsec_loop1 'यदि नहीं, तो पाशन रखना

दिसम्बर 'r24 decr sec_expected

brne Getsec_loop1 'हम तैयार हैं?

r23 ldi, 'Stop_transmission यदि हां, तो txing रोक

rcall 'Txrxspi r23 में एक बाइट मिल

सेंट एक्स , 'r23 बफर भंडार को

rjmp Getsec_loop2

Getsec_loop1:

rcall 'Txrxspi255 r23 में एक बाइट मिल

सेंट एक्स , 'r23 बफर भंडार को

Getsec_loop2:

rcall Txrxspi255

सेंट एक्स , 'r23 फिर से.
2 बाइट्स = 1 शब्द

inc 'r25 incr शब्द काउंटर

brne getsec_loop 'हमने 1 ब्लॉक स्थानांतरित समाप्त

rcall 'Txrxspi255 crc16 और हाय यह डंप हो

rcall 'Txrxspi255 crc16 लो और यह डंप हो

tst r24 'क्षेत्र = 0 काउंटर है

brne 'Getsec अगर समाप्त नहीं, कुछ और डेटा प्राप्त

वैध प्रतिक्रिया के लिए rcall 'Txrxspi_wait4resp इंतज़ार

किसी भी त्रुटि के लिए rcall 'Chk4error की जांच

भारतीय स्टेट बैंक Spiport, 'Sdmmccs एसडी / एमएमसी चिप का चयन नहीं सक्रिय करना

गीला करना

[समाप्त]

 
तस्वीर के लिए एमएमसी तक पहुँचने के लिए वहाँ mikroC में एक बहुत अच्छा पुस्तकालय, यह कोशिश है ....

डेमो http://www.mikroelektronika.co.yu/english/product/compilers/mikroc/download.htm पर उपलब्ध है

सादर

 
एमएमसी के बीच एक अंतर है जो अलग वर्गों का समर्थन कमान लो.

मैं sandisk एमएमसी productManual पढ़ें और सी एस डी Rergister में देखना [95:84] क्षेत्र
CCC = 0x5 = 0b 000 000 0,101 समर्थन comand कक्षा 0,2, जो कक्षा 0 समर्थन Initilize एमएमसी कार्ड और कक्षा 2 समर्थन पढ़ें कमान और मैं (4 कक्षा में) विफलता लिखें ब्लॉक के साथ एमएमसी कार्ड लिखने की कोशिश पर इतना.मैं एम.एम. कार्ड और नहीं लिख पढ़ सकते हैं.
क्या मैं सही लगता है?
लेकिन मोबाइल के लिए इस कार्ड डालें.इसे पढ़ने और लिखने के लिए बहुत अच्छा है.क्यों???
तुम मुझे मदद करते हैं?

 
प्रदान की एक संभावित कारण पता है.ब्लॉक केवल एक ब्लाक सीमा के शुरू से ही लिख सकता है लिखता है, whilst पुस्तकें खंड के भीतर कहीं भी हो सकता है.मैं साल के लिए MMCs छुआ havent, लेकिन मुझे यह याद है सीमाओं में से एक है.

 
तुम मेरी मदद कर सकता हूँ?

# 16 BLOCK_LEN परिभाषित
मेरा फोन:
(0,512, bufMMC) readBlockMMC;
मेरी sourcecode:
अहस्ताक्षरित चार readBlockMMC (अहस्ताक्षरित लंबे int DWAddr, अहस्ताक्षरित वर्ण * pdes)
(
अहस्ताक्षरित localRD चार;
अहस्ताक्षरित चार dataToken;

Nop ();
lowerSS (); / / सक्रिय कार्ड
writeCMD (17, DWAddr, 0xff); / / कमान पढ़ें (सीआरसी कोई नहीं)
अगर MCCResponse (()! = 0) (
0x30 = MMC_Err;
वापसी (1);
)
Nop ();
समय (1) (/ / प्रतीक्षा आंकड़े टोकन
WriteSPI (0xff);
dataToken ReadSPI = ();
अगर (dataToken == 0xfe) तोड़; / / सफलता
अगर (dataToken (0xe0) == 0) (/ / त्रुटि टोकन
Nop ();
0x31 = MMC_Err;
वापसी (1);
)
)
Nop ();
(localRD = 0; localRD <BLOCK_LEN; localRD ) के लिए (
WriteSPI (0xff);
* = ReadSPI pdes ();
pdes ;
)
WriteSPI (0xff); / / सीआरसी
WriteSPI (0xff);
raiseSS () /; / कार्ड निष्क्रिय
Nop ();
वापसी (0);
)

क्या आपको लगता है कि मैं सही हूँ?

 
मैं माइक्रोचिप C18 कम्पाइलर का उपयोग करें
कृपया तस्वीर के लिए समारोह के बाद जो ठीक runing है.
धन्यवाद

 

Welcome to EDABoard.com

Sponsor

Back
Top