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.