[SPI]Odczyt danych

Tu możesz pisać o swoich problemach z pisaniem programów w języku C/C++ dla STM.
Awatar użytkownika
Marcin
User
User
Posty: 191
Rejestracja: środa 09 wrz 2015, 19:30

[SPI]Odczyt danych

Postautor: Marcin » niedziela 05 maja 2019, 13:00

Witam

Mam problem z odczytem danych po SPI w STM32, funkcja zwracająca dane zwraca mi 0xFF choć sprawdziłem analizatorem i wiem że dane przychodzą prawidłowe i różne od 0xFF. Odbiór danych realizuję funkcją

Kod: Zaznacz cały

uint8_t SPI_SEND_READ_CHAR(SPI_TypeDef *SPIx, char data)
{
   while(!(SPIx->SR & SPI_SR_TXE));
   *(volatile uint8_t *)&SPIx->DR = data;
   
   while(!(SPIx->SR & SPI_SR_RXNE));
   return *(volatile uint8_t *)&SPIx->DR;
}


I później czytam

Kod: Zaznacz cały

   SET_CS();
   ADC_DATA data;
   data.out = 0;
   SPI_SEND_CHAR(SPI, 0x01);
   Delay(200);
   for(uint8_t x=0; x<3; x++)
   {
      data.items[x] = SPI_SEND_READ_CHAR(SPI, 0x00);
   }
   while(SPI_CHECK_STATE(SPI));

   RESET_CS();
   return (data.out >> 8);


Zmienna data to unia, do tablicy data.items trafiają same wartości 0xFF. Choć sprawdziłem analizatorem i wiem że są różne od 0xFF.

Ktoś ma jakiś pomysł skąd taka wartość ?

Awatar użytkownika
StaryAnoda_NEW
Newb
Newb
Posty: 77
Rejestracja: środa 04 kwie 2018, 16:48

Re: [SPI]Odczyt danych

Postautor: StaryAnoda_NEW » niedziela 05 maja 2019, 13:08

Dzień dobry,

Czy możesz pokazać funkcję:
SET_CS();
RESET_CS();

Pozdrawiam
StaryAnoda_NEW
Nie jest możliwe, żeby ludzki umysł opracował rzecz bardziej uniwersalną niż mikroprocesor - Andy Grove

Awatar użytkownika
Marcin
User
User
Posty: 191
Rejestracja: środa 09 wrz 2015, 19:30

Re: [SPI]Odczyt danych

Postautor: Marcin » niedziela 05 maja 2019, 13:10

Standardowo w moim stylu na rejestrach

Kod: Zaznacz cały

static inline void SET_CS()
{
   ADS_PORT_CS->BRR |= GPIO_BRR_BR15;
}

static inline void RESET_CS()
{
   ADS_PORT_CS->BSRR |= GPIO_BSRR_BS15;
}


Przed RESET_CS oczekuję na wyzerowanie flagi bsy.

Awatar użytkownika
ZbeeGin
User
User
Posty: 304
Rejestracja: sobota 08 lip 2017, 17:16
Lokalizacja: GOP
Kontaktowanie:

Re: [SPI]Odczyt danych

Postautor: ZbeeGin » niedziela 05 maja 2019, 14:37

Podstawowe pytanie co w ogóle zwraca SPI_SEND_READ_CHAR()?

Spójrz na wycinek makr z LL:

Code: Select all

/**
* @brief Read 8-Bits in the data register
* @rmtoll DR DR LL_SPI_ReceiveData8
* @param SPIx SPI Instance
* @retval RxData Value between Min_Data=0x00 and Max_Data=0xFF
*/
__STATIC_INLINE uint8_t LL_SPI_ReceiveData8(SPI_TypeDef *SPIx)
{
return (uint8_t)(READ_REG(SPIx->DR));
}

/**
* @brief Read 16-Bits in the data register
* @rmtoll DR DR LL_SPI_ReceiveData16
* @param SPIx SPI Instance
* @retval RxData Value between Min_Data=0x00 and Max_Data=0xFFFF
*/
__STATIC_INLINE uint16_t LL_SPI_ReceiveData16(SPI_TypeDef *SPIx)
{
return (uint16_t)(READ_REG(SPIx->DR));
}

/**
* @brief Write 8-Bits in the data register
* @rmtoll DR DR LL_SPI_TransmitData8
* @param SPIx SPI Instance
* @param TxData Value between Min_Data=0x00 and Max_Data=0xFF
* @retval None
*/
__STATIC_INLINE void LL_SPI_TransmitData8(SPI_TypeDef *SPIx, uint8_t TxData)
{
#if defined (__GNUC__)
__IO uint8_t *spidr = ((__IO uint8_t *)&SPIx->DR);
*spidr = TxData;
#else
*((__IO uint8_t *)&SPIx->DR) = TxData;
#endif
}

/**
* @brief Write 16-Bits in the data register
* @rmtoll DR DR LL_SPI_TransmitData16
* @param SPIx SPI Instance
* @param TxData Value between Min_Data=0x00 and Max_Data=0xFFFF
* @retval None
*/
__STATIC_INLINE void LL_SPI_TransmitData16(SPI_TypeDef *SPIx, uint16_t TxData)
{
#if defined (__GNUC__)
__IO uint16_t *spidr = ((__IO uint16_t *)&SPIx->DR);
*spidr = TxData;
#else
SPIx->DR = TxData;
#endif
}


Zauważ, że oni w przypadku czytania wartości nie robią takich "cudów na kiju"...

Awatar użytkownika
dambo
Expert
Expert
Posty: 617
Rejestracja: czwartek 17 mar 2016, 17:12

Re: [SPI]Odczyt danych

Postautor: dambo » niedziela 05 maja 2019, 14:42

ja rzucę na szybko pomysłami:
- bit FRXTH dla komunikacji po bajcie
- z tym też związana kwestia, że możesz testowo pomiędzy wysłanie, a odczyt dać "dummy" delaya
- weryfikacja, czy dla pinu MISO są poprawnie ustawione alternate
Zapraszam na mojego pseudobloga z projektami itp: http://projektydmb.blogspot.com/

Awatar użytkownika
Marcin
User
User
Posty: 191
Rejestracja: środa 09 wrz 2015, 19:30

Re: [SPI]Odczyt danych

Postautor: Marcin » niedziela 05 maja 2019, 14:46

ZbeeGin pisze:Podstawowe pytanie co w ogóle zwraca SPI_SEND_READ_CHAR()?




Kod: Zaznacz cały

uint8_t SPI_READ_CHAR(SPI_TypeDef *SPIx)
{
   while(!(SPIx->SR & SPI_SR_RXNE));
   return *(volatile uint8_t *)&SPIx->DR;
}

Awatar użytkownika
ZbeeGin
User
User
Posty: 304
Rejestracja: sobota 08 lip 2017, 17:16
Lokalizacja: GOP
Kontaktowanie:

Re: [SPI]Odczyt danych

Postautor: ZbeeGin » niedziela 05 maja 2019, 14:49

Chodzi mi o rzeczywistą wartość jaką zwraca funkcja jeśli na przebiegach masz wartość <A> to czy też zwraca <A> czy jednak 0xFF.

Nie pytałem o funkcję SPI_READ_CHAR(). Nie używasz jej tam...

Awatar użytkownika
dambo
Expert
Expert
Posty: 617
Rejestracja: czwartek 17 mar 2016, 17:12

Re: [SPI]Odczyt danych

Postautor: dambo » niedziela 05 maja 2019, 15:26

ZbeeGin pisze:Chodzi mi o rzeczywistą wartość jaką zwraca funkcja jeśli na przebiegach masz wartość <A> to czy też zwraca <A> czy jednak 0xFF.


No to jest w początku tematu:

Marcin pisze:Mam problem z odczytem danych po SPI w STM32, funkcja zwracająca dane zwraca mi 0xFF choć sprawdziłem analizatorem i wiem że dane przychodzą prawidłowe i różne od 0xFF.


Coś się minęliście trochę
Zapraszam na mojego pseudobloga z projektami itp: http://projektydmb.blogspot.com/

Awatar użytkownika
Marcin
User
User
Posty: 191
Rejestracja: środa 09 wrz 2015, 19:30

Re: [SPI]Odczyt danych

Postautor: Marcin » niedziela 05 maja 2019, 15:26

Użyłem makr, w pracy krokowej co któreś wywołanie zwraca wartości, jednak porównałem to z tym co przylatuje po SPI i ma się to nijak, to są całkiem inne wartości. Ale żadne z nich nie jest równe 0xFF.

Sama funkcja zwraca właśnie ta wartość.

Awatar użytkownika
xor
User
User
Posty: 151
Rejestracja: poniedziałek 05 wrz 2016, 21:44

Re: [SPI]Odczyt danych

Postautor: xor » niedziela 05 maja 2019, 17:30

SPI_SEND_CHAR(SPI, 0x01); coś tam sobie wysyła ale czy odbiera? Jeśli nie, to dana sobie chyba siedzi w FIFO i jest odczytana dopiero w pętli przez SPI_SEND_READ_CHAR(SPI, 0x00); udając daną użyteczną?

Awatar użytkownika
Marcin
User
User
Posty: 191
Rejestracja: środa 09 wrz 2015, 19:30

Re: [SPI]Odczyt danych

Postautor: Marcin » niedziela 05 maja 2019, 20:29

xor pisze:SPI_SEND_CHAR(SPI, 0x01); coś tam sobie wysyła ale czy odbiera? Jeśli nie, to dana sobie chyba siedzi w FIFO i jest odczytana dopiero w pętli przez SPI_SEND_READ_CHAR(SPI, 0x00); udając daną użyteczną?


Zmieniłem na SPI_SEND_READ_CHAR(), dodatkowo w rejestrze CR2 ustawiłem bit FRXTH (FIFO reception threshold), opisu dla ustawionego "RXNE event is generated if the FIFO level is greater than or equal to 1/4 (8-bit)" Czyli rozumiem że przy odebraniu 8 bitów powinien ustawiać flagę RXNE.

Teraz już nie odbieram samych 0xFF, jednak wciąż nie są to te same wartości jakie obserwuję na analizatorze. Na starcie funkcji wysyłającej komendę inicjalizacji pomiaru i później odczytu zmieżonej wartości SPI próbowałem go włączyć i wyłączyć jednak to też nie przyniosło rozwiązania problemu.

Awatar użytkownika
Marcin
User
User
Posty: 191
Rejestracja: środa 09 wrz 2015, 19:30

Re: [SPI]Odczyt danych

Postautor: Marcin » niedziela 05 maja 2019, 20:54

Porównałem to co mi SPI odczytuje z tym co jest zarejestrowane na analizatorze.

Wszystko to co SPI odczytało jest przesunięte dokładnie o jeden bit w prawo.

Kod: Zaznacz cały

B0AC0C   1011 0000 1010 1100 0000 1100    (wynik odczytany z analizatora)
D85606   1101 1000 0101 0110 0000 0110    (wynik odczytany z danej odebranej przez SPI)

Awatar użytkownika
xor
User
User
Posty: 151
Rejestracja: poniedziałek 05 wrz 2016, 21:44

Re: [SPI]Odczyt danych

Postautor: xor » niedziela 05 maja 2019, 21:47

Na analizatorze możesz mieć niezgodne ustawienia CPHA, CPOL

Awatar użytkownika
Marcin
User
User
Posty: 191
Rejestracja: środa 09 wrz 2015, 19:30

Re: [SPI]Odczyt danych

Postautor: Marcin » poniedziałek 06 maja 2019, 20:36

xor pisze:Na analizatorze możesz mieć niezgodne ustawienia CPHA, CPOL


Problem był po stronie uC w konfiguracji CPHA.

Problem wygląda na rozwiązany, przyczyn było w zasadzie dwie. Po pierwsze nieustawiony bit FRXTH w rejestrze CR2, który odpowiada za moment wystawienia flagi RXNE (po 8 lub 16 bitach), druga rzecz to wyżej wspomniane CPHA.
Nie wiem czy problem też nie leżał w "nieodczytywaniu" bufora już po pierwszym wysłanym znaku. Tą opcję sprawdzę wkrótce.


Wróć do „Programowanie STM w C/C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość