Mój problem jest dość dziwny i nie wiem co robię źle. Pisze sobie program w assemblerze jako jedna wielka wstawka assemblerowa w Bascomie. Chcę odczytywać karty MMC. Utknąłem w punkcie kiedy muszę odczytać dane z karty.
Mam kilka kart MMC o pojemności 32MB, wszystkie zachowują się tak samo, zwracają odpowiedź &H80.
Korzystam ze sprzętowego SPI, dzielnik szybkości najmniejszy, procesor działa na 8MHz
Co zrobiłem do tej pory:
1) wstępny reset - wysyłam 10 bajtów &HFF żeby wejść w SPI ale z pinem CS w stanie niskim
2) inicjalizacja karty, wysyłam &H40 00 00 00 00 95, dostaję odpowiedź &H01 czyli OK
3) reset karty, wysyłam &H41 00 00 00 00 FF, dostaje odpowiedź &H00 czyli OK
4) ustawiam blok danych na 512b, wysyłam &H50 00 00 02 00 FF, dostaję odpowiedź &H00 czyli OK
5) chcę odczytać pierwszy blok, wysyłam &H51 00 00 00 00 FF, dostaję odpowiedź &H80 czyli coś nie tak
Zawsze dostaję w pkt 5 odpowiedź &H80, problem w tym że odpowiedź R1 nigdy nie może być &H80, poprostu taka nie istnieje bo jej bit MSB zawsze jest 0.
Nawet obejrzałem sobie źródło AVR-DOS i nie ma tam żadnych cudów, robią odczyt w ten sposób co ja.
----------
Jest tez istotna sprawa. Podczas pierwszej inicjalizacji należy wysłać 10 bajtów &HFF z pinem CS w stanie wysokim, a potem komendę &H40 00 00 00 00 95 z pinem CS w stanie niskim. Problem w tym że u mnie to nie działa.
Po włożeniu karty jej CS daję w stan niski i trzymam tak cały czas, wysyłam &H40 00 00 00 00 95, dostaję błędną odpowiedź, jeszcze raz wysyłam 10 bajtów &HFF i znów tą komendę inicjalizacji. I za drugą próbą otrzymuję już poprawną odpowiedź &H01. I ten sposób zawsze mi działa.
Co ciekawe ten sposób z CS ciągle w stanie niskim dziwnie działa na innej karcie MMC. Inicjalizacja kończy się sukcesem ale tylko raz przy pierwszym włączeniu napięcia karty, potem daje błąd. Ale na innej karcie MMC mogę robić inicjalizację dowolną ilość razy bez odłączania napięcia i zawsze kończy się sukcesem.
-----------------
Natknąłem się tez na 2 strony internetowe w których autorzy po daniu stanu niskiego na CS wysyłają bajt "pustak" &HFF, potem rozkaz, odczytują odpowiedź, wysyłają znów bajt "pustak" &HFF i dają CS w stan wysoki. Potem robią znów to samo jeśli chcą nadać następny rozkaz. Czy ten bajt pustak jest potrzebny?
----------- DODATEK
Rozwiązałem problem z poziomem linii CS, konieczne jest stosowanie "pustaka", wtedy wszystko działa.
Natomiast nadal jest problem z odczytem. Otrzymuję odpowiedź na komendę odczytu pojedyńczego bloku:
&H FF 80 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00....
te zera ciągną się ponad 250 bajtów, w pewnym momencie dostaję token &HFE i odbieram dane. Ale nie zgadzają się one z tym co powinno być na karcie. Ta odpowiedź nie powinna tak wygladać.
Mam kilka kart MMC o pojemności 32MB, wszystkie zachowują się tak samo, zwracają odpowiedź &H80.
Korzystam ze sprzętowego SPI, dzielnik szybkości najmniejszy, procesor działa na 8MHz
Co zrobiłem do tej pory:
1) wstępny reset - wysyłam 10 bajtów &HFF żeby wejść w SPI ale z pinem CS w stanie niskim
2) inicjalizacja karty, wysyłam &H40 00 00 00 00 95, dostaję odpowiedź &H01 czyli OK
3) reset karty, wysyłam &H41 00 00 00 00 FF, dostaje odpowiedź &H00 czyli OK
4) ustawiam blok danych na 512b, wysyłam &H50 00 00 02 00 FF, dostaję odpowiedź &H00 czyli OK
5) chcę odczytać pierwszy blok, wysyłam &H51 00 00 00 00 FF, dostaję odpowiedź &H80 czyli coś nie tak
Zawsze dostaję w pkt 5 odpowiedź &H80, problem w tym że odpowiedź R1 nigdy nie może być &H80, poprostu taka nie istnieje bo jej bit MSB zawsze jest 0.
Nawet obejrzałem sobie źródło AVR-DOS i nie ma tam żadnych cudów, robią odczyt w ten sposób co ja.
----------
Jest tez istotna sprawa. Podczas pierwszej inicjalizacji należy wysłać 10 bajtów &HFF z pinem CS w stanie wysokim, a potem komendę &H40 00 00 00 00 95 z pinem CS w stanie niskim. Problem w tym że u mnie to nie działa.
Po włożeniu karty jej CS daję w stan niski i trzymam tak cały czas, wysyłam &H40 00 00 00 00 95, dostaję błędną odpowiedź, jeszcze raz wysyłam 10 bajtów &HFF i znów tą komendę inicjalizacji. I za drugą próbą otrzymuję już poprawną odpowiedź &H01. I ten sposób zawsze mi działa.
Co ciekawe ten sposób z CS ciągle w stanie niskim dziwnie działa na innej karcie MMC. Inicjalizacja kończy się sukcesem ale tylko raz przy pierwszym włączeniu napięcia karty, potem daje błąd. Ale na innej karcie MMC mogę robić inicjalizację dowolną ilość razy bez odłączania napięcia i zawsze kończy się sukcesem.
-----------------
Natknąłem się tez na 2 strony internetowe w których autorzy po daniu stanu niskiego na CS wysyłają bajt "pustak" &HFF, potem rozkaz, odczytują odpowiedź, wysyłają znów bajt "pustak" &HFF i dają CS w stan wysoki. Potem robią znów to samo jeśli chcą nadać następny rozkaz. Czy ten bajt pustak jest potrzebny?
----------- DODATEK
Rozwiązałem problem z poziomem linii CS, konieczne jest stosowanie "pustaka", wtedy wszystko działa.
Natomiast nadal jest problem z odczytem. Otrzymuję odpowiedź na komendę odczytu pojedyńczego bloku:
&H FF 80 FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00....
te zera ciągną się ponad 250 bajtów, w pewnym momencie dostaję token &HFE i odbieram dane. Ale nie zgadzają się one z tym co powinno być na karcie. Ta odpowiedź nie powinna tak wygladać.
![[Atmega8][asm] Nie mogę odczytać z karty MMC [Atmega8][asm] Nie mogę odczytać z karty MMC](https://obrazki.elektroda.pl/1891174300_1325592255.jpg)