/*
读LIS302DL传感器X、Y、Z轴向寄存器
*/
@main.c
#include "stm32f10x.h"
#include "lcd.h"
#include "stdio.h"
#include "main.h"
#include "mems.h"
#include "i2c.h"
#include "math.h"
u32 DelayTiming = 0;
int main(void)
{
u8 str[20];
u8 *ptr;
SysTick_Config(SystemCoreClock/1000);
STM3210B_LCD_Init();
LCD_Clear(White);
i2c_init();
LIS302DL_Config();
LCD_SetTextColor(White);
LCD_SetBackColor(Blue);
LCD_ClearLine(Line0);
LCD_ClearLine(Line1);
LCD_ClearLine(Line2);
LCD_ClearLine(Line3);
LCD_ClearLine(Line4);
LCD_DisplayStringLine(Line1,(u8*)" MEMS DEMO ");
//
if(LIS302DL_Check() == 1){
LCD_DisplayStringLine(Line3, (u8 *)" MEMS STATUS: OK");
}else{
LCD_DisplayStringLine(Line3, (u8 *)" MEMS STATUS: ERROR");
}
LCD_SetTextColor(Blue);
LCD_SetBackColor(White);
while(1){
ptr = Lis302DL_Output();
snprintf((char *)str, sizeof(str), " X Reg:%d ", ptr[0]);
LCD_DisplayStringLine(Line6,str);
snprintf((char *)str, sizeof(str), " Y Reg:%d ", ptr[1]);
LCD_DisplayStringLine(Line7,str);
snprintf((char *)str, sizeof(str), " Z Reg:%d ", ptr[2]);
LCD_DisplayStringLine(Line8,str);
Delay_Ms(200);
}
}
//
void Delay_Ms(u32 nTime)
{
DelayTiming = nTime;
while(DelayTiming != 0);
}
@mems.c
#include "stm32f10x.h"
#include "i2c.h"
#include "mems.h"
#include "main.h"
u8 alz[3] ;
//
void LIS302DL_Write(unsigned char reg,unsigned char info)
{
I2CStart();
I2CSendByte(0x38);
I2CWaitAck();
I2CSendByte(reg);
I2CWaitAck();
I2CSendByte(info);
I2CWaitAck();
I2CStop();
}
//
uint8_t LIS302DL_Read(uint8_t address)
{
unsigned char val;
I2CStart();
I2CSendByte(0x38);
I2CWaitAck();
I2CSendByte(address);
I2CWaitAck();
I2CStart();
I2CSendByte(0x39);
I2CWaitAck();
val = I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return(val);
}
//
u8* Lis302DL_Output(void)
{
if((LIS302DL_Read(0x27) & 0x08) != 0){
alz[0] = (LIS302DL_Read(0x29)); //x
alz[1] = (LIS302DL_Read(0x2B)); //y
alz[2] = (LIS302DL_Read(0x2D)); //z
}
return alz;
}
//
void LIS302DL_Config(void)
{
LIS302DL_Write(CTRL_REG1,0x47);
LIS302DL_Write(CTRL_REG2,0x00);
LIS302DL_Write(CTRL_REG3,0xC1);
LIS302DL_Write(FF_WU_THS_1,0x28);
LIS302DL_Write(FF_WU_DURATION_1,40);
LIS302DL_Write(FF_WU_CFG_1,0x10);
}
//
uint8_t LIS302DL_Check(void)
{
if(LIS302DL_Read(0x0f)){
return 1;
}else{
return 0;
}
}
@mems.h
#ifndef __MEMS_H
#define __MEMS_H
#include "stm32f10x.h"
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define FF_WU_THS_1 0x32
#define FF_WU_DURATION_1 0x33
#define FF_WU_CFG_1 0x30
#define STATUS_REG 0x27
uint8_t LIS302DL_Check(void);
void LIS302DL_Config(void);
u8* Lis302DL_Output(void);
#endif
@main.h
#ifndef __MAIN_H
#define __MAIN_H
void Delay_Ms(uint32_t nTime);
#endif