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



Teraz jest 25 lut 2025, o 12:27


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 2 maja 2015, o 22:40 
Offline
Nowy

Dołączył(a): 27 kwi 2015
Posty: 8
Pomógł: 0

Cześć, jako że jestem całkowicie początkującym programistą procesorów AVR mam do was pytanie odnośnie przesyłania danych 32bitowych przez SPI. Problem wynika z tego że mam do obsłużenia urządzenie (AD7280A) które akceptuje ramki 32bitowych danych, a jak wiemy rejestr danych SPI w ATmega128 jest 8 bitowy. W datasheecie wspomnianego urządzenia wyczytałem że mogę składać ramkę 32bitową z ramek 8 bitowych nie ustawiając sygnału CS pomiędzy ramkami, mam z tym trochę problem, bo w C jawnie nie obsługuje się linii CS. Mam taki kod:

Listing źle wstawiony - Różowo-zielony J.


Teraz nie mam dostępu do oscyloskopu i nie mam jak zobaczyć co jest na linii CS pomiędzy 8bitowymi ramkami, dlatego chciałem was zapytać czy coś takiego ma prawo działać? Pytam dlatego że siedzę już nad tym już dłuższy czas i nie bardzo wiem co się dzieje. Występują dwa dziwne zjawiska. Pierwsze jest takie że po wysłaniu każdej 8bitowej ramki program przechodzi mi do przerwania:


Druga jest taka że po tych 32bitach powinien mi odpowiedzieć czymś sensownym, a we wspomnianym przerwaniu dostaję same zera. Mam nadzieję że pytanie nie jest zbyt początkujące, starałem się znaleźć coś sensownego w internecie ale moje poszukiwania spełzły na niczym dlatego zwracam się z prośbą do was bo już raz mi pomogliście. Proszę o jakieś sugestie, albo o jakiś odnośnik do adekwatnego artykułu albo tematu w internecie, będę wdzięczny za każdą odpowiedź. Dziękuję i życzę miłego wieczoru.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2015, o 22:47 
Offline
Użytkownik

Dołączył(a): 08 mar 2014
Posty: 398
Lokalizacja: Głogów
Pomógł: 11

A jak by tak zrobić programową obsługę SPI?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2015, o 23:23 
Offline
Nowy

Dołączył(a): 27 kwi 2015
Posty: 8
Pomógł: 0

Arek1111111111 napisał(a):
A jak by tak zrobić programową obsługę SPI?


Chyba nie rozumiem, czy mógłbyś to napisać jaśniej? Może to głupia prośba ale w końcu to dział dla całkowicie początkujących. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 maja 2015, o 00:06 

Pomógł: 0

Na początek polecam to https://www.youtube.com/watch?v=kLy20Znqi-U

Po za tym, poszukaj moich postów, już z tym też walczyłem i rozwiązanie jest w zasadzie banalne ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 3 maja 2015, o 12:20 
Offline
Użytkownik

Dołączył(a): 13 lut 2015
Posty: 99
Pomógł: 6

A co za problem 4x wysłać ramkę 8 bitową (pooling albo isr) ?
SPI to nie I2C gdzie ramkę danych trzeba poprzedzać adresem urządzenia.

_________________
AVR-UART-lib
AVR-FAST-ENCODER
RFM7x-lib



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 maja 2015, o 18:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

cześć

Napisz sobie funkcję nadrzędną która za pomocą pętli wyśle Ci te 32 bity po SPI i dopiero wtedy przełączysz pin CS jak tam sobie będziesz życzył

pozdrawiam

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 maja 2015, o 15:41 
Offline
Nowy

Dołączył(a): 27 kwi 2015
Posty: 8
Pomógł: 0

Cześć, przepraszam że tak późno odpisuję ale próbowałem z tym sam walczyć, niestety poległem i jestem nadal w tym samym miejscu. W instrukcji mojego urządzenia mam napisane "The AD7280A allows 32-bit data transfer only and resets a counter on the rising edge of CS to ensure that the AD7280A is automatically resynchronized with the DSP/microprocessor on every falling edge of CS. Individual 8-bit or 16-bit words can be used to assemble a 32-bit command, but a single 32-bit wide CS frame is required to correctly structure the assembly of the 32-bit command."

Obrazek

Moje pytanie brzmi czy muszę sam sterować tym co mam na linii CS? Podpiąłem się tam multimetrem (bo nie mam na razie oscyloskopu) i na linii nic się nie działo podczas transmisji, czy w związku z tym sam powinienem sterować linią CS? Struktura komunikacji jest prosta, mam jedno urządzenie typu master (atmega128) i urządzenie slave (AD7280a). Czy kod poniżej jest poprawny (PB0 to sygnał CS; a,b,c,d to kolejne bajty) i powinien działać według was?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2015, o 15:36 
Offline
Użytkownik

Dołączył(a): 26 lut 2014
Posty: 227
Lokalizacja: LDZ
Pomógł: 22

Tak. Sam powinieneś obsłużyć pin CS jeśli działasz jako master. Możesz użyć nawet wielu pinów MCU jako CS (w trybie master możesz tak użyć dowolnego pinu) tak byś mógł obsłużyć wiele slave-ów.
PS: W powyższym przykładzie najpierw zerujesz cały PORTB a później zerujesz znów cały PORTB poza bitem 0 (PB0).


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2015, o 12:34 
Offline
Nowy

Dołączył(a): 27 kwi 2015
Posty: 8
Pomógł: 0

Dzień dobry, dziękuję uprzejmie za wszystkie odpowiedzi. Mam dwa kolejne pytania, pierwsze: dlaczego po wysłaniu każdego bajtu danych program przechodzi mi do obsługi przerwania? Kodu obsługi mojego przerwania wygląda tak:

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


Drugie pytanie tyczy się tego samego listingu, dostaję jakieś dane od slave ale z tego co zauważyłem moja obsługa nie działa poprawnie ponieważ zwraca mi 4 takie same bajty, jak poprawnie napisać obsługę odbierania 4 bajtów danych?

Jeszcze raz dziękuję za pomoc, pierwszy raz stykam się z językiem C w programowaniu mikrokontrolerów i mam z tym sporo problemów. Dziękuję również za wyrozumiałość. Pozdrawiam Piotr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2015, o 18:40 
Offline
Użytkownik

Dołączył(a): 26 lut 2014
Posty: 227
Lokalizacja: LDZ
Pomógł: 22

Ad. 1 SPI przesyła na raz jeden bajt. I po zakończeniu transmisji przechodzi do przerwania. SPI_STC_VECT to SPI Serial Transfer Complete.
Ad. 2 Częściowo masz odpowiedź w odpowiedzi na pierwsze pytanie. Musisz tak zrobić obsługę przerwania aby w 4 kolejnych po sobie odebranych danych odpowiednio je łączył. np.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Kod pisany z głowy nietestowany i niezoptymalizowany, ale powinien działać. Błędem jest u Ciebie to, że próbujesz odebrać 4 bajty w jednym przerwaniu, a powinieneś w czterech ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2015, o 14:20 
Offline
Nowy

Dołączył(a): 27 kwi 2015
Posty: 8
Pomógł: 0

Udało mi się do tego dojść samemu, ale dziękuję za odpowiedź, temat uważam za zamknięty (za odpowiedzi które rzeczywiście wniosły coś do dyskusji wystawiłem pochwały). Pozdrawiam Piotr.



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 0 gości


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