hallo,
hab ein problem beim aufruf von read befehlen bei meiner MMc karte im
SPI modus.
also die initialisierung funktioniert perfekt.
bekomme bei cmd0 eine 0x01, und bei cmd1 eine 0x00 als response.
danach versuche ich einen cmd17(read_block) oder einen cmd10(cid
register) befehl audzuführen, jedoch bekomme keine antwort. warte in
einer schleife auf die 0x00, aber die kommt net. mache ich irgendwelche
timingfehler???
nach dem cid read will ichm mir die responses auf dem display anzeigen
lassen, aber da kommt nix. glaube es bleibt in der schleife, wo ich auf
0x00 warte, einfach hängen(wie gesagt die responses nach der mmc_init
kommen, aber net die von CID read). muss ich nach der init warten oder
irgendwas??????? ;-(
im anhang ist mein code.
und hier die stelle wo es sich anscheinend aufhängt(spi_init und
mmc_init funzen ja, deswegen nur aufrufe und der cid befehl).
rcall spi_init ;nit aufgeführt da funzt
rcall mmc_init ;net aufgeführt, da responses 0x01 und 0x00
rcall CID_read ;hier in dem aufruf bleibts hängen
rcall tstbild ;hier komme ich nit hin, zeigt das response von
CID
;auf dem display ;-(
CID_read:
CMD_10:
ldi temp1, 0x4A ;//Commando 10
sts CMD, temp1 ;CMD is a 6 byte label in sram
lds temp1, 0x00
sts CMD+1, temp1
sts CMD+2, temp1
sts CMD+3, temp1
sts CMD+4, temp1
ldi temp1, 0xFF
sts CMD+5, temp1
rcall Write_Command_MMC ;siehe befehle weiter unten
lds temp1, response_save ;store response
sts response_read+1, temp1
cpi temp1, 0x00
breq read_CID ;wenn response 0x00 springe zu read_CID
rcall send_end
rjmp CMD_10
;Wartet auf Start Byte von der MMC/SD-Karte (FEh/Start Byte)
read_CID:
ldi temp1, 0xFF
rcall Write_Byte_MMC ;siehe befehle weiter unten
in temp1, SPDR
sts response_read, temp1
cpi temp1, 0xFF ; Antwort sollte 0xFE für lesebstätigung
breq read_CID2
cpi temp1, 0xFE
brne read_CID
read_CID2:
ldi ZL, LOW(cluster*2) ; Adresse von clusterspeicher in den z pointer
laden
ldi ZH, HIGH(cluster*2)
ldi temp2, 0x10 ;weil antwort 16byte sind
read_CID2_1:
ldi temp1, 0xFF
rcall Write_Byte_MMC
in temp1, SPDR
st Z+, temp1
dec temp2
cpi temp2, 0x00
breq read_CID_crc
rjmp read_CID2_1
read_CID_crc: ;nicht wichtig darum auslesen und net speichern
ldi temp1, 0xFF
rcall Write_Byte_MMC
ldi temp1, 0xFF
rcall Write_Byte_MMC
rcall send_end
ret
;________
;BEFEHLE
;--------
Write_Command_MMC:
ldi temp1, 0xFF
rcall Write_Byte_MMC
;//sendet 6 Byte Commando
cbi MMC_Write, MMC_Chip_Select ;//set MMC_Chip_Select to low
(MMC/SD-Karte Aktiv)
ldi temp1, 0xFF
rcall Write_Byte_MMC
lds temp1, CMD ;//sendet 6 Byte Commando zur MMC/SD-Karte
rcall Write_BYTE_MMC
lds temp1, CMD+1
rcall Write_Byte_MMC
lds temp1, CMD+2
rcall Write_Byte_MMC
lds temp1, CMD+3
rcall Write_Byte_MMC
lds temp1, CMD+4
rcall Write_Byte_MMC
lds temp1, CMD+5
rcall Write_Byte_MMC
response:
ldi temp1, 0xFF
rcall Write_Byte_MMC ;//Wartet auf ein gültige Antwort von der
MMC/SD-Karte
in temp1, SPDR
sts response_save, temp1 ;sichern des der antwort(response) von der
MMC
cpi temp1, 0xFF ;antwort sollte 0x00 sein aber kommt net
brne response2
cpi temp1, 0xFF
breq response
response2:
ret
;//Abbruch da die MMC/SD-Karte antwortet
Write_Byte_MMC:
out SPDR, temp1
lp7: sbis SPSR, SPIF
rjmp lp7
ret
send_end:
sbi MMC_Write, MMC_Chip_Select
ldi temp1, 0xFF
rcall Write_Byte_MMC
ret
Sorry, aber dein Anhang ist ne Zumutung. Stell ein vernünftiges File rein, und dann geht auch was.
Nach langem Suchen:
Der Fehler in fabses Code liegt an einem Überschreiben der
SPI-Kontrollregister in der Funktion Testbild.
Grummel, die Lösung zu Posten ist eigentlich nicht schwer oder?
Grüße
Sebastian
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.