2014-02-19 5 views
1

Мне нужно прочитать некоторые данные с акселерометра LIS3DSH в STM32F4 Discovery. У меня есть этот основной код:Акселерометр STM32F4

uint8_t writeData(uint8_t data) { 

    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) 
     ; 
    SPI_I2S_SendData(SPI1, data); 

    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET) 
     ; 
    return SPI_I2S_ReceiveData(SPI1); 
} 

void setReg(uint8_t address, uint8_t value) { 
    GPIO_ResetBits(GPIOE,GPIO_Pin_3); 
    writeData(address); 
    writeData(value); 
    GPIO_SetBits(GPIOE,GPIO_Pin_3); 
} 

uint8_t getReg(uint8_t address) { 
    uint8_t data=0; 
    address|=(1<<7); 
    GPIO_ResetBits(GPIOE,GPIO_Pin_3); 
    writeData(address); 
    data = writeData(0x00); 
    GPIO_SetBits(GPIOE,GPIO_Pin_3); 
    return data; 
} 

int main(void) 
{ 
    char str[4]; 

    usart_init(); 
    spi_init(); 

    // Turn on accelerometer 
    //setReg(LIS302DL_CTRL_REG1, (1<<PD_CTRL_REG1)); 
    LIS3DSH_Init(); 

    // Read data from three registers 
    // and write it to UART 
    while(1) 
    { 
     delay(); 

     itoa((int8_t) LIS3DSH_Get_X_Out(1),&str); 
     send_str(&str); 
     send_str(":"); 
     itoa((int8_t) getReg(LIS302DL_OUT_Y),&str); 
     send_str(&str); 
     send_str(":"); 
     itoa((int8_t) getReg(LIS302DL_OUT_Z),&str); 
     send_str(&str); 
     send_str(" | "); 
    } 
} 

Но он получает только первое значение. Например:

5:32:128|5:32:128|5:32:128|5:32:128|5:32:128|5:32:128|5:32:128|5:32:128|5:32:128|5:32:128| 
5:32:128|5:32:128|5:32:128|5:32:128|5:32:128|5:32:128|5:32:128|5:32:128|5:32:128|5:32:128| 
5:32:128|5:32:128| 

Я использую USART2 для чтения этих данных. Может ли кто-нибудь сказать, как обновлять данные в режиме реального времени? Например, если я переверню плату, данные изменятся?

+0

Может быть, вы переопределяете значение в str ... – KernelPanic

+0

@MarkoFrelih no, функция getReg возвращает это неизмененное значение – Viodentia

+1

@MarkoFrelih Я нашел проблему. Сила датчика не включалась. Он решает настройки регистра. – Viodentia

ответ

0

Я нашел его. Сила датчика не включалась. Он решает настройки регистра (0x2). Спасибо всем за помощь.

0

Мы можем начать поиск ошибки здесь повсюду. Есть некоторые вещи, которые меня путают в вашем вопросе.

  1. Вы говорите вы используете UART2 но initilating в ИПБ.
  2. Вы используете библиотеку LIS3DSH_lib которая уже содержит LIS3DSH_Get_Y_Out и т.д .. Так почему вы используете getreg ??? Просто сделайте это с координатой x.
  3. В lib, который я нашел, spi init сделан в LIS3DSH_Init(). Поэтому бросьте свой собственный spi init оттуда.
  4. Убедитесь, что у вас есть LIS3DSH, а затем не используйте LIS302DL_OUT_Z макросы. В новых открытиях используется LIS302DL. Если у вас есть LIS302DL, используйте this lib. Я могу заверить, что это работает.

Решение: Попробуйте использовать This lib и выбросить все, чтобы получить рег и установить рег код и другой spi_init.

Нечто подобное:

#include LIS3DSH.h 
int main(void) 
{ 
    char str[4]; 

    usart_init(); 
    LIS3DSH_Init(); 

    while(1) 
    { 
     delay(); 

     itoa((int8_t) LIS3DSH_Get_X_Out(1),&str); 
     send_str(&str); 
     send_str(":"); 
     itoa((int8_t) LIS3DSH_Get_Y_Out(1),&str); 
     send_str(&str); 
     send_str(":"); 
     itoa((int8_t) LIS3DSH_Get_Z_Out(1),&str); 
     send_str(&str); 
     send_str(" | "); 
    } 
}