ATMega8, SPI, AT45db041B

Apr 28, 2004 5 Replies

Czesc! Mam problem z obs³uga zewnetrznej pamieci Flash przez ATMega8 za pomoc± SPI. Programik napisalem w asemblerze. A wyglada mniej wiecej tak: ....... ldi r17,(1<<spe)|(1<<mstr)|(1<<spr0) out spcr,r17 ;wlaczenie SPI cbi portd,cs ; cs=0 ldi dana,0x84 ;kod zapisu do bufora1 rcall transpi ;wyslij przez spi ldi dana,0x00 ;nie znaczacy bajt rcall transpi ;wyslij ldi dana,0x00 ;nieznaczacy bajt rcall transpi ;wyslij ldi dana,0x00 ;adres pod ktorym ma rozpoczac zapis rcall transpi ;wyslij ldi dana,0x41 ;przykladowa dana ktora chce zapisac rcall transpi ;wyslij ldi dana,0x12 ;kolejna przykladowa dana rcall transpi ;wyslij sbi portd,cs ;cs=1 clr r17 out spcr,r17 ; wylacz SPI



transpi: out spdr,dana wait: sbis spsr,spif rjmp wait ret ... ... ldi r17,0x5c out spcr,r20 ;wlacz spi cbi portd,cs ;cs=0 ldi dana,0x54 ;instrukcja odczytu bufora1 rcall transpi ;wyslij ldi dana,0x00 ;nie znaczacy bajt rcall transpi ;wyslij ldi dana,0x00 ;nie znaczacy bajt rcall transpi ;wyslij ldi dana,0x00 ;adres od ktorego zaczynam czytac bufor rcall transpi ldi dana,0x00 ;wysylam kolejny nie znaczacy bajt rcall transpi in spdr,r20 i w tym momencie w rejestrze r20 powinna sie pojawic dana z pod adresu 0x00 ? Czy moze powinienem w tym momencie zmienic ustawienia w rejestrze spcr na Slave i dopiero ??:



odb: in spdr,r20 sbis spsr,spif rjmp odb


Prosilbym o pomoc bo jakos nie moge sobie z tym dac rady caly czas odczytuje niby dane FF niezaleznie od tego co zapisze (SS w ATmega mam ustawione jako wyjscie i jest w stanie wysokim)



Dzieki za pomoc Krzysiek


Chyba to nie bêdzie dzia³aæ ;(

U¿ytkownik "Krzy$" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:c6pbj6$7eb$ snipped-for-privacy@news.onet.pl...

U¿ytkownik "Krzy$" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:c6pbj6$7eb$ snipped-for-privacy@news.onet.pl...

a co masz w r20 ? moze mialo byc r17

sprobuj ewentualnie 0xD4 zamiast 0x54

tu jeszcze jeden nieznaczacy bajt !

nie musisz ciagle mieszac tym SPCR'em wystarczy, ze raz go ustawisz no chyba, ze masz cos jeszcze podpiete pod spi

jesli masz tylko procek i flasha to procek ma byc caly czas master

U¿ytkownik "Andy" snipped-for-privacy@ceti.pl napisa³ w wiadomo¶ci news:c6r65s$kq2$ snipped-for-privacy@srv.cyf-kr.edu.pl...

news:c6pbj6$7eb$ snipped-for-privacy@news.onet.pl...

Wykorzystuje tylko procek i zewnetrznego flasha. Niestety nadal nie dziala!! Chcialbym wogole sprawdzic czy dziala samo SPI i postanowilem sprawdzic rejestr statutowy (bo to chyba najprosciej-nie trzeba adresowac tylko jedna instrukcja)

Zrobilem to tak: ... ldi r17,(1<<spe)|(1<<mstr)|(1<<spr0) out spcr,r17 cbi portd,cs ldi dana,0x57 ;adres rejestru statusu rcall transpi ;wyslij ldi dana,0xff ;nieznaczacy bajt rcall transpi ;wyslij in dana1,spdr ;laduj odebrany bajt do dana1 sbi portd,cs rcall wyswietl ;wyrzuc na wyswietlacz ... Z pdfa wynika ze powinienem otrzymac : MSB-> 100111XX a ja otrzymuje caly czas FF nie wiem co jest grane, co jest z tym SPI moze w zlym momencie odczytuje SPDR??? Nie wiem czy to ma jakies znaczenie ale pin SS mam ustawiony jako wyjscie i go nie uzywam (caly czas jest w stanie 1) prosze o pomoc bo juz nie mam sil do tego SPI

Dzieki Krzysiek

U¿ytkownik "Krzy$" snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:c6rf99$5dl$ snipped-for-privacy@news.onet.pl...

sprawdz najpierw samo SPI bez flasha

zewrzyj po stronie procka MOSI z MISO i wyslij 1 bajt np AA po czym odczytaj stan z SPDR

powinno wrocic to samo czyli AA

nastepnie sprawdz czy sie nie rabnales w podlaczeniach

procek / flash

MOSI -> SI MISO <- SO SCK -> SCK CS -> CS

nastepnie sprawdz czy ustawiles jako wyjscia w rejestrze DDRB pin SCK oraz MOSI oraz SS

/* w C */ DDRB |= BV(DD_MOSI) | BV(DD_SCK) | BV(DD_SS);

Ok juz wszystko dziala! Okazalo sie ze mialem zle podlaczony klucz (zamienione MOSI z MISO) Dzieki za pomoc Krzysiek

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required