Strona 1 z 1

[SPI]Odczyt danych

: niedziela 05 maja 2019, 13:00
autor: Marcin
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ść ?

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 13:08
autor: StaryAnoda_NEW
Dzień dobry,

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

Pozdrawiam
StaryAnoda_NEW

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 13:10
autor: Marcin
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.

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 14:37
autor: ZbeeGin
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"...

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 14:42
autor: dambo
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

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 14:46
autor: Marcin
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;
}

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 14:49
autor: ZbeeGin
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...

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 15:26
autor: dambo
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ę

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 15:26
autor: Marcin
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ść.

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 17:30
autor: xor
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ą?

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 20:29
autor: Marcin
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.

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 20:54
autor: Marcin
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)

Re: [SPI]Odczyt danych

: niedziela 05 maja 2019, 21:47
autor: xor
Na analizatorze możesz mieć niezgodne ustawienia CPHA, CPOL

Re: [SPI]Odczyt danych

: poniedziałek 06 maja 2019, 20:36
autor: Marcin
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.