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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.