STM32F4加速度计

时间:2014-02-19 13:29:16

标签: c accelerometer stm32f4discovery

我需要从STM32F4 Discovery中的加速度计LIS3DSH读取一些数据。我有这个主要代码:

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来读取这些数据。有人可以说如何实时更新数据吗?例如,如果我翻过电路板,数据会改变吗?

2 个答案:

答案 0 :(得分:0)

我们可以在这里开始搜索错误。在你的问题中,有些事情让我感到困惑。

  1. 您说您正在使用 uart2 但是正在启动 spi
  2. 您正在使用已提供 LIS3DSH_Get_Y_Out 等的库LIS3DSH_lib。那么为什么要使用getreg ???就像使用x坐标一样。
  3. 在我发现的lib中,spi init是在 LIS3DSH_Init()中创建的。所以把你自己的spi init 从那里扔出来
  4. 确保您拥有LIS3DSH,然后不要使用 LIS302DL_OUT_Z 宏。新发现使用 LIS302DL 。如果您有LIS302DL,请使用this lib。我可以保证这个有用。
  5. 解决方案:尝试使用This lib并抛弃所有get reg并设置reg代码和其他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(" | ");
        }
    }
    

答案 1 :(得分:0)

我找到了。传感器的电源未打开。它在寄存器设置(0x2)中解决。谢谢大家的帮助。