本程序对应的开发板为蓝桥杯嵌入式开发板stm32f103rbt6,为中型mcu。LIS302DL是三轴±2g/±8g智能数字输出加速度传感器,提供I2C/SPI接口,扩展板使用的是I2C接口器件地址是0x38。
主要寄存器及其地址
硬件连接如下
P2.1(PA4)-P2.2(SCL)
P2.3(PA5)-P2.4(SDA)
同时断开下列连接
P4.4(PA4)-P3.4(AO1)或P5.4(TRAO)
P4.5(PA5)-P3.5(AO2)或P5.5(AKEY)
由于引脚冲突,加速度传感器不能和AO1/AO2或TRAO/AKEY同时使用。
由于需要I2C通信这里基于i2c.c进行修改如下
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
主程序
#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);
}
extern u32 DelayTiming;
void SysTick_Handler(void)
{
if(DelayTiming != 0){
DelayTiming--;
}
}