/******************** (C) COPYRIGHT 2012 STMicroelectronics ********************
* File Name : LIS3DH_driver.c
* Author : MSH Application Team
* Author : Fabio Tota
* Version : $Revision:$
* Date : $Date:$
* Description : LIS3DH driver file
*
* HISTORY:
* Date | Modification | Author
* 24/06/2011 | Initial Revision | Fabio Tota
* 11/06/2012 | Support for multiple drivers in the same program | Abhishek Anand
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*
* THIS SOFTWARE IS SPECIFICALLY DESIGNED FOR EXCLUSIVE USE WITH ST PARTS.
*
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "lis3dh_driver.h"
#include "delay.h"
#include "usart.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
//int main(void)
//{
// delay_init(); //延时函数初始化
// uart_init(115200); //串口初始化为115200
// IIC2_Init();
// delay_ms(100);
// while(1)
// {
// LIS3DH_Data_Init();
// delay_ms(1000);
// }
//
//}
//OLED初始化IIC
void IIC2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11); //PB6,PB7 输出高
}
void LIS3DH_Data_Init()
{
//uint8_t buffer[26];
AxesRaw_t data;
uint8_t lisid,response;
uint8_t lisidtemp;
//set ODR (turn ON device)
LIS3DH_SetODR(LIS3DH_ODR_100Hz);
//set PowerMode
LIS3DH_SetMode(LIS3DH_NORMAL);
//set Fullscale
LIS3DH_SetFullScale(LIS3DH_FULLSCALE_2);
//set axis Enable
LIS3DH_SetAxis(LIS3DH_X_ENABLE | LIS3DH_Y_ENABLE | LIS3DH_Z_ENABLE);
// 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);
//print data values
delay_us(10);
if(response==1)
{
printf("传感器原始值:x=%d, y=%d, z=%d\r\n", data.AXIS_X, data.AXIS_Y, data.AXIS_Z);
printf( "处理后的加速度值Accel:[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));
}
}
//产生IIC起始信号
void IIC2_Start(void)
{
// IIC2_SDA_OUT(); //sda线输出
IIC2_SDA=1;
// delay_us(10);
IIC2_SCL=1;
// delay_us(10);
IIC2_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(10);
IIC2_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC2_Stop(void)
{
// IIC2_SDA_OUT();//sda线输出
IIC2_SCL=0;
// delay_us(10);
IIC2_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(10);
IIC2_SCL=1;
// delay_us(10);
IIC2_SDA=1;//发送I2C总线结束信号
delay_us(10);
}
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
uint8_t IIC2_Wait_Ack(void)
{
uint8_t ucErrTime=0;
// IIC2_SDA_IN(); //SDA设置为输入
IIC2_SDA=1;
delay_us(6);
IIC2_SCL=1;
delay_us(6);
while(IIC2_READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC2_Stop();
return 1;
}
}
IIC2_SCL=0;//时钟输出0
return 0;
}
//产生ACK应答
void IIC2_Ack(void)
{
IIC2_SCL=0;
// IIC2_SDA_OUT();
IIC2_SDA=0;
delay_us(10);
IIC2_SCL=1;
delay_us(10);
IIC2_SCL=0;
}
//不产生ACK应答
void IIC2_NAck(void)
{
IIC2_SCL=0;
// IIC2_SDA_OUT();
IIC2_SDA=1;
delay_us(10);
IIC2_SCL=1;
delay_us(10);
IIC2_SCL=0;
}
//IIC发送一个字节,WRITE
//返回从机有无应答
//1,有应答
//0,无应答
void IIC2_Send_Byte(uint8_t txd)
{
uint8_t t;
// IIC2_SDA_OUT();
IIC2_SCL=0;//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
if((txd&0x80)>>7)
{
IIC2_SDA=1;
}
else
{
IIC2_SDA=0;
}
txd <<= 1;
delay_us(10);
IIC2_SCL=1;
delay_us(10);
IIC2_SCL=0;
delay_us(10);
}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC2_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
// IIC2_SDA_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
IIC2_SCL=0;
delay_us(10);
IIC2_SCL=1;
receive<<=1;
if(IIC2_READ_SDA)receive++;
delay_us(5);
}
if (!ack)
IIC2_NAck();//发送nACK
else
IIC2_Ack(); //发送ACK
return receive;
}
//在LIS3DH里面的指定地址开始读一字节数据
//ReadAddr :读出的地址
//返回值 :读出的数据
uint8_t LIS3DH_ReadOneByte(uint16_t ReadAddr)
{
uint8_t temp=0;
IIC2_Start();
IIC2_Send_Byte(0X30); //发送写命令
IIC2_Wait_Ack();
IIC2_Send_Byte(ReadAddr); //发送读地址
IIC2_Wait_Ack();
IIC2_Start();
IIC2_Send_Byte(0X31); //发送读命令,进入接收模式
IIC2_Wait_Ack();
temp=IIC2_Read_Byte(0);
IIC2_Stop(); //产生一个停止条件
return temp;
}
//在LIS3DH指定地址写入一个数据
//WriteAddr :写入数据的目的地址
//DataToWrite:要写入的数据
void LIS3DH_WriteOneByte(uint16_t WriteAddr,uint8_t DataToWrite)
{
IIC2_Start();
IIC2_Send_Byte(0X30); //发送写命令
IIC2_Wait_Ack();
IIC2_Send_Byte(WriteAddr); //发送地址
IIC2_Wait_Ack();
IIC2_Send_Byte(DataToWrite); //发送字节
IIC2_Wait_Ack();
IIC2_Stop();//产生一个停止条件
delay_us(10);
}
//在AT24CXX里面的指定地址开始写入长度为Len的数据
//该函数用于写入16bit或者32bit的数据.
//WriteAddr :开始写入的地址
//DataToWrite:数据数组首地址
//Len :要写入数据的长度2,4
void LIS3DH_WriteLenByte(uint16_t WriteAddr,uint32_t DataToWrite,uint8_t Len)
{
uint8_t t;
for(t=0;t<Len;t++)
{
LIS3DH_WriteOneByte(WriteAddr+t,(DataToWrite>>(8*t))&0xff);
}
}
//在AT24CXX里面的指定地址开始读出长度为Len的数据
//该函数用于读出16bit或者32bit的数据.
//ReadAddr :开始读出的地址
//返回值 :数据
//Len :要读出数据的长度2,4
uint32_t LIS3DH_ReadLenByte(uint16_t ReadAddr,uint8_t Len)
{
uint8_t t;
uint32_t temp=0;
for(t=0;t<Len;t++)
{
temp<<=8;
temp+=LIS3DH_ReadOneByte(ReadAddr+Len-t-1);
}
return temp;
}
/*******************************************************************************
* 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,