IIC协议链接
#include "ADXL346.h"
#include "math.h"
#if BrakeMode_EN
ADXL346_XYZ xdata XYZ_DATA = {0, 0, 0};
ADXL346_XYZ xdata XYZ_DATA1 = {0, 0, 0};
code IIC_TYPE ADXL346 = {2, 0xA6};
xdata uint8_t GET_DATA[6] = {0, 0, 0, 0, 0, 0};
xdata uint8_t Brake_Motion = 0;
xdata uint8_t Motion_TIME = 0;
xdata uint16_t Spatial_value_Cumulative = 0;
void ADXL346_Configuration(const uint8_t INIT)
{
IIC_Init();
clr_EA;
clr_EX0;
P30_Input_Mode;
ADXL346_Read_DATA(ACT_TAP_STATUS);
ADXL346_Read_DATA(INT_SOURCE);
ADXL346_Write_DATA(POWER_CTL, 0x03);
ADXL346_Write_DATA(DATA_FORMAT, 0x0A);
ADXL346_Write_DATA(BW_RATE, 0x0D);
if (INIT)
{
ADXL346_Write_DATA(OFSX, Factory_X);
ADXL346_Write_DATA(OFSY, Factory_Y);
ADXL346_Write_DATA(OFSZ, Factory_Z);
}
ADXL346_Write_DATA(FIFO_CTL, 0xA8);
ADXL346_Read_DATA(ACT_TAP_STATUS);
ADXL346_Read_DATA(INT_SOURCE);
ADXL346_Write_DATA(INT_ENABLE, 0x00);
ADXL346_Write_DATA(THRESH_ACT, Activity_threshold);
ADXL346_Write_DATA(DUR, Activity_time);
ADXL346_Write_DATA(THRESH_INACT, Static_threshold);
ADXL346_Write_DATA(TIME_INACT, Static_time);
ADXL346_Write_DATA(ACT_INACT_CTL, Active_static_any_axis_selection);
ADXL346_Write_DATA(INT_ENABLE, 0x00);
if (SystemReg.BrakeMode == 1)
{
ADXL346_Off();
ADXL346_Write_DATA(INT_ENABLE, 0x18);
ADXL346_Write_DATA(INT_MAP, 0x00);
ADXL346_Write_DATA(POWER_CTL, 0x08);
}
clr_EA;
}
void ADXL346_Write_DATA(const uint8_t addr, const uint8_t DATA)
{
IIC_Start();
IIC_WriteByte(ADXL346.ADDR);
IIC_Wait_ACK();
IIC_WriteByte(addr);
IIC_Wait_ACK();
IIC_WriteByte(DATA);
IIC_Wait_ACK();
IIC_Stop();
}
uint8_t ADXL346_Read_DATA(const uint8_t addr)
{
uint8_t GET_DATA = 0;
IIC_Start();
IIC_WriteByte(ADXL346.ADDR);
IIC_Wait_ACK();
IIC_WriteByte(addr);
IIC_Wait_ACK();
IIC_Start();
IIC_WriteByte(ADXL346.ADDR | 1);
IIC_Wait_ACK();
GET_DATA = IIC_ReadByte();
IIC_Wait_ACK();
IIC_Stop();
return GET_DATA;
}
void ADXL346_get_data(void)
{
uint8_t i = 0;
IIC_Start();
IIC_WriteByte(ADXL346.ADDR);
IIC_Wait_ACK();
IIC_WriteByte(0x32);
IIC_Wait_ACK();
IIC_Start();
IIC_WriteByte(ADXL346.ADDR | 1);
IIC_Wait_ACK();
for (i = 0; i < 6; i++)
{
if (i == 5)
{
GET_DATA[i] = IIC_ReceiveData(0);
}
else
{
GET_DATA[i] = IIC_ReceiveData(1);
}
}
IIC_Stop();
if (Brake_Reg.Current_direction == 1 || Brake_Reg.Current_direction == 0)
{
XYZ_DATA1.X = (int)((GET_DATA[5] << 8) | (GET_DATA[4]));
XYZ_DATA1.Y = (int)((GET_DATA[3] << 8) | (GET_DATA[2]));
}
else
{
XYZ_DATA1.X = (int)((GET_DATA[3] << 8) | (GET_DATA[2]));
XYZ_DATA1.Y = (int)((GET_DATA[5] << 8) | (GET_DATA[4]));
}
XYZ_DATA1.Z = (int)((GET_DATA[1] << 8) | (GET_DATA[0]));
}
void ADXL346_Off(void)
{
IIC_Start();
IIC_WriteByte(ADXL346.ADDR);
IIC_Wait_ACK();
IIC_WriteByte(0x2D);
IIC_Wait_ACK();
IIC_WriteByte(0x04);
IIC_Wait_ACK();
IIC_Stop();
}
uint16_t StopState_Time_S = 0;
#define ReadNum 7
void ADXL346_FIFORead(ADXL346_XYZ *pData)
{
uint8_t i = 0, Loop = 0;
int X = 0, Y = 0, Z = 0;
uint16_t Spatial_value = 0;
for (Loop = 0; Loop < ReadNum; Loop++)
{
IIC_Start();
IIC_WriteByte(ADXL346.ADDR);
IIC_Wait_ACK();
IIC_WriteByte(0x32);
IIC_Wait_ACK();
IIC_Start();
IIC_WriteByte(ADXL346.ADDR | 1);
IIC_Wait_ACK();
for (i = 0; i < 6; i++)
{
if (i == 5)
{
GET_DATA[i] = IIC_ReceiveData(0);
}
else
{
GET_DATA[i] = IIC_ReceiveData(1);
}
}
IIC_Stop();
if (Brake_Reg.Current_direction == 1 || Brake_Reg.Current_direction == 0)
{
X += (int)((GET_DATA[1] << 8) | (GET_DATA[0]));
Y += (int)((GET_DATA[3] << 8) | (GET_DATA[2]));
}
else
{
X += (int)((GET_DATA[3] << 8) | (GET_DATA[2]));
Y += (int)((GET_DATA[1] << 8) | (GET_DATA[0]));
}
Z += (int)(~((GET_DATA[5] << 8) | (GET_DATA[4])) + 1);
os_wait(K_IVL, 5, 0);
}
pData->X = X / ReadNum / 4;
pData->Y = Y / ReadNum / 4;
pData->Z = Z / ReadNum / 4;
if (((abs(pData->X) * 0.9 < pData->Z) || (abs(pData->X) < pData->Z)) && ((abs(pData->Y) * 0.9 < pData->Z) || abs(pData->Y) < 30))
{
Spatial_value = sqrt(pData->X * pData->X + pData->Y * pData->Y + pData->Z * pData->Z);
if (Spatial_value >= 5)
{
if (Brake_Reg.Brake_OK < 250 && pData->Z > 0)
{
Brake_Motion = 1;
Motion_TIME = 0;
if (Brake_Reg.Brake_OK < 8 && ++Brake_Reg.Brake_OK >= 7)
{
Brake_Reg.Brake_OK = 7;
}
Spatial_value_Cumulative += Spatial_value;
if (Brake_Reg.Brake_OK > 3 && Brake_Reg.Motion_State > 0)
{
Brake_Reg.Brake_OK = 0;
Brake_Motion = 0;
Spatial_value_Cumulative = 0;
Brake_Time_Add();
}
else if (Brake_Reg.Brake_OK > 2 && ((Spatial_value_Cumulative / Brake_Reg.Brake_OK) >= 9) && Brake_Reg.Motion_State > 0)
{
Brake_Reg.Brake_OK = 0;
Brake_Motion = 0;
Spatial_value_Cumulative = 0;
Brake_Time_Add();
}
}
}
else
{
Brake_Reg.Brake_OK = 0;
Spatial_value_Cumulative = 0;
os_wait(K_IVL, 1, 0);
}
}
else
{
Brake_Reg.Brake_OK = 0;
os_wait(K_IVL, 1, 0);
}
if (abs(pData->X - XYZ_DATA1.X) < 5 && abs(pData->Y - XYZ_DATA1.Y) < 5 && abs(pData->Z - XYZ_DATA1.Z) < 5)
{
if (StopState_Time_S < 650 && ++StopState_Time_S > 600)
{
StopState_Time_S = 0;
if (Brake_Reg.StopState_Time < 250)
{
Brake_Reg.StopState_Time++;
}
}
if (Brake_Reg.StopState_Num < 40)
{
Brake_Reg.StopState_Num++;
}
else
{
Brake_Reg.StopState_Num = 0;
if (Brake_Reg.StopState_FLAG == 1)
{
if (abs(pData->X) > 50 || abs(pData->Y) > 50)
{
}
else
{
ADXL346_jiaozhun();
Brake_Reg.StopState_FLAG = 0;
Brake_Time_On = 40;
}
}
}
}
else
{
if (Brake_Reg.StopState_Time >= 5)
{
PWM_Change = 0;
CoefficientVaue = 100;
SystemReg.RunningState = 0;
Brake_Reg.LEDOff = 1;
}
Brake_Reg.StopState_Num = 0;
StopState_Time_S = 0;
}
if (abs(pData->X) > 4 || abs(pData->Y) > 4 || abs(pData->Z) > 4)
{
if (Brake_Reg.Motion_State < 250 && ++Brake_Reg.Motion_State > 5)
{
Brake_Reg.StopState_FLAG = 1;
}
}
XYZ_DATA1 = *pData;
}
void ADXL346_jiaozhun(void)
{
static uint8_t i = 0;
one:
if (jiaozhun_LED) LED_RGB(4);
os_wait(K_IVL, 10, 0);
ADXL346_Write_DATA(OFSX, 0);
os_wait(K_IVL, 10, 0);
ADXL346_Write_DATA(OFSY, 0);
os_wait(K_IVL, 10, 0);
ADXL346_Write_DATA(OFSZ, 0);
os_wait(K_IVL, 250, 0);
ADXL346_get_data();
os_wait(K_IVL, 100, 0);
ADXL346_Write_DATA(OFSX, -(XYZ_DATA1.Z / 4));
os_wait(K_IVL, 10, 0);
ADXL346_Write_DATA(OFSY, -(XYZ_DATA1.Y / 4));
os_wait(K_IVL, 10, 0);
ADXL346_Write_DATA(OFSZ, -(XYZ_DATA1.X / 4));
os_wait(K_IVL, 250, 0);
ADXL346_get_data();
if (abs((XYZ_DATA1.Z / 4)) > 3 || abs((XYZ_DATA1.Y / 4)) > 3 || abs((XYZ_DATA1.X / 4)) > 3)
{
if (i < 250 && ++i > 5)
{
if (jiaozhun_LED) LED_OFF();
Brake_Reg.StopState_FLAG = 0;
ADXL346_Configuration(1);
return;
}
if (i >= 250) i = 0;
os_wait(K_IVL, 5, 0);
goto one;
}
Brake_Reg.Motion_State = 0;
Brake_Reg.BrakeTriggerFlag = 0;
Brake_Reg.Collect_Tmr = 0;
Brake_Reg.StopState_FLAG = 0;
if (jiaozhun_LED) LED_OFF();
i = 0;
}
void ADXL346_INT_EN(const uint8_t En)
{
if (En == 1)
{
ADXL346_Write_DATA(INT_MAP, 0x00);
ADXL346_Write_DATA(DATA_FORMAT, 0x2B);
ADXL346_Write_DATA(INT_ENABLE, 0x10);
Brake_Reg.Interrupt = 0x10;
clr_EA;
P30_Input_Mode;
set_IT0;
set_EX0;
set_EA;
}
else
{
ADXL346_Write_DATA(INT_ENABLE, 0x00);
clr_EX0;
clr_EA;
}
}
void ADXL346_Motion_Quiet_Interrupt(uint8_t ch)
{
ADXL346_Read_IQn();
os_wait(K_IVL, 10, 0);
ADXL346_Off();
os_wait(K_IVL, 10, 0);
ADXL346_Write_DATA(INT_ENABLE, ch);
Brake_Reg.Interrupt = 0x10;
os_wait(K_IVL, 5, 0);
ADXL346_Write_DATA(INT_MAP, 0x00);
os_wait(K_IVL, 5, 0);
ADXL346_Write_DATA(POWER_CTL, 0x08);
os_wait(K_IVL, 5, 0);
LowPower_Tmr = 180;
Brake_Reg.Motion_State = 0;
os_wait(K_IVL, 10, 0);
}
void ADXL346_Read_IQn(void)
{
ADXL346_Read_DATA(0x2B);
ADXL346_Read_DATA(0x30);
}
#endif
#ifndef __ADXL346_H
#define __ADXL346_H
#include "main.h"
#define DEVICE_ID 0X00
#define THRESH_TAP 0X1D
#define OFSX 0X1E
#define OFSY 0X1F
#define OFSZ 0X20
#define DUR 0X21
#define Latent 0X22
#define Window 0X23
#define THRESH_ACT 0X24
#define THRESH_INACT 0X25
#define TIME_INACT 0X26
#define ACT_INACT_CTL 0X27
#define THRESH_FF 0X28
#define TIME_FF 0X29
#define TAP_AXES 0X2A
#define ACT_TAP_STATUS 0X2B
#define BW_RATE 0X2C
#define POWER_CTL 0X2D
#define INT_ENABLE 0X2E
#define INT_MAP 0X2F
#define INT_SOURCE 0X30
#define DATA_FORMAT 0X31
#define DATA_X0 0X32
#define DATA_X1 0X33
#define DATA_Y0 0X34
#define DATA_Y1 0X35
#define DATA_Z0 0X36
#define DATA_Z1 0X37
#define FIFO_CTL 0X38
#define FIFO_STATUS 0X39
#define ADXL_READ 0X3B
#define ADXL_WRITE 0X3A
#define Factory_X (-71)
#define Factory_Y (0)
#define Factory_Z (4)
#define Activity_threshold 6
#define Activity_time 16
#define Static_threshold 6
#define Static_time 5
#define Active_static_any_axis_selection 0x9F
#define jiaozhun_LED 0
typedef struct
{
int X;
int Y;
int Z;
}ADXL346_XYZ;
extern ADXL346_XYZ xdata XYZ_DATA;
extern ADXL346_XYZ xdata XYZ_DATA1;
extern xdata uint8_t Brake_Motion;
extern uint16_t StopState_Time_S;
void ADXL346_Configuration(const uint8_t INIT);
void ADXL346_Write_DATA (const uint8_t addr,const uint8_t DATA);
uint8_t ADXL346_Read_DATA (const uint8_t addr);
void ADXL346_get_data (void);
void ADXL346_Off (void);
void ADXL346_INT_EN (const uint8_t En);
void ADXL346_FIFORead (ADXL346_XYZ *pData);
void ADXL346_jiaozhun (void);
void ADXL346_Motion_Quiet_Interrupt(uint8_t ch);
void ADXL346_Read_IQn (void);
#endif
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具