首先感谢网上朋友们的分享,我也贴出自己的源码,开源互助!
1、配置:PC8和PC9外部中断,上升沿触发;
#define BW_RATE 0x2C //数据速率和功率模式控制
#define POWER_CTL 0x2D //省电功能控制
#define DATA_FORMAT 0x31 //数据格式控制
#define INT_ENABLE 0x2E //中断使能控制
#define FIFO_CTL 0x38 //FIFO控制
#define THRESH_ACT 0x24 //活动阈值
#define THRESH_INACT 0x25 //静止阈值
#define TIME_INACT 0x26 //静止时间
#define ACT_INACT_CTL 0x27 //轴使能控制活动和静止检测
#define INT_MAP 0x2F //中断引脚映射控制
#define OFSX 0x1E //X轴偏移
#define OFSY 0x1F //Y轴偏移
#define OFSZ 0x20 //Z轴偏移
//中断配置
ADXL345_WriteByte(INT_ENABLE , 0x00); delay345_ms(200); //关闭中断
ADXL345_WriteByte(DATA_FORMAT , 0x0B); delay345_ms(200); //测量范围:中断上升沿,正负±16 g , 右对齐 ,全分辨率模式13位分辨率
ADXL345_WriteByte(BW_RATE , 0x1A); delay345_ms(200); //正常功率:低功耗操作,100Hz输出 ,频率 1hz
ADXL345_WriteByte(POWER_CTL , 0x18); delay345_ms(200); //测量模式 ,自动睡眠
ADXL345_WriteByte(OFSX , 0x00); delay345_ms(200); //X轴偏移
ADXL345_WriteByte(OFSY , 0x00); delay345_ms(200); //Y轴偏移
ADXL345_WriteByte(OFSZ , 0x00); delay345_ms(200); //Z轴偏移
ADXL345_WriteByte(THRESH_ACT,0x20); delay345_ms(200); //活动阈值,激活睡眠activity阈值,大于时触发中断,2 - 2g (不能设置为零)
ADXL345_WriteByte(THRESH_INACT,0x0F); delay345_ms(200); //静止阈值,睡眠开始阈值,最小值,09 - 0.9g (不能设置为零)
ADXL345_WriteByte(TIME_INACT,0x0F); delay345_ms(200); //静止时间,小于THRESH_INACT值宣布静止,进入睡眠,02 - 2秒 (不能设置为零)
ADXL345_WriteByte(ACT_INACT_CTL,0xFF); delay345_ms(200); //直流交流触发配置,XYZ使能触发配置,此处选XYZ交流
ADXL345_WriteByte(INT_MAP,0x00); delay345_ms(200); //中断引脚映射控制,打开活动中断引脚到 INT1 引脚上
// ADXL345_WriteByte(INT_MAP,0x10); delay345_ms(200); //中断引脚映射控制,打开活动中断引脚到 INT2 引脚上
ADXL345_WriteByte(INT_ENABLE,0x10); delay345_ms(200); //开活动 中断
//**************中断回调函数读取数据********
uint8_t re_value =0;
uint8_t re_value =0;
if(HAL_GPIO_ReadPin(ADXL345_INT1_GPIO_Port, ADXL345_INT1_Pin) == GPIO_PIN_SET)
{
re_value = ADXL345_ReadByte(0x30); //最好在 读取数据函数后,在读一次0x30,否则ADXL345不会产生中断
printf("\n ADXL345 1: %x \n",re_value);
}
三、经过测试ADXL345读取时间过快会出现错误,不过增加读取时间可以避免此问题,应该是配置问题,如有解决的大神希望留言,谢谢!
四、普通连续读取模式:
//普通配置
ADXL345_WriteByte(DATA_FORMAT , 0x2B); delay345_ms(200); //测量范围:正负±16 g , 右对齐 ,全分辨率模式13位分辨率
ADXL345_WriteByte(BW_RATE , 0x0A); delay345_ms(200); //正常功率 50Hz输出 带宽25Hz
ADXL345_WriteByte(POWER_CTL , 0x08); delay345_ms(200); //测量模式 ,不会自动睡眠
ADXL345_WriteByte(INT_ENABLE , 0x00); delay345_ms(200); //关闭中断
ADXL345_WriteByte(OFSX , 0x00); delay345_ms(200); //X轴偏移
ADXL345_WriteByte(OFSY , 0x00); delay345_ms(200); //Y轴偏移
ADXL345_WriteByte(OFSZ , 0x00); delay345_ms(200); //Z轴偏移