LSM9DS0三轴加速度计spi驱动程序--基于stm32

文章目录

  • LSM9DS0三轴加速度计驱动程序--基于stm32
    • LSM9DS0.h
    • LSM9DS0.c

LSM9DS0三轴加速度计驱动程序–基于stm32

LSM9DS0.h

#ifndef __LSM9DS0_H
#define __LSM9DS0_H
 
#include "stm32f4xx.h"
#include "stm32f4xx_sys.h"
		
		/*	      PA2(out) -----> SPI_CS_XM    ----->CS_XM  //¼ÓËٶȼƴÅÇ¿¼ÆƬѡ  1:I2C  0£ºSPI
							PA1(out) -----> SPI_CS_G    ----->CS_G 	//ÍÓÂÝÒÇƬѡ		 1:I2C  0£ºSPI
							PA5(out) -----> SPI_SCL=SPI_CLK    ----->CLK               
							PA6(in) -----> SPI_MISO   ----->SDO       
							PC5(out) -----> SPI_MOSI   ----->SDI                  
              PB12(out)-----> DEN_G               (*#* ÊäÈë¸Ä³ÉÊä³ö)
						  PB13(in)-----> INT_G 
							PB14(in)-----> DRDY_G 
							PA7(in)-----> INT1 
							PC4(in)-----> INT2 
							PB11(out)-----> S 	//74LS157Ñ¡Ôñ
							PB10(out)-----> G	//74LS157Ñ¡Ôñ		*/
#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)//74LS157Ñ¡ÔñÐźÅ(*#* ÊäÈë¸Ä³ÉÊä³ö:֮ǰд´íÁË)
#define G 	 PBout(10)//74LS157Ñ¡ÔñÐźÅ(*#* ÊäÈë¸Ä³ÉÊä³ö)
//¼Ä´æÆ÷µØÖ·¶¨Òå
// LSM9DS0 Gyro Registers 
#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

// LSM9DS0 Accel/Magneto (XM) Registers //

#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
//¼Ä´æÆ÷ÅäÖÃÊý¾Ý
///**ÅäÖÃCTRL_REG_1**/
//#define FAST_ODR_HIGH 	0x02//¸ßËÙÊä³öʹÄÜ(LowPowerʱ1000Hz/Medium-performance560Hz/High-performance300HZ)
//#define FAST_ODR_LOW  	0x00//¸ßËÙÊä³öʧÄÜ(LowPowerʱ1000Hz)(default)
//#define TEMP_EN_HIGH  	0x80//ζÈÊä³öʹÄÜ
//#define TEMP_EN_LOW   	0x00//ζÈÊä³öʧÄÜ(default)
//#define ST_HIGH       	0x01//self-test endisabled
//#define ST_LOW        	0x00//self-test disabled(default)
//#define OM_LP        	  0x00//Low-power mode(default)
//#define OM_MP         	0x20//Medium-performance mode
//#define DO_7         	  0x1c//Medium-performance mode
//#define OM_HP         	0x40//High-performance mode
//#define OM_UP         	0x60//Ultra-high-performance mode

///**ÅäÖÃCTRL_REG_2**/
//#define FS_4          	0x00//Full-scale ¡À4 gauss(default)
//#define FS_8          	0x20//Full-scale ¡À8 gauss
//#define FS_12         	0x40//Full-scale ¡À12 gauss
//#define FS_16         	0x60//Full-scale ¡À16 gauss
//#define REBOOT_HIGH     0x08//reboot memory content
//#define REBOOT_LOW      0x00//normal mode(default)
//#define SOFT_RST_HIGH   0x04// Reset operation
//#define SOFT_RST_LOW    0x00//(default)

///**ÅäÖÃCTRL_REG_3**/
//#define LP_HIGH        	0x20//
//#define LP_LOW        	0x00//(default)
//#define SIM_HIGH        0x04//SPI 3-wire interface
//#define SIM_LOW         0x00//SPI 4-wire interface(default)
//#define MD_00           0x00//Continuous-conversion mode
//#define MD_01           0x01//Single-conversion mode
//#define MD_10         	0x02//Power-down mode
//#define MD_11         	0x03//Power-down mode(default)

///**ÅäÖÃCTRL_REG_4**/
//#define BLE_HIGH        0x02// data MSb at lower address
//#define BLE_LOW        	0x00// data LSb at lower address(default)
//#define OMZ_LP          0x00//Low-power mode(default)
//#define OMZ_MP          0x04//Medium-performance mode
//#define OMZ_HP         	0x08//High-performance mode
//#define OMZ_UP         	0x0c//Ultra-high-performance mode

///**ÅäÖÃCTRL_REG_5**/
//#define FAST_READ_HIGH  0x80//FAST_READ enabled
//#define FAST_READ_LOW   0x00// FAST_READ disabled(default)
//#define BDU_HIGH 			  0x40//output registers not updated until MSb and LSb have been read
//#define BDU_LOW         0x00// continuous update(default)

///**ÅäÖÃINT_CFG**/
//#define INT_CFG_EN          0x00//ÖжϹرÕ(ĬÈÏ)

//ÅäÖöÁд
#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"
/*****************************************************************
	LSM9DS0_SN74LS157_GPIO_InitÅäÖÃ:									
							PA2(out) -----> SPI_CS_XM    ----->CS_XM  //¼ÓËٶȼƴÅÇ¿¼ÆƬѡ  1:I2C  0£ºSPI
							PA1(out) -----> SPI_CS_G    ----->CS_G 	//ÍÓÂÝÒÇƬѡ		 1:I2C  0£ºSPI
							PA5(out) -----> SPI_SCL=SPI_CLK    ----->CLK               
							PA6(in) -----> SPI_MISO   ----->SDO       
							PC5(out) -----> SPI_MOSI   ----->SDI                  
              PB12(out)-----> DEN_G               (*#* ÊäÈë¸Ä³ÉÊä³ö)
						  PB13(in)-----> INT_G 
							PB14(in)-----> DRDY_G 
							PA7(in)-----> INT1 
							PC4(in)-----> INT2 
							PB11(out)-----> S 	//74LS157Ñ¡Ôñ
							PB10(out)-----> G	//74LS157Ñ¡Ôñ		
*****************************************************************/  
/****LSM9DS0_SN74LS157_GPIO_Init*****/ 
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); 
	 /*< Configure SPI_CS_XM ¡¢SPI_CS_G ¡¢SPI_CLK   pins >*/ 
	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);
	/*< Configure  G¡¢S pins >*/ 
	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);
	 /*< Configure  SPI_MOSI pins >*/ 
	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);
	/*< Configure SPI_MISO ¡¢INT1>*/
	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);
	/*< Configure  INT2>*/
	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);
	/*< Configure  INT2>*/
	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);
	//SYNC_ADC_HIGH();
	SPI_CS_G=1;//¹ØSPI
	SPI_CS_XM=1;//¹ØSPI
	S=0;  //S=0:ѡͨA(¼ÓËٶȺʹų¡)
	G=1;	//¹Ø±Õѡͨ
}  
/****WriteSingleToLSM9DS0_G*****/ 
void WriteSingleToLSM9DS0_G(u8 addr, u8 data)//ÅäÖÃÍÓÂÝÄ£¿é
{
	u8	i = 0;
	u8	j = 0;
	//G=0;	//ѡͨLSM9DS0_G
	//S=1;
	addr =WRITE_single |addr;
	SPI_SCL=1;
	delay_us(1);
	SPI_CS_G=1;
	delay_us(1);
	SPI_CS_G=0;
	delay_us(1);
	 	//ValueToWrite = *(buf + i);
		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;
	//S=0;
	//G=1;
}
/****WriteSingleToLSM9DS0_XM*****/ 
void WriteSingleToLSM9DS0_XM(u8 addr, u8 data)//ÅäÖüÓËٶȺʹų¡Ä£¿é
{
	u8	i = 0;
	u8	j = 0;
	//G=0;	//ѡͨLSM9DS0_XM
	//S=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);
	 	//ValueToWrite = *(buf + i);
		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;
	//S=0;
	//G=1;
}
/****WriteMultipleToLSM9DS0_G*****/ 
void WriteMultipleToLSM9DS0_G(u8 addr,u8 len,u8 *databuff)//ÅäÖÃÍÓÂÝÄ£¿é
{
	u8	i = 0;
	u8	j = 0;	
	u8  k=0;
	//G=0;	//ѡͨLSM9DS0_G
	//S=1;
	addr =WRITE_multiple |addr;
	SPI_SCL=1;
	delay_us(1);
	SPI_CS_G=1;
	delay_us(1);
	SPI_CS_G=0;
	delay_us(1);
	 	//ValueToWrite = *(buf + i);
		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;
	//S=0;
	//G=1;
}
/****WriteMultipleToLSM9DS0_XM*****/ 
void WriteMultipleToLSM9DS0_XM(u8 addr,u8 len,u8 *databuff)//ÅäÖüÓËٶȺʹų¡Ä£¿é
{
	u8	i = 0;
	u8	j = 0;	
	u8  k=0;
	//G=0;	//ѡͨLSM9DS0_XM
	//S=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);
	 	//ValueToWrite = *(buf + i);
		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;
	//S=0;
	//G=1;
}
	
/****ReadSingleFromLSM9DS0_G*****/ 
u8 ReadSingleFromLSM9DS0_G(u8 addr)//¶ÁÍÓÂÝÊý¾Ý
{
	u8	i = 0;
	u8	j = 0;	
	u8 RotateData=0;
	G=0;	//ѡͨLSM9DS0_G
	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;
		 //S=0;
		 G=1;
		 return RotateData;
		 
} 
/****ReadSingleFromLSM9DS0_X*****/ 
u8 ReadSingleFromLSM9DS0_X(u8 addr)//¶Á¼ÓËÙ¶ÈÊý¾ÝÄ£¿é
{
	u8	i = 0;
	u8	j = 0;	
	u8 RotateData=0;
	G=0;	//ѡͨLSM9DS0_X
	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;
		 //S=0;
			G=1;
		 return RotateData;
	
}
/****ReadSingleFromLSM9DS0_M*****/ 
u8 ReadSingleFromLSM9DS0_M(u8 addr)//¶Á´Å³¡Êý¾ÝÄ£¿é
{
		u8	i = 0;
	u8	j = 0;	
	u8 RotateData=0;
	G=0;	//ѡͨLSM9DS0_M
	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;	
		 //S=0;
	   G=1;
		 return RotateData;

}
/****ReadMultipleFromLSM9DS0_G*****/ 
void ReadMultipleFromLSM9DS0_G(u8 addr,u8 len, u8 *databuff)//¶ÁÍÓÂÝÊý¾Ý
{

	u8	i = 0;
	u8	j = 0;	
	u8	k = 0;
	u8 RotateData=0;	
	G=0;	//ѡͨLSM9DS0_G
	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;
	 //S=0;
	G=1;
} 
/****ReadMultipleFromLSM9DS0_X*****/ 
void ReadMultipleFromLSM9DS0_X(u8 addr,u8 len, u8 *databuff)//¶Á¼ÓËÙ¶ÈÊý¾Ý
{
	
	u8	i = 0;
	u8	j = 0;	
	u8	k = 0;
	u8 RotateData=0;	
	G=0;	//ѡͨLSM9DS0_X
	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;
	 //S=0;
	G=1;
}
/****ReadMultipleFromLSM9DS0_M*****/ 
void ReadMultipleFromLSM9DS0_M(u8 addr,u8 len, u8 *databuff)//¶Á´Å³¡Êý¾Ý
{
	
	u8	i = 0;
	u8	j = 0;	
	u8	k = 0;
	u8 RotateData=0;
	G=0;	//ѡͨLSM9DS0_M
	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;
	//S=0;
	G=1;
}
/****ReadMultipleFromLSM9DS0_T*****/ 
void ReadMultipleFromLSM9DS0_T(u8 addr,u8 len, u8 *databuff)//¶Á´Å³¡Êý¾Ý
{
	
	u8	i = 0;
	u8	j = 0;	
	u8	k = 0;
	u8 RotateData=0;
	G=0;	//ѡͨLSM9DS0_T
	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;
	//S=0;
	G=1;
}
/****LIS3MDL_Start*****/ 
void LSM9DS0_Start(void)         
{
//	WriteSingleToLSM9DS0_G(CTRL_REG1_G,0xdf);
//	//ÉèÖÃÍÓÂÝÒÇÊä³öËÙÂÊ760Hz£¬Ê¹ÄÜXYZÖᣬÉèÖÃÍÓÂÝÒǹ¤×÷ÓÚ±ê׼ģʽ
//	WriteSingleToLSM9DS0_G(CTRL_REG4_G,0x02);
//	//Êý¾Ý³ÖÐø¸üУ¬ÉèÖÃÍÓÂÝÒÇÁ¿³ÌΪ+¡ª245dps£¬µÍλÊý¾Ý´æ·ÅµÍλ£¬Ê¹ÄÜÍÓÂÝ×Լ칦ÄÜģʽ1£¬X positive sign, Y and Z negative sign£¬4Ïßspi½Ó¿Ú
//	WriteSingleToLSM9DS0_G(CTRL_REG5_G,0x40);
//	//Õý³£Æô¶¯£¬Ê¹ÄÜÍÓÂÝÒÇFIFO¹¦ÄÜ
	WriteSingleToLSM9DS0_XM(CTRL_REG0_XM,0x40);
	//Õý³£Æô¶¯£¬Ê¹ÄܼÓËٶȼƴÅÇ¿¼ÆFIFO¹¦ÄÜ,ʧÄܸßͨÂ˲¨
	WriteSingleToLSM9DS0_XM(CTRL_REG1_XM,0x9f);
	//ÉèÖüÓËٶȼÆÊä³öËÙÂÊ800Hz£¬Êý¾Ý¶ÁÈ¡½áÊø¸üУ¬Ê¹ÄܼÓËٶȼÆXYZÖá
	WriteSingleToLSM9DS0_XM(CTRL_REG2_XM,0x02);
	//ÉèÖüÓËٶȼÆÁ¿³Ì+-2g£¬´ø¿í773Hz£¬4Ïßspi½Ó¿Ú£¬Ê¹ÄܼÓËٶȼÆ×Լ칦ÄÜPositive sign self-test
	WriteSingleToLSM9DS0_XM(CTRL_REG5_XM,0xf4);
	//ζȴ«¸ÐÆ÷ʹÄÜ£¬ÉèÖôÅÁ¦¼ÆÊý¾Ý¸üÐÂƵÂÊΪ100Hz£¬¹¤×÷Óڸ߷ֱæÂÊ״̬£¬ÖжÏδËøס
	WriteSingleToLSM9DS0_XM(CTRL_REG6_XM,0x00);
	//ÉèÖôÅÁ¦¼ÆÁ¿³Ì+-2gs£¬Ê¹ÄܼÓËٶȼÆ×Լ칦ÄÜ
	WriteSingleToLSM9DS0_XM(CTRL_REG7_XM,0x80);//?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
	//¸ßͨÂ˲¨Æ÷Õý³£Ä£Ê½£¬ÉèÖüÓËٶȼƹ¤×÷ÓÚ±ê׼ģʽ£¬´Å´«¸ÐÆ÷Á¬Ðøת»»Ä£Ê½
	//WriteSingleToLSM9DS0_XM(FIFO_CTRL_REG,0x40);//?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
	//FIFOģʽ00000000:Bypass mode;00100000:FIFO mode;01000000:Stream mode......
}




你可能感兴趣的:(芯片驱动程序)