STM32

STM32的;LIS3DH三轴驱动

LIS3DH

    LIS3DH是ST公司推出的一款三轴加速度传感器,它支持SPI协议和I2C协议,我花费了大概一整个周的时间调试的SPI协议通信,这里就自己做一个总结,帮助其他的一些朋友们,在过程中也是走了很多弯路,多说无益,还是直接回归主题。

在这里插入图片描述

引脚说明:这里就只说一下SPI的接线哈
4 SCL 接SPI的时钟信号SC
7 SDO 接SPI的MISO引脚
6 SDA 接SPI的MOSI引脚
8 CS 接SPI的片选信号CS
其他的接线有VCC,GND即可。
接下来附上相关代码

相关代码

这里我是使用移植的官方LIS3DH驱动代码,主要编写自己的SPI配置,SPI读入,写入数据即可

/*******************************************************************************
* Function Name		: LIS3DH_ReadReg
* Description		: Generic Reading function. It must be fullfilled with either
*			: I2C or SPI reading functions					
* Input			: Register Address
* Output		: Data REad
* Return		: None
*******************************************************************************/
uint8_t LIS3DH_ReadReg(uint8_t Reg, uint8_t* Data) {
  
	//To be completed with either I2c or SPI reading function
	//i.e. *Data = SPI_Mems_Read_Reg( Reg );
	*Data = LIS3DH_SPI_Read(Reg);
	
	return 1;
}


/*******************************************************************************
* Function Name		: LIS3DH_WriteReg
* Description		: Generic Writing function. It must be fullfilled with either
*			: I2C or SPI writing function
* Input			: Register Address, Data to be written
* Output		: None
* Return		: None
*******************************************************************************/
uint8_t LIS3DH_WriteReg(uint8_t WriteAddr, uint8_t Data) {
  
	//To be completed with either I2c or SPI writing function
	//i.e. SPI_Mems_Write_Reg(WriteAddr, Data);

	LIS3DH_SPI_Write(WriteAddr,Data);

	return 1;
}

上面这两个程序代码是需要自己去在官方给定的代码中自己去编写实现的,主要功能是实现LIS3DH的读,写数据

void LIS3DH_Init()	
{
	LIS3DH_SetODR(LIS3DH_ODR_50Hz);                                                   //设置LIS3DH转换速率为50Hz
	LIS3DH_SetMode(LIS3DH_NORMAL);                                                    //设置LIS3DH为标准模式
	LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2);                                          //设置LIS3DH的量程为2G
	LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE);              //使能X,Y,Z轴的数据转换

}


void LIS3DH_Data_Init()	
{ 
	AxesRaw_t data;
	uint8_t response;
	uint8_t lisid;
        uint8_t lisidtemp;
 	// Read ID
	LIS3DH_GetWHO_AM_I(&lisidtemp);  
	lisid=(uint16_t)lisidtemp;
	printf("LIS3DH ID: %x \r\n",lisid);
	//get Acceleration Raw data  
	response=LIS3DH_GetAccAxesRaw(&data);
	delay_us(10); 
	
	if(response==1)
	{
		
		printf("Original value:x=%d, y=%d, z=%d\r\n", data.AXIS_X, data.AXIS_Y, data.AXIS_Z);
		printf( "Processing after speed:[x]%dmg,[y]%dmg,[z]%dmg\r\n", 
				(int16_t)((float)data.AXIS_X*4/65536*1000), 
				(int16_t)((float)data.AXIS_Y*4/65536*1000), 
				(int16_t)((float)data.AXIS_Z*4/65536*1000));
	
	}
}

//SPI2读函数
u8 LIS3DH_SPI_Read(u8 Reg)
{
    u8  temp;
    GPIO_ResetBits(GPIOB,GPIO_Pin_12);                     //拉低SPI的CS片选信号
    delay_us(1);
    SPI2_ReadWriteByte(Reg|0x80);//&0xbf                   
    temp = SPI2_ReadWriteByte(0xff);                      //读取SPI2的数据
    delay_us(1);
    GPIO_SetBits(GPIOB,GPIO_Pin_12);                      //拉高SPI的CS片选信号
    return temp;
}


//SPI2写函数
void LIS3DH_SPI_Write(u8 WriteAddr,u8 Data)
{	
    GPIO_ResetBits(GPIOB,GPIO_Pin_12);                     //拉低SPI的CS片选信号
    delay_us(1);
    SPI2_ReadWriteByte(WriteAddr&0x7f);                     
    SPI2_ReadWriteByte(Data);                             //SPI2写入数据
    delay_us(1);
    GPIO_SetBits(GPIOB,GPIO_Pin_12);                     //拉高SPI的CS片选信号
}

上面部分是LIS3DH的初始化,读取数据的代码功能实现
可参考,亲测有用。相关的驱动文件和完整工程我后期会发布到csdn的官网上,这篇文章是自己的第一篇博客,可能讲解的不太清,希望大家不要介意,如果有不懂或有需要的可以加群号,后期的所有资料都会分享,致力做一个开源的电子博主
在下的csdn博客群:705260337

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式驱动小子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值