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



Teraz jest 28 mar 2024, o 09:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 20 maja 2018, o 13:18 
Offline
Nowy

Dołączył(a): 21 kwi 2018
Posty: 4
Pomógł: 0

Dzień dobry,
Od dłuższego czasu walczę z magistralą TWI na Atmedze8. Odbieranie/wysyłanie bajtu między dwoma uC działa poprawnie, jednak problemy zaczynają się kiedy próbuję odebrać bufor ze slave'a. Cały program zawiesza się w momencie kiedy master oczekuje odebrania danych ze slave'a w funkcji TWI_read_buf. Dokładnie w tej linijce:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Próbowałem temat ugryźć na wiele sposobów ale bez rezultatu. Nie mam już pomysłu gdzie robię błąd, dlatego proszę Was o pomoc w rozwiązaniu problemu.

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



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


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


Dla slave'a:
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: 20 maja 2018, o 16:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

W kodzie dla slave-a jest funkcja której wogule nie ma w plikach:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 1 minucie ]

a ok zapomniałeś ją wrzucić do pliku h biblioteki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2018, o 17:03 
Offline
Nowy

Dołączył(a): 21 kwi 2018
Posty: 4
Pomógł: 0

Faktycznie, zapomniałem ją tam wrzucić. Problem jednak dalej aktualny.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2018, o 21:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

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

Ponieważ w rejestrze TWCR nie ustawiasz bitu TWEA, slave zwraca status code=0xC8, a twoja pętla while czeka cały czas na kod 0xB8 (ukryty pod makrem TW_ST_DATA_ACK), tak więc jak zmodyfikujesz funkcję do takiej postaci:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Slave wyśle wszystkie 8 bajtów z bufora. Niestety na tym zakończy i już więcej nic nie wyśle bo znów ugrzęźnie w tej samej pętli while która nadal czeka na status code=0xB8, a przecież gdy master odbierze ósmy bajt wysyła NACK czyli moduł TWI slave zwróci status code=0xC0.
Musiałbyś do warunku pętli while dodać drugi jako sumę logiczną z drugim status codem, lub też wogule zrezygnować ze sprawdzania tych kodów, a jako koniec operacji wysyłania sprawdzać czy bit TWINT został ustawiony na 1.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 maja 2018, o 22:19 
Offline
Nowy

Dołączył(a): 21 kwi 2018
Posty: 4
Pomógł: 0

Tak, to było to! Ogromnie dziękuję za pomoc! :) Jeszcze dopytam przy okazji. Slave się 'odblokował' i wysyła bufor tylko, że z niewiadomych przyczyn ciągle jego pierwszy indeks. Zamieniłem funkcję TWI_write_slave_buf na tą analogiczną do poradnika p.Mirka ale dalej to samo. Co może być tego przyczyną?
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: 21 maja 2018, o 17:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

Hym... na to pytanie to chyba będzie mi ciężko odpowiedzieć bo u mnie po modyfikacji funkcji TWI_write_slave(uint8_t data) do postaci:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

cały bufor leci do mastera we właściwej formie czyli w terminalu master cyklicznie wypluwa ciąg 12345678.
Nie wiem, może masz coś nie tak w samej bibliotece UART-a, bo tej nie wrzuciłeś więc nie jestem w stanie powiedzieć dla czego u mnie to działa a u Ciebie nie. Ja podłączyłem bibliotekę do UARTA mirkową z BB. Wprowadziłem kilka koniecznych zmian tak by owa biblioteka działała poprawnie, reszta kodu jest żywcem przerzucona ze źródeł które wrzuciłeś, z modyfikacją jedynie funkcji TWI_write_slave.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 maja 2018, o 18:39 
Offline
Nowy

Dołączył(a): 21 kwi 2018
Posty: 4
Pomógł: 0

Po dodaniu delaya do funkcji write_slave problem zniknął :) Bardzo dziękuje za pomoc! ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 maja 2018, o 17:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

igsor96 napisał(a):
Po dodaniu delaya do funkcji write_slave problem zniknął
Powiem tak - jeśli dodałeś tego delaya i problem zniknął to masz coś nie tak (przypuszczam że z warunkiem w while).
Sekcję
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

dodałem tylko po to by podejrzeć jakie wartości status code zwraca TWI SLAVE-a, delay był tu konieczny i oszacowany na "bezpieczne oko" tak by operacja wysyłki tego kodu po UART była już na pewno po operacji wysłania bajtu po TWI.
W czasie normalnej pracy modułu TWI właściwy czas oczekiwania załatwia właśnie pętla while która zatrzymuje działanie programu do czasu pojawienia się właściwego status code co jest równoznaczne z zakończeniem operacji wysyłania bajtu przez moduł TWI.
U mnie program działa również po usunięciu delaya i funkcji uart_putint.

A tak wogule to nie wiem czy twoje podejście do TWI SLAVE jest właściwe. Widzisz moduł SLAVE powinien wykonywać polecenia MASTER-a. Więc budowanie funkcji która wysyła zdefiniowaną ilość bajtów nie do końca jest trafione.
Funkcja powinna cały czas wysyłać kolejne dane jeśli MASTER po odbiorze bajtu wystawia ACK, informując SLAVE że chce odczytywać kolejne bajty; a przerwać funkcję w momencie wysłania przez MASTER NACK. Przynajmniej tak to robią wszelakie moduły pracujące na magistrali TWI w roli SLAVE-a. Takie jest moje zdanie - choć niekoniecznie musi być słuszne ;)



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: 8 ] 

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