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