logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

STM32F4 - SPI1->DR dziwnie się zachowuje, SPI nie nadaje

NCinek 24 Wrz 2012 00:30 2181 6
REKLAMA
  • #1 11342321
    NCinek
    Poziom 10  
    Posty: 18
    Witam,

    na forum znalazłem kilka tematów z problemami podobnymi do moich, ale w żadnym nie znalazłem rozwiązania.

    Mam zamiar skomunikować STM32F4 z układem nrf2401. Chcę użyć do tego SPI1 na pinach PA[5..7]. Konfiguracja SPI wygląda następująco

    
    RCC -> APB2ENR |= RCC_APB2ENR_SPI1EN; //zegar SPI1
    RCC -> AHB1ENR |= RCC_AHB1ENR_GPIOAEN; //zegar GPIOA
    GPIOA -> MODER |= GPIO_MODER_MODER1_0|GPIO_MODER_MODER2_0|GPIO_MODER_MODER3_0|GPIO_MODER_MODER5_1|GPIO_MODER_MODER7_1|GPIO_MODER_MODER6_1; PA[5..7] w AF, reszta wyjścia
    
    GPIOA -> AFR[0] |= 5<<28 | 5<<24 | 5<<20; // PA[5..7] AF
    SPI1 -> CR1 |= SPI_CR1_SSM | SPI_CR1_SSI | SPI_CR1_MSTR; 
    SPI1 -> CR1 |= SPI_CR1_SPE; //SPI EN
    
    


    Następnie próbuję wysłać daną 0xAA:

    
    void NRF2401_Init_As_TX(void)
    {
      int i,a;
      
      PWR_UP_HIGH;    //pwr_up on
      my_delay(1000);
      CE_LOW;  //CE off
      my_delay(1000);
      CS_HIGH;    //CS on
      my_delay(1000);
      
          for(i=15;i>=0;i--)        
          {
            while(!(SPI1 -> SR & (1<<1)));   // Wait for SPI1 Tx buffer empty
      		SPI1 -> DR = 0xAA;
                    //SPI1 -> DR =  NRF2401_CONF_TX[i];     //przeslanie 120 bitow konfiguracyjnych
    		
    
    


    W tym momencie w rejestrze SPI1->DR pojawia się wartość 0x000000FE. Flaga TXE dały czas ustawiona (bufor pusty). Po wpisaniu do DR kolejnej danej do wysłania ustawia się flaga OVF. I to by było na tyle.. Na pinach nie pojawiają się żadne wysokie stany, same zera na MISO, MOSI i SCK... Sprzętowo jest ok, żadnych przywarć do masy.

    Może ktoś zna rozwiązanie problemu, może czegoś nie dopatrzyłem bardzo proszę o pomoc.
  • REKLAMA
  • #2 11342439
    Piotr Piechota
    Poziom 22  
    Posty: 519
    Pomógł: 55
    Ocena: 85
    Z jaką częstotliwością zaplanowałeś transmisję? W tej chwili masz PCLK/2 a to sporo.
  • REKLAMA
  • #3 11342455
    NCinek
    Poziom 10  
    Posty: 18
    Z początku miałem clk/64 i tak by w sumie wystarczyło. To co zostało clk/2 to efekt prób. Na każdej częstotliwości uC zachowuje się tak samo.

    Edit:
    Jeszcze raz dla pewności sprawdziłem z Fpckl/8, niestety bez zmian. Teraz próbuję wpisać do rejestru DR kolejno trzy wartości, następnie odczytać rejestr. Wartość z rejestru odczytana przez debugger w komentarzach:

    
    while(!(SPI1 -> SR & (1<<1)));  // Wait for SPI1 Tx buffer empty
      		SPI1 -> DR = 0x0F;          //w DR pojawia się 0x0000000E
            while(!(SPI1 -> SR & (1<<1)));
      		SPI1 -> DR = 0x0A;          //w DR 0x0000000F
            while(!(SPI1 -> SR & (1<<1)));
      		SPI1 -> DR = 0x05;	    //w DR 0x0000000F	  
            while(!(SPI1 -> SR & (1<<1)));
    		SPI1 -> DR;	                    //w DR 0x00000007
    


    Bzdury jakieś..
  • REKLAMA
  • #4 11342478
    Piotr Piechota
    Poziom 22  
    Posty: 519
    Pomógł: 55
    Ocena: 85
    W moim programie mam tak i działa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 11342501
    NCinek
    Poziom 10  
    Posty: 18
    No ok, wkleiłem bezczelnie Twój kawałek kodu, tylko zmieniłem na SPI1. Kod wykonuje się dwa razy. Za pierwszym razem gry wpisuję bajt 0xA5 w rejestrze pojawia się 0x000000FE, za drugim 0x000000FF..

    Dzięki za zainteresowanie Piotrze :)
  • #6 11342513
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    Nie możesz przecież tych wartości odczytać z rejestru DR... Poczytaj sobie w RM jak to działa zanim zaczniesz to oprogramowywać.

    Podłącz to do czegoś i zobacz czy działa, w debugu tego typu transmisje nigdy "nie będą działały"
  • REKLAMA
  • #7 11342688
    NCinek
    Poziom 10  
    Posty: 18
    No tak, ale czy debugger po prostu odczytuje błędną wartość, czy poprzez odczyt już zmienia rejestr DR? Bo zwykły odczyt rejestru w programie powinien z tego co wiem wyzerować rejestr, a tak się nie dzieje.

    Edit:
    No tak, ale czy rejestr jest pusty w debugu też nie sprawdzę... Tak czy siak w debugu czy mie w debugu śladu komunikacji na liniach MISO, MOSI i SCK nie widać...

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik ma problem z komunikacją między STM32F4 a układem nRF2401 za pomocą SPI1. Konfiguracja SPI została przedstawiona, jednak podczas wysyłania danych do rejestru DR występują nieprawidłowe odczyty. Użytkownik testował różne częstotliwości zegara, ale problem nadal występuje. Inni uczestnicy dyskusji sugerują, że odczyt rejestru DR w debuggerze może nie być wiarygodny, a także zalecają podłączenie urządzenia do rzeczywistego testu komunikacji. Wskazano również na konieczność zapoznania się z dokumentacją techniczną (RM) przed dalszym programowaniem.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA