Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Kategoria: Kamery IP / Alarmy / Automatyka Bram
Montersi
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32 F411RE Nucleo] Obsługa SPI i programowanie pada PlayStation2

cuando123 19 Maj 2017 15:38 1062 8
  • #1 19 Maj 2017 15:38
    cuando123
    Poziom 6  

    Witam serdecznie. Od kilku dni walczę z problemem uzyskania prawidłowych odpowiedzi od PAD'a PS2 na STM32F411RE nucleo.
    Wykorzystuję do tego SPI oraz USART w celu odbierania komunikatów.
    Częstotliwość zegara mam ustawioną na 8MHz, w konfiguracji SPI prescaler 64 co daje mi 125KHz (lub KBits/s).
    Pierwszy bit pobierany jest od LSB, paramert CPOL na 1 oraz CPHA na 2. NSS sterowany oprogramowaniem, ustawiony na wyjście GPIO (pin PA4-CS). Wykorzystuję piny PA5 jako SCK(clock) PA6-MISO, PA7-MOSI. SPI mam ustawione w trybie Full-Duplex Master. (USART asynchroniczny i 9600Bits/s ale to tylko do odbierania komunikatów na PC).
    Dodam że mikrokontroler operuje na bibliotece HAL.
    W pliku main.c:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    CS_LOW - ustawia mi linię "attetion" na stan 0 zaś CS_HIGH na stan 1.

    Funkcja wysyłająca komendę i zwracająca dane po SPI(MISO-MOSI):
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Funkcja wysyłająca ciąg bajtów:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W mainie:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Po wysłaniu informacji: 0x01 0x42 0x00 0x00 0x00 powinienem otrzymać 0xFF 0x41 0x5A 0xFF 0xFF w przypadku kiedy żaden przycisk nie jest wciśnięty. Na 3 i 4 bajcie powinny pojawiać się informacje odnośnie wciśniętych klawiszy natomiast ja otrzymuję takie wartości:
    65, 255, 255, 255, 255 czyli 0x41 0xFF 0xFF 0xFF 0xFF. Co dziwne jakby drugi wysłany bajt odpowiadał pierwszemu odebranemu. Dodatkową kwestią jest to że w przypadku naciśnięcia klawisza "mode" wartość 65 zmienia się na 115 (0x73), inne nadal pozostają bez zmian.
    Podaję linki do stron pomocniczych:
    PlayStation 2 Controller Interface
    Interfacing a PS2 (PlayStation 2) Controller
    PlayStation 2 Arduino
    Jeszcze dodam że dokładnie to ten PAD:
    Link
    Może ktoś wpadnie na jakiś pomysł. Bardzo proszę o pomoc.

  • #3 20 Maj 2017 01:55
    cuando123
    Poziom 6  

    Poprawiłem, dodałem funkcję:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Włączyłem obsługę TIM3 o podanych parametrach: Prescaler:7, CounterMode: UP, Period: 60000, ClockDivision: 0.
    Wywołałem tą funkcję odpowiednio zamiast HAL_Delay(), opóźnienia działają ale problem nadal taki sam.

  • #5 20 Maj 2017 17:35
    cuando123
    Poziom 6  

    Okazało się że wujek ma oryginalne PS2, pojechałem, sprawdziłem. Pad jest sprawny, działa bez problemu.
    Zastanawiają mnie te 2 linijki, które ktoś wpisał na STM32F4 Discovery:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Próbowałem w taki sposób:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    ale niestety bez skutku, wtedy nic się nie dzieje i nic mi się nie wyświetla.
    PS: cały problem w tym że właśnie nie posiadam analizatora.

  • #6 20 Maj 2017 19:23
    Piotrus_999
    Poziom 39  

    cuando123 napisał:
    PS: cały problem w tym że właśnie nie posiadam analizatora.
    Warto kupić nawet taki za 30-40zł na alim. w 99% wypadków wystarczy, a ile czasu i frustracji zaoszczędzi

    Dodano po 1 [godziny] 40 [minuty]:

    Ps zmieniaj cs przy każdym bajcie.

  • #7 21 Maj 2017 13:42
    cuando123
    Poziom 6  

    W taki sposób?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Tak się nawet pad nie łączy z odbiornikiem.

  • #9 22 Maj 2017 17:50
    cuando123
    Poziom 6  

    Problem rozwiązany. Wszystko było ok tylko nie miałem odpalonego CLK, w sensie niby było wszystko uruchomione dla SPI w CubeMX ale musiałem ręcznie dopisać odpalenie CLK przez GPIO i zadziałało.

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME