Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 16 kwi 2026, o 11:29


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 26 cze 2016, o 18:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

Witam,
Mam problem z odczytem czegokolwiek z pamięci M95160.
Tutaj pdf do niej:
http://www.st.com/content/ccc/resource/ ... 066376.pdf

Używam ATB 1.01 i Megi32
i moje podłączenia pin scalaka i do czego podłączyłem:
S->GND
Q->PB6
W->VCC
HOLD->VCC
C->PB7
D->PB5

i mój kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Po wgraniu tego do Uc na wyświetlaczy otrzymuje wartości zmiennych 255, 255, 255
Chciałem odczytać sobie z tego scalaka na początek Status Register, niestety coś nie idzie po mojej myśli.
Ktoś wie w czym może tkwić problem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2016, o 19:31 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

xamrex napisał(a):
i moje podłączenia pin scalaka i do czego podłączyłem:
S->GND
...
...

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Biorąc pod uwagę fragment z dokumentacji (3.4.1 Protocol control):
Cytuj:
The Chip Select (S) input offers a built-in safety feature, as the S input is edge-sensitive as
well as level-sensitive: after power-up, the device is not selected until a falling edge has first
been detected on Chip Select (S).
This ensures that Chip Select (S) must have been high
prior to going low, in order to start the first operation.
to chyba jednak powinieneś połączyć:
S->CS(PB4)
i odpowiednio sterować tym pinem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 cze 2016, o 21:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

Zmieniłem kod na;
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ale niewiele to pomogło ;-(

Chyba robie dokładnie tak jak jest napisane:
Cytuj:
To execute Read commands (READ, RDSR, RDID, RDLS), the device must decode:
•a falling edge and a low level on Chip Select (S) during the whole command
•instruction and address as multiples of eight bits (byte)
From this step, data bits are shifted out until the rising edge on Chip Select (S)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 cze 2016, o 05:57 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

xamrex napisał(a):
Zmieniłem kod na;

Kod zmieniłeś, ale nie napisałeś, czy połączyłeś pin CS (PB4) mikrokontrolera z pinem S pamięci?

xamrex napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Chyba robie dokładnie tak jak jest napisane
Niestety nie robisz.
Przede wszystkim na początku funkcji InitSpi() należy wstępnie ustawić pin CS w stan wysoki:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Po drugie, masz w dokumentacji napisane, że pin CS musi przejść w stan NISKI PRZED ROZPOCZĘCIEM transmisji i powrócić do stanu WYSOKIEGO PO ZAKOŃCZENIU transmisji WSZYSTKICH DANYCH na nią się składających (takich jak komenda, adres, odczytywane lub zapisywane dane), czyli do odczytania statusu powinieneś mieć:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Nie dosyć, że zrobiłeś to w odwrotnej kolejności, to jeszcze w dodatku wcale nie w trakcie transmisji, która przecież rozpoczyna się wpisaniem bajtu do SPDR i kończy ustawieniem flagi SPIF po transmisji ostatniego odebranego/wysłanego bajtu.
Masz przecież w dokumentacji dokładne przebiegi i opisy, jak to powinno wyglądać. Wystarczy poświęcić trochę czasu, żeby to uważnie przeczytać, przeanalizować i zastosować ;)

EDIT:
Proponuję zwrócić uwagę również na to:
Cytuj:
5.1.2 Power-up conditions
When the power supply is turned on, VCC continuously rises from VSS to VCC. During this
time, the Chip Select (S) line is not allowed to float but should follow the VCC voltage. It is
therefore recommended to connect the S line to VCC via a suitable pull-up resistor (see
Figure 16).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 cze 2016, o 07:21 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27456
Lokalizacja: Szczecin
Pomógł: 1045

xamrex napisał(a):
        PORTB|=(1<<CS);
        _delay_ms(1);
        PORTB&=~(1<<CS);

To wprawdzie nie rozwiąże twojego problemu ale wywal stąd tego delay_ms(1) bo w książce pisałem, że to tylko tak dla przykładu - w ogóle w praktyce nie trzeba stosować tego delaya

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 cze 2016, o 07:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

ok dzięki za rady, jturo do tego siądę i dam znać jak poszło ;-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 cze 2016, o 15:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

taki kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Wyświetla 0 na wyświetlaczu ;-(

Nastomiast taki kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

wyświetla 255...127...255

Niemniej jednak wartość 127 jest niepoprawna, bowiem Status Register bit 6,5i 4 powinien wynosić 0



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 cze 2016, o 16:27 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Instrukcję PORTB |= (1<<CS); daj na początku funkcji InitSpi(), nie na końcu, bo tak jak teraz to masz niepotrzebnie krótki impuls na linii CS.

Czy dałeś rezystor pull-up na linii CS, tak jak dopisałem na końcu mojego poprzedniego posta?

xamrex napisał(a):
Wyświetla 0 na wyświetlaczu ;-(
Co nie oznacza, że jest to wartość niepoprawna.
Bity WEL i WIP są zerowane po włączeniu zasilania, natomiast bity SRWD, BP1 i BP0 są fabrycznie ustawione na 0.
Poczytaj może wreszcie trochę tę dokumentację ;)

PS. Drugi kod jest nieprawidłowy. Po wysłaniu komendy odczytu rejestru statusowego MUSISZ wysłać dodatkowy bajt, aby wartość tego rejestru znalazła się w SPDR.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2016, o 17:17 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

andrews napisał(a):
xamrex napisał(a):
Wyświetla 0 na wyświetlaczu ;-(
Co nie oznacza, że jest to wartość niepoprawna.

Masz rację,
Wartość ta jest jak najbardziej prawidłowa ;-)
Zrobiłem sobie małą funkcję WE, która wysyła instrukcję WriteEnable.


Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Funkcja ta, powoje również ustalenie się bitu1 (WEL) w rejestrze Status Register.
Teraz po odcztaniu wartości rejestru Status Register otrzymuję na wyświetlaczu wartość 2 ;-)
Czyli wszystko ok
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Teraz chciałbym w końcu zapisać coś do pamięcii EEPROM.
Stworzyłem sobie taką funkcję:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i podobną do odbioru, i chciałbym zobaczyć na wyświetlaczu wartość którą zapisałem do pamięci eeprom
#################################################################################
Tutaj cały mój kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Spodziewałem się ujrzeć 3 na wyświetlaczu, ale zamiast tego wyświetla się 255.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2016, o 17:40 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

xamrex napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Spodziewałem się ujrzeć 3 na wyświetlaczu, ale zamiast tego wyświetla się 255.

Write time = 4ms.
Podejrzewam, że Twoja funkcja lcd_locate(1,0); nie wykonuje się tak długo.
Daj jakieś opóźnienie przed odczytem lub czytaj bajt statusowy i czekaj na wyzerowanie bitu WIP.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 cze 2016, o 17:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 paź 2011
Posty: 582
Pomógł: 17

Dodanie opóźnienia pomogło ;-)
Dzięki wielkie



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO