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

[stm32] [stm32][C] SPI wysyła 0xff - problem z linią MOSI przy komunikacji z ATmega8/16

golas17 07 Lip 2011 21:21 2438 5
  • #1 9693813
    golas17
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 5
    Witam,

    Użeram się z tym już od jakiegoś czasu. Na początku myślałem, że problem leży w bibliotekach od ST, ale pozbyłem się ich i dalej ten sam problem.
    Komunikuję stm32 z atmega8 i 16. Na początku chcę po prostu przesłać jakąś daną do atmegi, a ta dana ma do mnie wrócić - wynik wyświetlam w hyperterminalu (mam skonfigurowanego usarta3). Udało mi się ustalić, że linia MISO działa poprawnie - po włączeniu zasilania na atmega do bufora nadawczego SPI zapisuje znany mi znak. Ten znak następnie odbieram w terminalu. Coś musi być z linią MOSI.
    Korzystam z SPI2. Niestety nie mogę sprawdzić komunikacji łącząc SPI2-SPI1 lub SPI2-SPI3 (SPI1 podłączone na stałe do jakiejś kości, SPI3 - tutaj mam jtag-a).
    Sprawdzałem już stany rejestrów RCC, GPIOB, CR1 i CR2 - wszystko się zgadza.
    Co dalej robić? Co sprawdzać? Co zmieniać?

    void SPI_Init()
    {
      RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;               //włącz taktowanie dla GPIOB
      //SCK AFPP, PB13
      GPIOB->CRH |= (GPIO_CRH_MODE & GPIO_CRH_MODE13);  //mode dla pin PB13:  AF output push-pull 50MHz
      GPIOB->CRH &= ~GPIO_CRH_CNF13;                    //wyzerowanie domyślnej konfiguracji pinu PB13 jako input floating
      GPIOB->CRH |= (GPIO_CRH_CNF & GPIO_CRH_CNF13_1);  //ustawienie nowej konfiguracji dla pinu PB13 jako AFPP
      //MOSI AFPP, PB15
      GPIOB->CRH |= (GPIO_CRH_MODE & GPIO_CRH_MODE15);  //mode dla pin PB15: AF output push-pull 50MHz
      GPIOB->CRH &= ~GPIO_CRH_CNF15;                    //wyzerowanie domyślnej konfiguracji pinu PB15 jako input floating
      GPIOB->CRH |= (GPIO_CRH_CNF & GPIO_CRH_CNF15_1);  //ustawienie nowej konfiguracji dla pinu PB15 jako AFPP
      //MISO IF or IPU, PB14 
      GPIOB->CRH &= ~GPIO_CRH_CNF14;                    //wyzerowanie domyślnej konfiguracji pinu PB14 jako input floating
      GPIOB->CRH |= (GPIO_CRH_CNF & GPIO_CRH_CNF14_1);  //ustawienie nowej konfiguracji dla pinu PB14 jako input pull up
      GPIOB->ODR |= (1<<14);                            //pull up pinu PB14 (podciąganie wejścia)
      //NSS, PB12
      GPIOB->CRH |= (GPIO_CRH_MODE & GPIO_CRH_MODE12);  //mode dla pin PB12: output push-pull 50MHz
      GPIOB->CRH &= ~GPIO_CRH_CNF12;                    //wyzerowanie domyślnej konfiguracji pinu PB12 jako input floating; otrzymujemy konfigurację dla gpio push pull
      GPIOB->ODR |= ((uint32_t)1<<12);                  //ustawiony 
    
      //konfiguracja SPI
      RCC->APB1ENR |= RCC_APB1ENR_SPI2EN;               //włącz taktowanie dla SPI2
      SPI2->CR1=0;
      SPI2->CR2=0;
      SPI2->CR1 |= SPI_CR1_BR;                          //SPI2_CLK/256, 
      SPI2->CR1 |= SPI_CR1_CPHA;                        //CPOL=0, CPHA=1
      SPI2->CR1 &= ~SPI_CR1_DFF;                        //8-bit danych
      //SPI2->CR2 |= SPI_CR2_SSOE;                        //SS output enable
      SPI2->CR1 |= SPI_CR1_SSI | SPI_CR1_SSM;
      SPI2->CR1 |= SPI_CR1_MSTR | SPI_CR1_SPE;          //master mode, spi enable
    }
    
    uint8_t SPI_SendData(uint8_t data)
    {
      GPIOB->ODR &= ~((uint32_t)1<<12);
      SPI2->DR = data;
      while( !(SPI2->SR & SPI_SR_TXE) );
      while( !(SPI2->SR & SPI_SR_RXNE) );
      GPIOB->ODR |= ((uint32_t)1<<12);
      return SPI2->DR;
    }


    Funkcja wysyłająca dane służy też do odbioru danych.
    Czy możliwe jest, że uszkodziłem linię MOSI poprzez podłączenie jej do linii 5V MOSI atmegi? Być może poprzedni właściciel płytki z której korzystam uszkodził ten pin? Bo to chyba nie jest normalne, że wysyłam same jedynki...
  • #2 9694253
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Jeśli podejrzewasz uszkodzenie pinu, to ustaw go na wyjście i spróbuj pozmieniać jego stan.

    Sprawdź też zawartość rejestru SR, może SPI zgłasza jakiś błąd.

    4\/3!!
  • #3 9694621
    golas17
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 5
    Wygląda na to, że pin uległ uszkodzeniu. Ustawiony jako wyjście w ogóle nie reaguje. Napięcie na tym pinie wynosi ciągle 4.7V, niezależnie od stanu rejestru ODR. Co ciekawe jako wejście działa poprawnie... Dziękuję za dobrą radę.
  • #4 9695395
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Nawet jak odepniesz od tego pinu wszystko?
  • #5 9695411
    gaskoin
    Poziom 38  
    Posty: 4159
    Pomógł: 436
    Ocena: 102
    golas17 napisał:
    Wygląda na to, że pin uległ uszkodzeniu. Ustawiony jako wyjście w ogóle nie reaguje. Napięcie na tym pinie wynosi ciągle 4.7V, niezależnie od stanu rejestru ODR. Co ciekawe jako wejście działa poprawnie... Dziękuję za dobrą radę.


    Dziwne, przecież STM ma zasilanie ~3,3V więc jak 4,7 może mieć na wyjściu ?
    SPI2 są FT więc nie przeszkadza im podłączenie pod 5V.
  • #6 9695560
    golas17
    Poziom 16  
    Posty: 271
    Pomógł: 2
    Ocena: 5
    Odpiąłem od tego pinu wszystko i mierzyłem napięcie zmieniając rejestr ODR. Sam nie wiem dlaczego takie wysokie napięcie...
    Zamieszczam schemat płytki, którą posiadam [STM32F103VET]. Z schematu jednoznacznie wynika, że nie powinno tam być takiego napięcia...
    Link
REKLAMA