文章目录
- LSM9DS0三轴加速度计驱动程序--基于stm32
LSM9DS0三轴加速度计驱动程序–基于stm32
LSM9DS0.h
#ifndef __LSM9DS0_H
#define __LSM9DS0_H
#include "stm32f4xx.h"
#include "stm32f4xx_sys.h"
#define SPI_CS_G PAout(1)
#define SPI_CS_XM PAout(2)
#define SPI_SCL PAout(5)
#define SPI_MOSI PCout(5)
#define SPI_MISO PAin(6)
#define DEN_G PBout(12)
#define INT_G PBin(13)
#define DRDY_G PBin(14)
#define INT1 PAin(7)
#define INT2 PCin(4)
#define S PBout(11)
#define G PBout(10)
#define WHO_AM_I_G 0x0F
#define CTRL_REG1_G 0x20
#define CTRL_REG2_G 0x21
#define CTRL_REG3_G 0x22
#define CTRL_REG4_G 0x23
#define CTRL_REG5_G 0x24
#define REFERENCE_G 0x25
#define STATUS_REG_G 0x27
#define OUT_X_L_G 0x28
#define OUT_X_H_G 0x29
#define OUT_Y_L_G 0x2A
#define OUT_Y_H_G 0x2B
#define OUT_Z_L_G 0x2C
#define OUT_Z_H_G 0x2D
#define FIFO_CTRL_REG_G 0x2E
#define FIFO_SRC_REG_G 0x2F
#define INT1_CFG_G 0x30
#define INT1_SRC_G 0x31
#define INT1_THS_XH_G 0x32
#define INT1_THS_XL_G 0x33
#define INT1_THS_YH_G 0x34
#define INT1_THS_YL_G 0x35
#define INT1_THS_ZH_G 0x36
#define INT1_THS_ZL_G 0x37
#define INT1_DURATION_G 0x38
#define OUT_TEMP_L_XM 0x05
#define OUT_TEMP_H_XM 0x06
#define STATUS_REG_M 0x07
#define OUT_X_L_M 0x08
#define OUT_X_H_M 0x09
#define OUT_Y_L_M 0x0A
#define OUT_Y_H_M 0x0B
#define OUT_Z_L_M 0x0C
#define OUT_Z_H_M 0x0D
#define WHO_AM_I_XM 0x0F
#define INT_CTRL_REG_M 0x12
#define INT_SRC_REG_M 0x13
#define INT_THS_L_M 0x14
#define INT_THS_H_M 0x15
#define OFFSET_X_L_M 0x16
#define OFFSET_X_H_M 0x17
#define OFFSET_Y_L_M 0x18
#define OFFSET_Y_H_M 0x19
#define OFFSET_Z_L_M 0x1A
#define OFFSET_Z_H_M 0x1B
#define REFERENCE_X 0x1C
#define REFERENCE_Y 0x1D
#define REFERENCE_Z 0x1E
#define CTRL_REG0_XM 0x1F
#define CTRL_REG1_XM 0x20
#define CTRL_REG2_XM 0x21
#define CTRL_REG3_XM 0x22
#define CTRL_REG4_XM 0x23
#define CTRL_REG5_XM 0x24
#define CTRL_REG6_XM 0x25
#define CTRL_REG7_XM 0x26
#define STATUS_REG_A 0x27
#define OUT_X_L_A 0x28
#define OUT_X_H_A 0x29
#define OUT_Y_L_A 0x2A
#define OUT_Y_H_A 0x2B
#define OUT_Z_L_A 0x2C
#define OUT_Z_H_A 0x2D
#define FIFO_CTRL_REG 0x2E
#define FIFO_SRC_REG 0x2F
#define INT_GEN_1_REG 0x30
#define INT_GEN_1_SRC 0x31
#define INT_GEN_1_THS 0x32
#define INT_GEN_1_DURATION 0x33
#define INT_GEN_2_REG 0x34
#define INT_GEN_2_SRC 0x35
#define INT_GEN_2_THS 0x36
#define INT_GEN_2_DURATION 0x37
#define CLICK_CFG 0x38
#define CLICK_SRC 0x39
#define CLICK_THS 0x3A
#define TIME_LIMIT 0x3B
#define TIME_LATENCY 0x3C
#define TIME_WINDOW 0x3D
#define ACT_THS 0x3E
#define ACT_DUR 0x3F
#define WRITE_single 0x00
#define READ_single 0x80
#define WRITE_multiple 0x40
#define READ_multiple 0xc0
void LSM9DS0_SN74LS157_GPIO_Init(void);
void WriteSingleToLSM9DS0_G(u8 addr, u8 data);
void WriteSingleToLSM9DS0_XM(u8 addr, u8 data);
void WriteMultipleToLSM9DS0_G(u8 addr,u8 len,u8 *databuff);
void WriteMultipleToLSM9DS0_XM(u8 addr,u8 len,u8 *databuff);
u8 ReadSingleFromLSM9DS0_G(u8 addr);
u8 ReadSingleFromLSM9DS0_X(u8 addr);
u8 ReadSingleFromLSM9DS0_M(u8 addr);
u8 ReadSingleFromLSM9DS0_T(u8 addr);
void ReadMultipleFromLSM9DS0_G(u8 addr,u8 len, u8 *databuff);
void ReadMultipleFromLSM9DS0_X(u8 addr,u8 len, u8 *databuff);
void ReadMultipleFromLSM9DS0_M(u8 addr,u8 len, u8 *databuff);
void ReadMultipleFromLSM9DS0_T(u8 addr,u8 len, u8 *databuff);
void LSM9DS0_Start(void);
#endif
LSM9DS0.c
#include "LSM9DS0.h"
#include "usart.h"
void LSM9DS0_SN74LS157_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOC,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SPI_CS_G=1;
SPI_CS_XM=1;
S=0;
G=1;
}
void WriteSingleToLSM9DS0_G(u8 addr, u8 data)
{
u8 i = 0;
u8 j = 0;
addr =WRITE_single |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_G=1;
delay_us(1);
SPI_CS_G=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(j=0; j<8; j++)
{
SPI_SCL=0;
if(0x80 == (data & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
data <<= 1;
}
SPI_CS_G=1;
}
void WriteSingleToLSM9DS0_XM(u8 addr, u8 data)
{
u8 i = 0;
u8 j = 0;
addr =WRITE_single |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_XM=1;
delay_us(1);
SPI_CS_XM=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(j=0; j<8; j++)
{
SPI_SCL=0;
if(0x80 == (data & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
data <<= 1;
}
SPI_CS_XM=1;
}
void WriteMultipleToLSM9DS0_G(u8 addr,u8 len,u8 *databuff)
{
u8 i = 0;
u8 j = 0;
u8 k=0;
addr =WRITE_multiple |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_G=1;
delay_us(1);
SPI_CS_G=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(k=0; k<len; k++)
{
for(j=0; j<8; j++)
{
SPI_SCL=0;
if(0x80 == (databuff[k] & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
databuff[k] <<= 1;
}
}
SPI_CS_G=1;
}
void WriteMultipleToLSM9DS0_XM(u8 addr,u8 len,u8 *databuff)
{
u8 i = 0;
u8 j = 0;
u8 k=0;
addr =WRITE_multiple |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_XM=1;
delay_us(1);
SPI_CS_XM=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(k=0; k<len; k++)
{
for(j=0; j<8; j++)
{
SPI_SCL=0;
if(0x80 == (databuff[k] & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
databuff[k] <<= 1;
}
}
SPI_CS_XM=1;
}
u8 ReadSingleFromLSM9DS0_G(u8 addr)
{
u8 i = 0;
u8 j = 0;
u8 RotateData=0;
G=0;
S=1;
addr =READ_single |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_G=1;
delay_us(1);
SPI_CS_G=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(j=0; j<8; j++)
{
SPI_SCL=0;
RotateData<<= 1;
if(SPI_MISO == 1)
{
RotateData |= 1;
}
delay_us(1);
SPI_SCL=1;
delay_us(1);
}
SPI_CS_G=1;
G=1;
return RotateData;
}
u8 ReadSingleFromLSM9DS0_X(u8 addr)
{
u8 i = 0;
u8 j = 0;
u8 RotateData=0;
G=0;
S=0;
addr =READ_single |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_XM=1;
delay_us(1);
SPI_CS_XM=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(j=0; j<8; j++)
{
SPI_SCL=0;
RotateData<<= 1;
if(SPI_MISO == 1)
{
RotateData |= 1;
}
delay_us(1);
SPI_SCL=1;
delay_us(1);
}
SPI_CS_XM=1;
G=1;
return RotateData;
}
u8 ReadSingleFromLSM9DS0_M(u8 addr)
{
u8 i = 0;
u8 j = 0;
u8 RotateData=0;
G=0;
S=0;
addr =READ_single |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_XM=1;
delay_us(1);
SPI_CS_XM=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(j=0; j<8; j++)
{
SPI_SCL=0;
RotateData<<= 1;
if(SPI_MISO == 1)
{
RotateData |= 1;
}
delay_us(1);
SPI_SCL=1;
delay_us(1);
}
SPI_CS_XM=1;
G=1;
return RotateData;
}
void ReadMultipleFromLSM9DS0_G(u8 addr,u8 len, u8 *databuff)
{
u8 i = 0;
u8 j = 0;
u8 k = 0;
u8 RotateData=0;
G=0;
S=1;
addr =READ_multiple |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_G=1;
delay_us(1);
SPI_CS_G=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(k=0; k<len; k++)
{
for(j=0; j<8; j++)
{
SPI_SCL=0;
RotateData<<= 1;
if(SPI_MISO == 1)
{
RotateData |= 1;
}
delay_us(1);
SPI_SCL=1;
delay_us(1);
}
*(databuff+k)= RotateData;
}
SPI_CS_G=1;
G=1;
}
void ReadMultipleFromLSM9DS0_X(u8 addr,u8 len, u8 *databuff)
{
u8 i = 0;
u8 j = 0;
u8 k = 0;
u8 RotateData=0;
G=0;
S=0;
addr =READ_multiple |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_XM=1;
delay_us(1);
SPI_CS_XM=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(k=0; k<len; k++)
{
for(j=0; j<8; j++)
{
SPI_SCL=0;
RotateData<<= 1;
if(SPI_MISO == 1)
{
RotateData |= 1;
}
delay_us(1);
SPI_SCL=1;
delay_us(1);
}
*(databuff+k)= RotateData;
}
SPI_CS_XM=1;
G=1;
}
void ReadMultipleFromLSM9DS0_M(u8 addr,u8 len, u8 *databuff)
{
u8 i = 0;
u8 j = 0;
u8 k = 0;
u8 RotateData=0;
G=0;
S=0;
addr =READ_multiple |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_XM=1;
delay_us(1);
SPI_CS_XM=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(k=0; k<len; k++)
{
for(j=0; j<8; j++)
{
SPI_SCL=0;
RotateData<<= 1;
if(SPI_MISO == 1)
{
RotateData |= 1;
}
delay_us(1);
SPI_SCL=1;
delay_us(1);
}
*(databuff+k)= RotateData;
}
SPI_CS_XM=1;
G=1;
}
void ReadMultipleFromLSM9DS0_T(u8 addr,u8 len, u8 *databuff)
{
u8 i = 0;
u8 j = 0;
u8 k = 0;
u8 RotateData=0;
G=0;
S=0;
addr =READ_multiple |addr;
SPI_SCL=1;
delay_us(1);
SPI_CS_XM=1;
delay_us(1);
SPI_CS_XM=0;
delay_us(1);
for(i=0; i<8; i++)
{
SPI_SCL=0;
if(0x80 == (addr & 0x80))
SPI_MOSI=1;
else
SPI_MOSI=0;
delay_us(1);
SPI_SCL=1;
delay_us(1);
addr <<= 1;
}
for(k=0; k<len; k++)
{
for(j=0; j<8; j++)
{
SPI_SCL=0;
RotateData<<= 1;
if(SPI_MISO == 1)
{
RotateData |= 1;
}
delay_us(1);
SPI_SCL=1;
delay_us(1);
}
*(databuff+k)= RotateData;
}
SPI_CS_XM=1;
G=1;
}
void LSM9DS0_Start(void)
{
WriteSingleToLSM9DS0_XM(CTRL_REG0_XM,0x40);
WriteSingleToLSM9DS0_XM(CTRL_REG1_XM,0x9f);
WriteSingleToLSM9DS0_XM(CTRL_REG2_XM,0x02);
WriteSingleToLSM9DS0_XM(CTRL_REG5_XM,0xf4);
WriteSingleToLSM9DS0_XM(CTRL_REG6_XM,0x00);
WriteSingleToLSM9DS0_XM(CTRL_REG7_XM,0x80);
}