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 - Obsługa ADC na SPI

kornik280 23 Cze 2015 21:34 558 2
  • #1 23 Cze 2015 21:34
    kornik280
    Poziom 18  

    Witam,

    Mam STM32F103 i MCP3202. Próbuje nawiązać komunikacje bezskutecznie.

    Kofiguracja:


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przerwanie, i wysyłanie:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    Pin CS mam na stałe do masy. Gdy dochodzę do ReadADC(), program wisi na instrukcji while(SPI_InUse){}; Flaga ta jest zwalniana w przerwaniu.
    Jednak do przerwania nigdy nie wchodzi, dlaczego? Po instrukcji SPI_Cmd(SPI1, ENABLE); powinien wejść do IRQ?

    0 2
  • #2 24 Cze 2015 10:33
    Marek_Skalski
    Moderator Projektowanie

    0. Używając SPL sam prosisz o problemy.
    1. SPI_Cmd(SPI1, DISABLE); Jeżeli to ma włączyć SPI, to chyba powinno być ENABLE?
    2. Dla SCK i MISO ustawiasz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; Który układ generuje zegar? A dla MISO powinien być pull-up.
    3. !CS nie może być na stałe do masy. Po pierwsze operacje są synchronizowane sygnałem !CS, po drugie nawet przypadkowy peak na linii zegara może trwale rozwalić całą transmisję. Musisz obsługiwać !CS w programie.
    4. W obsłudze SysTick'a ustawiasz wartość SPI_InUse = 0x11; a później sprawdzasz czy jest <>0 (while(SPI_InUse){};) Nic dziwnego, że tam wisi. Zamiast tego SPI_InUse sprawdzaj odpowiednie bity statusowe modułu SPI.
    5. Zmienna byte jest inicjowana na 0x06, później jest ustawiany bit 0 (|= 0x1;), a w końcu jest nadpisywana wartością ch<<6. Gdybyś podał typ ADC, to byłaby szansa sprawdzić czy to są prawidłowe informacje. W kolejnym przejściu funkcji odczytu, do TxBuf[0] załadujesz wartość ((ch<<6) |= 0x1), a do TxBuf[1] załadujesz (ch<<6). Czy tak ma być?
    To tyle na dobry początek ;)

    0
  • #3 24 Cze 2015 10:56
    kornik280
    Poziom 18  

    0. Na razie chce uruchomić na SPL bo to dużo prostsze.
    1. Jest enable zaraz przed while(SPI_InUse){}; (Szkoda że nie ma numerowania linijek było by prościej)
    2.Poprawie to MISO. Nie bardzo rozumie z tym zegarem?
    3.Poprawie.
    4.W obsłudze SystTick nie ustawiam SPI_InUse=0x11, robie to w funkcji ReadADC()
    i powysłaniu czekam aż wprzerwaniu ustawi się na 0. Faktycznie może lepiej jest sprawdzać bit statusowy od SPI.
    5.Na razie to nie ma znaczenia bo SPI nic nie wysyła. Napisałem typ ADC (MCP3202)

    Dzięki, porawie błędy i zobacze czy działa

    0