Skocz do zawartości

STM32 + CubeMX + LIS3DHH - brak odbioru danych przez SPI


przemof-s

Pomocna odpowiedź

Witam,
próbuję uruchomić akcelerometr LIS3DHH ( https://www.st.com/en/mems-and-sensors/lis3dhh.html) na zestawie Nucleo F411RE (https://www.st.com/en/evaluation-tools/nucleo-f411re.html). Czujnik mam w postaci adaptera STEVAL-MKI180V1 (https://www.st.com/en/evaluation-tools/steval-mki180v1.html). Konfigurację dla mikrokontrolera generuję za pomocą CubeMX 5.0.1 z bibliotekami HAL dla rodziny STM32F4, w wersji 1.23.0. Próbę uruchomienia czujnika rozpocząłem od wykorzystania bibliotek: https://github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/master/lis3dhh_STdC, a dokładnie od przykładu: read_data_simple.c.

Po dużej liczbie nieudanych prób komunikacji, maksymalnie uprościłem przykład. Aktualnie próbuję odczytać wartość rejestru WHO_AM_I. Adres rejestru to: 0x0F. Podczas odczytu danych, bit SMB adresu powinien mieć wartość 1, więc modyfikuję adres rejestru do wartości 0x8F.
Wartość rejestru WHO_AM_I powinna wynosić 0x11, a ja otrzymuję wartość 0x00.

Wszystkie linie SPI są sprzętowo podciągnięte do plusa zasilania, za pomocą wewnętrznych rezystorów mikrokontrolera. Korzystam z SPI2. Jego konfiguracja to: CPOL = High, CPHA = 2 Edge, prędkość: 1.3125 Mbits/s. Sygnał CS jest generowany programowo.

Poniżej przedstawiam fragment kodu źródłowego odpowiedzialnego za inicjalizację SPI oraz próbę odczytania rejestru WHO_AM_I.

Inicjalizacja SPI:

void MX_SPI2_Init(void)
{
  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;
  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    Error_Handler();
  }
}

[Próba odczytu zawartości rejestru WHO_AM_I (zawarte w funkcji main):

MX_GPIO_Init();
MX_SPI2_Init();
HAL_Delay(10);

HAL_StatusTypeDef status;
uint8_t reg = 0x0F;        // Adres rejestru WHO_AM_I
uint8_t bufp[3];
uint16_t len = 1;

reg |= 0x80;           // Informacja, ze przeprowadzany bedzie odczyt danych
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET);     // Aktywacja SPI
status = HAL_SPI_Transmit(&LIS3DHH_HANDLE, ®, 1, 1000);                             // Wyslanie adresu do odczytu
status = HAL_SPI_Receive(&LIS3DHH_HANDLE, bufp, len, 1000);                    // Odbior zawartosci adresu
HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET);        // Dezaktywacja SPI

W załączniku przedstawiam przebiegi uzyskane z analizatora stanów logicznych, plik konfiguracyjny dla CubeMX oraz kod źródłowy programu testowego.
Dodam, że testy przeprowadzałem na dwóch czujnikach, oraz dodatkowo na zestawie z  mikrokontrolerem STM32F103 (blue PCB). Modyfikowałem na wiele sposobów konfigurację SPI oraz odczyt rejestrów. Efekt za każdym razem taki sam.

Czy ktoś ma pomysł co robię nie tak, że za każdym razem otrzymuję wartość zero z rejestru WHO_AM_I?

Test_LIS3DHH_F4.zip

SPI_log.png

Link do komentarza
Share on other sites

Cześć,

temat wymaga trochę czasu, aby przeanalizować kod i dokumentację czujnika.Przebiegi na liniach SPI wyglądają (z grubsza na poprawne). Na szybko zrobił bym jedną rzecz - pomiędzy plus zasilania czujnika a masę dałbym kondensator 100 nF (jak najbliżej czujnika). Masy czujnika i zestawu uruchomieniowego połączone?

Miałem identyczne objawy dla pamięci FRAM Fujitsu, gdy nie miałem kondensatora wygładzającego zasilanie blisko kostki pamięci - odczytywałem same zera. Więc tak na szybko zrobiłbym taką próbę.

Pozdrawiam

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.