[Atmega88][asm] - Karta MMC w trybie SPI - brak odpowiedzi

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Awatar użytkownika
grysek67
Użytkownik
Posty: 315
Rejestracja: 27 cze 2007, 6:34
Lokalizacja: Limanowa
Kontakt:

[Atmega88][asm] - Karta MMC w trybie SPI - brak odpowiedzi

Post autor: grysek67 » 30 lis 2009, 16:55

Witam,

korzystając z materiałów z Elektroniki Praktycznej oraz tego schematu napisałem program do obsługi karty, narazie samą inicjalizację (zamieszczam same podprogramy).

Kod: Zaznacz cały

;--------------------* SPI *---------------------- 
spi_init: 
ldi       acc, (1<<MOSI) | (0<<MISO) | (1<<SCK) | (1<<CS) 
out       DDRB, acc 
ldi       acc, (1<<SPE) | (1<<MSTR) 
out       SPCR, acc 
ret 

spi_send: 
out         SPDR, data 
spi_1: 
in         acc, SPSR 
sbrs        acc,SPIF 
rjmp      spi_1 
in         data, SPDR 
ret 

;--------------------* MMC *---------------------- 

mmc_init: 
sbi      PORTB, CS      ;stan wysoki CS 
ldi      petla, 10      ;wyslij 80 cykli zegarowych 
init_loop: 
  dec      petla      ;10 * 8 = 80 
  breq      CMD0 
  ldi      data, 0xFF 
  rcall      spi_send   ; <--- 
rjmp   init_loop 

CMD0:               ;Przełącz karte w tryb SPI
sbi      PORTC, LED  
ldi      komenda, 0 
rcall   mmc_cmd 

CMD1:               ;Wyjdz ze stanu IDLE 
ldi      komenda, 1       
rcall   mmc_cmd 
sbrc   data, IDLE 
rjmp   CMD1 
    
ldi      datau, 'O' 
rcall   uart_send 
ldi      datau, 'K' 
rcall   uart_send 
ret 

mmc_cmd: 
cbi      PORTB, CS 
ori      komenda, 0x40 
mov    data, komenda 
rcall   spi_send 
lds      data, addr1 
rcall   spi_send 
lds      data, addr2 
rcall   spi_send 
lds      data, addr3 
rcall   spi_send 
lds      data, addr4 
rcall   spi_send 
ldi      data, 0x95 
rcall   spi_send 

ldi      petla, 10 
cmd_loop: 
 dec      petla 
 breq      cmd_end 
 ldi      data,0xFF 
 rcall      spi_send 
 sbrc      data, BUSY 
rjmp    cmd_loop 
cmd_end:    
ret
Program zatrzymuje się na wieki w miejscu oznaczonym strzałką w komentarzu. Zupełnie tak jakby karta nie odpowiadała. Wiem to po tym że dioda podpięta Do PORTC, LED nie zapala się. Połączenia sprawdzałem kilka razy i wszystko jest ok.

Do uzyskania odpowiedniego zasilania dla karty używam LM317 i napięcie zasilania udało mi się uzyskać 3,2V czyli powinno wystarczyć chyba nie?
Proszę o pomoc bo siedzę już nad tym kilka dni i nie mogę nic wymyślić ;/

ODPOWIEDZ