单片机 ADXL346 IIC通讯

发布者:糖三角最新更新时间:2022-10-08 来源: csdn关键字:单片机  ADXL346  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};

/******************

笔记:

1、DelayTick = 2

2、ADDR:SD0==0==0xA6 ; SD0==1==0x3A  【写命令0xA6  读命令0xA6|1】

*******************/

code IIC_TYPE ADXL346 = {2, 0xA6};

/* -----------------------------------------全局变量定义-----------------------------------*/

xdata uint8_t GET_DATA[6] = {0, 0, 0, 0, 0, 0};         //用于记录IIC返回的XYZ

xdata uint8_t  Brake_Motion             = 0;            //当空间值大于阈值,即代表运动过

xdata uint8_t  Motion_TIME              = 0;            //用于清除运动标记,计数2S左右,如果没有发生刹车则清零

xdata uint16_t Spatial_value_Cumulative = 0;

/* -----------------------------------------应用程序---------------------------------------*/


/*********************************************

函数名:ADXL346_Configuration

功  能:ADXL346器件初始化配置

形  参:INTI:1--初始化方向 0--不初始化方向

返回值:

备  注:

作  者:薛建强

时  间:2019/06/11

**********************************************/

void ADXL346_Configuration(const uint8_t INIT)

{

    IIC_Init();          // I2C初始化

    clr_EA;//关闭中断

    clr_EX0;

    P30_Input_Mode;


    ADXL346_Read_DATA(ACT_TAP_STATUS);//中断清零前,应读取ACT_TAP_STATUS寄存器

    ADXL346_Read_DATA(INT_SOURCE);//读取ADX346中断标志寄存器,读一次清空一次中断标记


    ADXL346_Write_DATA(POWER_CTL,   0x03); //设置时需进入休眠模式 1HZ

    ADXL346_Write_DATA(DATA_FORMAT, 0x0A); //+8g,寄存器0x31—DATA_FORMAT(读/写)--中断设为高电平有效--全分辨率模式--右对齐模式

    ADXL346_Write_DATA(BW_RATE,     0x0D); //相当于800 Hz的输出数据速率。即1.25ms采集一次

    if (INIT)

    {

        /*竖立*/

        ADXL346_Write_DATA(OFSX, Factory_X); //写入X偏移量 -250校正为0

        ADXL346_Write_DATA(OFSY, Factory_Y); //写入Y偏移量  无偏移

        ADXL346_Write_DATA(OFSZ, Factory_Z); //写入Z偏移量  校正为0

    }


    ADXL346_Write_DATA(FIFO_CTL, 0xA8); //FIFO流模式 将触发模式下的触发事件链接至INT1



    /*中断配置*/

    ADXL346_Read_DATA(ACT_TAP_STATUS);          //中断清零前,应读取ACT_TAP_STATUS寄存器

    ADXL346_Read_DATA(INT_SOURCE);              //读取ADX346中断标志寄存器,读一次清空一次中断标记

    ADXL346_Write_DATA(INT_ENABLE,    0x00);    //禁用 中断


    ADXL346_Write_DATA(THRESH_ACT,    Activity_threshold);               //   活动阈值     变化幅度>6

    ADXL346_Write_DATA(DUR,           Activity_time);                    //   活动阈值时间 单位:16ms

    ADXL346_Write_DATA(THRESH_INACT,  Static_threshold);                 //   静止阈值     变化幅度<6

    ADXL346_Write_DATA(TIME_INACT,    Static_time);                      //   静止时间     单位:5s

    ADXL346_Write_DATA(ACT_INACT_CTL, Active_static_any_axis_selection); //   活动静止任意轴选择 Z轴使能


    ADXL346_Write_DATA(INT_ENABLE, 0x00);  //禁用 中断


    if (SystemReg.BrakeMode == 1)

    {

        ADXL346_Off();

        ADXL346_Write_DATA(INT_ENABLE, 0x18);    //开启动态、静止等中断模式,19页

        ADXL346_Write_DATA(INT_MAP,    0x00);    //使能 中断 ININ1

        ADXL346_Write_DATA(POWER_CTL,  0x08);    //测量模式

    }


    clr_EA;

}



/*********************************************

函数名:ADXL346_Write_DATA

功  能:写 地址 数据

形  参:addr 地址   dat 数据

返回值:

备  注:

作  者:薛建强

时  间:2019/06/11

**********************************************/

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();                  // 停止

}




/*********************************************

函数名:ADXL346_Read_DATA

功  能:读地址数据

形  参:addr--寄存器地址

返回值:

备  注:

作  者:薛建强

时  间:2019/06/11

**********************************************/

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;

}


/*********************************************

函数名:ADXL346_get_data

功  能:读取一次加速度值

形  参:

返回值:

备  注:

作  者:薛建强

时  间:2019/06/11

**********************************************/

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])); //X轴

        XYZ_DATA1.Y = (int)((GET_DATA[3] << 8) | (GET_DATA[2])); //Y轴

    }

    else

    {

        XYZ_DATA1.X = (int)((GET_DATA[3] << 8) | (GET_DATA[2])); //Y轴

        XYZ_DATA1.Y = (int)((GET_DATA[5] << 8) | (GET_DATA[4])); //X轴

    }

    XYZ_DATA1.Z = (int)((GET_DATA[1] << 8) | (GET_DATA[0])); //Z轴

}


/*********************************************

函数名:ADXL346_Off

功  能:进入暂停模式

形  参:

返回值:

备  注:

作  者:薛建强

时  间:2019/06/11

**********************************************/

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;

/*********************************************

函数名:ADXL346_FIFORead

功  能:从缓冲器中读取一次32个值,并求平均值

形  参:pData:存储平均值后的XYZ值

返回值:

备  注:

作  者:薛建强

时  间:2019/08/30

使  用:

**********************************************/

#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();                // 等待数据响应

[1] [2] [3]
关键字:单片机  ADXL346  IIC通讯 引用地址:单片机 ADXL346 IIC通讯

上一篇:[单片机][N76E003][MCP4017][MCP4018][MCP4019] 数字电位器 使用方法 例子 代码
下一篇:[单片机][IIC/I2C][APDS9960] 手势传感器 4种手势

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved