Skocz do zawartości

[C++] STM32F407VG Discovery- Problem z SPI i LIS302


Jaku_B

Pomocna odpowiedź

Witam wszystkich,

Od paru dni mam duże problemy z połączeniem się z akcelerometrem zainstalowanym na płytce discovery. Jak napisałem w temacie jest to model LIS302. Próbowalem się z nim skomunikować wykorzystując biblioteki CMSIS do obsługi SPI i do obsługi tego akcelerometru. W każdym z tych rozwiązań napotykałem na problemy. Dlatego zwracam się do was z prośbą o pomoc, może ktoś z was miał styczność z SPI na tej płytce.

Podrzucam mój kod w którym największym problemem jest to, że po pierwsze bity 0x20C7 dochodzą na rejestr DR w postaci 0x0000 (bo flaga TXE się zereuje). Drugim problemem jest to, że nie ustawia się flaga RXEN.

#include "stm32f4xx.h"
#include "stm32f4xx_spi.h"
#include "stm32f4_discovery.h"
#include "stm32f4_discovery_lis302dl.h"

uint16_t rxdata[2],config;
int main (void)
{


       GPIO_InitTypeDef GPIO_InitStructure;
       SPI_InitTypeDef  SPI_InitStructure;

       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOA |     RCC_AHB1Periph_GPIOE , ENABLE);
       RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);


         //Init SPI-Pins
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
         GPIO_Init(GPIOA, &GPIO_InitStructure);
         //Init CS-Pin
         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
         GPIO_Init(GPIOE, &GPIO_InitStructure);

         GPIO_SetBits(GPIOE, GPIO_Pin_3);  //Set CS high


         GPIO_PinAFConfig (GPIOA, GPIO_PinSource5,GPIO_AF_SPI2);
         GPIO_PinAFConfig (GPIOA, GPIO_PinSource6,GPIO_AF_SPI2);
         GPIO_PinAFConfig (GPIOA, GPIO_PinSource7,GPIO_AF_SPI2);


         SPI_I2S_DeInit(SPI2);
         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
         SPI_InitStructure.SPI_Mode = SPI_Mode_Master ;
         SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b ;
         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High    ;
         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft ;
         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
         SPI_InitStructure.SPI_CRCPolynomial = 0;
         SPI_Init(SPI2, &SPI_InitStructure);


         SPI_Cmd(SPI2, ENABLE);

         //GPIO_ResetBits(GPIOE, GPIO_Pin_3);

         while (SPI_I2S_GetFlagStatus(SPI2, SPI_FLAG_TXE) == RESET) 
         {}
         //GPIO_SetBits(GPIOE, GPIO_Pin_3);
         SPI_I2S_SendData(SPI2, 0xC720);    //Sensor Config

         //Sprawdzenie czy RXNE=1 oznaczza to, że bufor nie jest pusty a dane są gotowe do odczytu
         while (SPI_I2S_GetFlagStatus(SPI2, SPI_FLAG_RXNE) == RESET) 
         {}
         rxdata[1] = SPI_I2S_ReceiveData(SPI2);


   while(1){
       //Read Y-Axis
       SPI_I2S_SendData(SPI2, 0xAB00);
       rxdata[1]=SPI_I2S_ReceiveData(SPI2);
   } 
}

Jeżeli potraficie to bardzo prosze o pomoc. Może w przyszłości jak już nabiorę wprawy w obsłudze STM'ów, będę mógł się odwdzięczyć.

Pozdrawiam,
Jakub

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.