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



Teraz jest 19 lut 2025, o 14:05


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 24 sty 2015, o 20:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lut 2013
Posty: 126
Lokalizacja: Turbia
Pomógł: 0

Witam wszystkich, jako że nie widzę na forum działu dla PIC'ów napiszę w tym temacie :)

Od kilkunastu dni, jak pewnie niektórzy z czatu wiedzą walczę z komunikacją PIC32MX250F128B za pomocą SPI z ekspanderem MCP23S17. Wreszcie udało mi się zmusić go do jakiejkolwiek reakcji na przesyłane dane. Wysyłałem mu rozkaz ustawienia wszystkich portów jako wyjścia w stanie 1.
Ekspander ustawia 1 ale tylko na niektórych pinach co mnie nieźle zaskoczyło i całkiem zbiło z tropu... Mógłby ktoś bardziej doświadczony rzucić okiem i podpowiedzieć gdzie zrobiłem błąd? Procek pracuje na 40MHz.

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


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


Funkcja setup_MCP23S17() jest umieszczona przed pętlą while w pliku main i wykonuje się tylko raz. Ekspander reaguje ale nie rozumiem dlaczego nie tak jak mu kazałem.

Pozdrawiam Dexter

_________________
Zestaw ATB 1.04
Niebieska książka
Zielona książka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sty 2015, o 20:59 
Offline
Użytkownik

Dołączył(a): 04 paź 2011
Posty: 8605
Pomógł: 337

https://gitorious.org/pic32mx/tft/sourc ... 3S17defs.h
zobacz to

_________________
Zbuduj swój system [url=https://helion.pl/ksiazki/w-labiryncie-iot-budowanie-urzadzen-z-wykorzystaniem-ukladow-esp8266-i-esp32-andrzej-gromczynski,wlablo.htm#format/d]IOT[/url]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sty 2015, o 22:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lut 2013
Posty: 126
Lokalizacja: Turbia
Pomógł: 0

Doszukałem się co jest nie tak dzięki analizie oscyloskopem tego co leci po SPI.

Okazało się że procek automatycznie nie dzieli transmisji na poszczególne tylko wysyła wszystko jak leci przy jednym stanie na pinie CS.
Czyli dla
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


wystawia stan niski na CS i śle wszystko a powinien za każdym razem gdy wchodzi do wysyłania przemiatać pinem CS.

Teraz pytanie czy da się to jakoś zrobić sprzętowo? Bo nie uśmiecha mi się przemiatanie tym pinem programowo gdy transmisja jest sprzętowa.

_________________
Zestaw ATB 1.04
Niebieska książka
Zielona książka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sty 2015, o 22:45 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

dexter napisał(a):
Teraz pytanie czy da się to jakoś zrobić sprzętowo?

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

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sty 2015, o 22:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lut 2013
Posty: 126
Lokalizacja: Turbia
Pomógł: 0

Niestety włączenie tego narobiło jeszcze większego bałaganu, teraz procek przemiata CS co kilka bitów.

W moim kodzie zmienia stan CS na niski tylko na początku transmisji i przywraca stan wysoki po zakończeniu bez względu na to ile danych wysyłam. Powinien zmieniać stan CS za każdym razem gdy chcę wysłać nowe dane.

_________________
Zestaw ATB 1.04
Niebieska książka
Zielona książka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 sty 2015, o 23:12 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

To zmień długość na 32 i wysyłaj jeszcze 4 bajt taki jak 3:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

bo wydaje mi się że nie można tam wstawić 24 bity

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 17:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lut 2013
Posty: 126
Lokalizacja: Turbia
Pomógł: 0

Zmiana na 32 bajty powoduje tylko wydłużenie transmisji, niestety pin CS jest w stanie niskim przez całą transmisję więc ekspander nie reaguje.

Dziwne jest to że bez względu na to ile danych wysyłam, sygnał CS generowany jest po 1 bajcie a dalej pozostaje niski do końca transmisji.
Próbowałem pozmieniać ustawienia ramki według noty tak żeby mikrokontroler generował sygnał synchronizacji po każdym bajcie i trwający przez cały bajt ale procek w ogóle nie reaguje na takie ustawienia.

Albo ja coś robię nie tak albo działa tu jakaś kosmiczna upierdliwa energia...

_________________
Zestaw ATB 1.04
Niebieska książka
Zielona książka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 19:42 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Pozostaje samemu sterować CS. Nie ma aż tak dużo roboty. Tylko:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 19:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lut 2013
Posty: 126
Lokalizacja: Turbia
Pomógł: 0

Też o tym pomyślałem i napisałem dokładnie taką samą funkcję tylko że też nie działa. Pin CS jest przemiatany tak jak sie spodziewałem ale w trakcie transmisji, tzn. procek wysyła dłużej dane niż siedzi w tej funkcji.

Objawia się to przemiataniem pinu CS ale zupełnie niezgodnie z tym co aktualnie wysyła SPI, pomogło dodanie oczekiwania po każdym putcSPI1 aż transmisja się zakończy. To działa świetnie ale wtedy pada USB bo procek oczekuje przy SPI.

Jedyny sposób to pełna sprzętowa obsługa transmisji

_________________
Zestaw ATB 1.04
Niebieska książka
Zielona książka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 20:24 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

dexter napisał(a):
Dziwne jest to że bez względu na to ile danych wysyłam, sygnał CS generowany jest po 1 bajcie a dalej pozostaje niski do końca transmisji.

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

Jest jeszcze taki bit FRMSYPW:
Cytuj:
FRMSYPW: Frame Sync Pulse Width bit
1 = Frame sync pulse is one character wide
0 = Frame sync pulse is one clock wide

Nie mam po ręką tych funkcji więc napiszę tak:
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 pikosekundzie ]

Cytuj:
procek wysyła dłużej dane niż siedzi w tej funkcji.

No rzeczywiście tak jest. Zapomniałem o tym. Można by w przerwaniu po zakończeniu wysyłania ustawiać ten pin, ale to będzie działać tylko jak wysyłasz raz na jakiś czas jedną ramkę. Podczas startowej konfiguracji robisz to 3 razy i tam należałoby czekać co można zrobić bo to wykonuje się raz przy starcie.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 20:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lut 2013
Posty: 126
Lokalizacja: Turbia
Pomógł: 0

Ustawienie tego bitu FRMSYPW nie powoduje żadnych zmian, próbowałem ustawić ramkę z aktywnym stanem LOW, generowaną po każdej wysłanej danej do tego trwającą przez całą wysyłaną daną i nic to nie dało... Impuls generuje sie na oko po pierwszym bajcie a potem jest ciągle zero do końca transmsji.

Co do oczekiwania to na początku nie robi to żadnego problemu bo setup jest wykonywany tylko raz gorzej później gdy muszę ustawić jakieś wyjścia albo w przerwaniu odczytać wejścia. Tu już nie może być oczekiwania.

Kombinuję jeszcze nad funkcją która pobierałaby po jednym bacie ze zmiennej bufor_spi następnie blokowała się aż do wysłania tego bajtu po czym po zakończeniu nadawania pobierałaby kolejny bajt i tak w koło macieju do opróżnienia bufora. Nie wiem tylko jak zachowa się program jeśli w czasie wysyłania wystąpi jakieś zdarzenie i powrót do pobrania kolejnego bajtu zajmie prockowi troche wiecej czasu. Wtedy odstęp np. w połowie ramki będzie dłuższy i prawie losowy. Obawiam się że ekspander tego nie przyjmie. No ale próba nie strzelba :P

_________________
Zestaw ATB 1.04
Niebieska książka
Zielona książka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 20:58 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Napisz tą funkcję w oparciu o przerwania. Jedne od przesunięcia danych z rejestru SPIxBUF do SPIxSR dla pierwszych 2 bajtów i od wysunięcia w świat wszystkich bitów z SPIxSR dla 3 bajtu. Potrzebna będzie jakaś zmienna licząca bajty.
W takim układzie pierwsze przerwania zapewnią wysyłanie 3 bajtów bez zwłoki, a 3 zwolnienie CS.

_________________
Dragonus Cracovus: Biomagia



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

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