Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[stm32][c/Eclipse-OOCD] SPI1 - dziwne zachowanie peryferiów

yooz 23 Lut 2012 11:24 1231 2
  • #1 23 Lut 2012 11:24
    yooz
    Poziom 10  

    Witam!

    Walczę już od jakiegoś czasu z dziwnym problemem. Otóż: kiedy inicjalizuję piny odpowiedzialne za SPI1 jako normalne wejścia wyjścia (PA3, PA4, PA5, PA7 jako Output Push-Pull max 50MHz; PA6 jako Floating Input) bez problemu komunikuję się z urządzeniem slave (w tym wypadku panel LCD). PA3 i PA4 to dwie linie CS (bez żadnych pullupów). Przebiegi podglądam oscyloskopem, wszystko ładnie wygląda, timing ok, stan niski 0V, stan wysoki 3,3V. Natomiast kiedy uruchomię SPI1 na tych pinach (bez remapu), to dzieją się dziwne rzeczy - jedna z linii (SCK lub MOSI) w stanie niskim pokazuje ok. 1.3V, w stanie wysokim normalnie - 3.3V. Dodam, że po drodze do slave'a jest jeszcze konwerter poziomów 3.3V - 5V (KAmodLVC), ale to na pewno nie jego wina, bo jeżeli macham pinami ręcznie, to wszystko działa. Co mnie jeszcze zastanawia to to, że jeżeli odłączę panel od złącza za konwerterem, to oscyloskop pokazuje poprawne przebiegi SPI (schodzą do 0V). Skończyły mi się pomysły, myślałem że może coś źle inicjalizuję itp, ale przekopałem kilkadziesiąt tematów u nas i za granicą i wszystko wygląda dobrze. Stąd ten post z prośbą o pomoc.

    Moje środowisko to (za tutorialem Freddiego Chopina):
    - Eclipse 20100617-1415 Helios
    - ARM EABI C/C++
    - OpenOCD 0.5.0
    - JTAG Andtech (FT2232)

    Płytka na której siedzi STM32F103VE to MMstm32F103Vx firmy Propox.

    Żeby było łatwiej zrozumieć kod: kiedy macham ręcznie, to korzystam z funkcji spi1_test_init() i później odkomentowuję część kodu w funkcji spi_test_sending().
    Kiedy chcę użyć SPI1 jako peryferium wbudowanego to używam spi_init_master() i odkomentowuję inną część kodu w spi_test_sending().

    Najważniejsze wycinki z kodu:

    main.c:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    tutaj jeszcze inicjalizacja SPI1 z osobnego pliku (jeśli korzystam z peryferium):

    Kod: c
    Zaloguj się, aby zobaczyć kod


    funkcja spi_check_regs() odczytuje mi wartości SPI->CR1, CR2 oraz SR do swoich zmiennych lokalnych (pomoc w debugowaniu).

    a tutaj funkcja spi_test_sending() z main.c:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Urządzenie slave wymaga, żeby między każdym bajtem była przerwa min 80us i w tym czasie CS był wysoki - co widać w kodzie.

    Tutaj jeszcze dwie funkcje: wspólne dla obu przypadków sterowanie pinem CS (GPIO), oraz wysyłanie z którego korzysta peryferyjne SPI:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeżeli ktoś z kolegów przebrnie przez kod i ma pomysł dlaczego mogą powstawać objawy, które opisałem wyżej, proszę o podpowiedź.

    Pozdrawiam

    yooz

    0 2
  • #2 23 Lut 2012 11:31
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Ja jak widzę tego typu rzeczy:
    SPIx->CR2 = 0x0004;
    D7_CR = ((D7_CR & 0x0F0F0FFF) | 0x10101000);
    to niestety nie mam żadnych pomysłów...

    4\/3!!

    0
  • #3 23 Lut 2012 12:44
    yooz
    Poziom 10  

    SPIx->CR2 = 0x0004 to to samo co SPI_CR2_SSOE, wychodzi na to samo.

    D7_CR to nieistotne, to jest GPIOD->CRH, zupełnie inna rzecz, nota bene niepodłączona.

    Rozumiem, że styl pisania nie odpowiada, jest to trochę tymczasowe, na kosmetykę przyjdzie czas później, najpierw chciałbym to w ogóle odpalić...

    Przez pomoc z waszej strony rozumiem bardziej analizę inicjalizacji, czy wszystko jest w dobrej kolejności, czy gdzieś coś jest nie tak włączane / czegoś jeszcze nie ma oraz ew. czy ktoś może się zetknął z tego typu dziwnymi poziomami napięć lub dziwnym działaniem.

    Zastanowiło mnie jedno: ze strony 84 dokumentu nr 15274 STM32F103xCxDxE Datasheet, tabela 46. wpis VOL = max 1.3V przy prądzie Iio = +20mA.
    Czy to nie wygląda na jakieś zwarcie w układzie, gdzie peryferia chcą dać stan niski, a coś je podciąga... No ale jeśli robię komunikację ręcznie z pinami jako GPIO, to już się to nie dzieje, wszystko śmiga... No nic, czekam dalej.

    0