From 57b984b8395bb30b2d170369c75f19722502b104 Mon Sep 17 00:00:00 2001 From: zhangbo <zhangbo@qq.com> Date: 星期一, 21 四月 2025 16:38:37 +0800 Subject: [PATCH] 新增加速度计步数检测功能,3s发一次数据和停止30秒1分钟发一次数据 --- keil/include/drivers/lis3dh_driver.c | 165 +++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 129 insertions(+), 36 deletions(-) diff --git a/keil/include/drivers/lis3dh_driver.c b/keil/include/drivers/lis3dh_driver.c index 0d2639b..66b7496 100644 --- a/keil/include/drivers/lis3dh_driver.c +++ b/keil/include/drivers/lis3dh_driver.c @@ -32,6 +32,7 @@ #include "mk_io.h" #include "mk_gpio.h" #include "global_param.h" +#include "PCA9555.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ @@ -202,30 +203,85 @@ io_pull_set(SDA_PIN , IO_PULL_UP, IO_PULL_UP_LEVEL2);//输出高阻态 gpio_pin_set_dir(SCL_PIN , GPIO_DIR_OUT, 1); - //io_open_drain_set(SCL_PIN, 1);//设置开漏输出 +// io_open_drain_set(SCL_PIN, 1);//设置开漏输出 io_pull_set(SCL_PIN , IO_HIGH_Z, IO_PULL_UP_NONE); } uint8_t lisid; uint8_t lisidtemp; -void Accelerometer_Init() +//void Accelerometer_Init() +//{ + +// LIS3DH_GetWHO_AM_I(&lisidtemp); + +// lisid=(uint16_t)lisidtemp; + +// if(lisid == 0x33) +// { +// LIS3DH_Data_Init(); +// } +// else if(lisid == 0x13) +// { +// mir3da_init(); +// } +// else +// { +// g_com_map[IMU_ENABLE]=0; +// } +// + +//} +void Accelerometer_Init() { - - LIS3DH_GetWHO_AM_I(&lisidtemp); - lisid=(uint16_t)lisidtemp; - - if(lisid == 0x33) - { - LIS3DH_Data_Init(); - } - else - { - g_com_map[IMU_ENABLE]=0; - } - + lisid = mir3da_ReadOneByte(REG_CHIP_ID); + + if(lisid == 0x13) + { + mir3da_init(); + } + else + { + LIS3DH_GetWHO_AM_I(&lisidtemp); + lisid=(uint16_t)lisidtemp; + + if(lisid == 0x33) + { + LIS3DH_Data_Init(); + } + else + { + g_com_map[IMU_ENABLE]=0; + } + } } - +//void Accelerometer_Init() +//{ +//// lisid = mir3da_ReadOneByte(REG_CHIP_ID); +//// +// if(lisid == 0x13) +// { +// mir3da_init(); +// } +//// else +//// { +// LIS3DH_GetWHO_AM_I(&lisidtemp); +// lisid=(uint16_t)lisidtemp; +// +//// if(lisid == 0x33) +//// { +//// LIS3DH_Data_Init(); +//// } +// if(lisid == 0x13) +// { +// mir3da_init(); +// } +// else +// { +// g_com_map[IMU_ENABLE]=0; +// } +//// } +//} void mir3da_init() { u8_m data_m = 0; @@ -520,7 +576,7 @@ { uint8_t ucErrTime=0; // IIC2_SDA_IN(); //SDA设置为输入 - gpio_pin_set_dir(SDA_PIN , GPIO_DIR_IN, 1); + gpio_pin_set_dir(SDA_PIN , GPIO_DIR_IN, 0); SDA_1; delay_us(6); SCL_1; @@ -532,10 +588,11 @@ if(ucErrTime>250) { IIC2_Stop(); + gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1); return 1; } } - gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1); + gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 0); SCL_0;//时钟输出0 return 0; } @@ -596,6 +653,7 @@ { unsigned char i,receive=0; // IIC2_SDA_IN();//SDA设置为输入 + gpio_pin_set_dir(SDA_PIN,GPIO_DIR_IN,0); //设置为输入读取电平 for(i=0; i<8; i++ ) { SCL_0; @@ -605,26 +663,46 @@ if(IIC2_READ_SDA)receive++; delay_us(5); } - if (!ack) - IIC2_NAck();//发送nACK - else - IIC2_Ack(); //发送ACK + if (!ack){ + IIC2_NAck();//发送nACK + gpio_pin_set_dir(SDA_PIN,GPIO_DIR_OUT,0); //设置为输出恢复ACK + } + else{ + IIC2_Ack(); //发送ACK + gpio_pin_set_dir(SDA_PIN,GPIO_DIR_OUT,1); //设置为输出恢复ACK + } + return receive; } //在LIS3DH里面的指定地址开始读一字节数据 //ReadAddr :读出的地址 //返回值 :读出的数据 +//uint8_t LIS3DH_ReadOneByte(uint16_t ReadAddr) +//{ +// uint8_t temp=0; +// IIC2_Start(); +// IIC2_Send_Byte(0X32); //发送写命令 +// IIC2_Wait_Ack(); +// IIC2_Send_Byte(ReadAddr); //发送读地址 +// IIC2_Wait_Ack(); +// IIC2_Start(); +// IIC2_Send_Byte(0X33); //发送读命令,进入接收模式 +// IIC2_Wait_Ack(); +// temp=IIC2_Read_Byte(0); +// IIC2_Stop(); //产生一个停止条件 +// return temp; +//} uint8_t LIS3DH_ReadOneByte(uint16_t ReadAddr) { uint8_t temp=0; IIC2_Start(); - IIC2_Send_Byte(0X32); //发送写命令 + IIC2_Send_Byte(0X4e); //发送写命令 IIC2_Wait_Ack(); IIC2_Send_Byte(ReadAddr); //发送读地址 IIC2_Wait_Ack(); IIC2_Start(); - IIC2_Send_Byte(0X33); //发送读命令,进入接收模式 + IIC2_Send_Byte(0X4f); //发送读命令,进入接收模式 IIC2_Wait_Ack(); temp=IIC2_Read_Byte(0); IIC2_Stop(); //产生一个停止条件 @@ -680,20 +758,35 @@ //在mir3da里面的指定地址开始读一字节数据 //ReadAddr :读出的地址 //返回值 :读出的数据 +//uint8_t mir3da_ReadOneByte(uint16_t ReadAddr) +//{ +// uint8_t temp=0; +// IIC2_Start(); +// IIC2_Send_Byte(0X4e); //发送写命令 +// IIC2_Wait_Ack(); +// IIC2_Send_Byte(ReadAddr); //发送读地址 +// IIC2_Wait_Ack(); +// IIC2_Start(); +// IIC2_Send_Byte(0X4f); //发送读命令,进入接收模式 +// IIC2_Wait_Ack(); +// temp=IIC2_Read_Byte(0); +// IIC2_Stop(); //产生一个停止条件 +// return temp; +//} uint8_t mir3da_ReadOneByte(uint16_t ReadAddr) { - uint8_t temp=0; - IIC2_Start(); - IIC2_Send_Byte(0X4e); //发送写命令 - IIC2_Wait_Ack(); - IIC2_Send_Byte(ReadAddr); //发送读地址 - IIC2_Wait_Ack(); - IIC2_Start(); - IIC2_Send_Byte(0X4f); //发送读命令,进入接收模式 - IIC2_Wait_Ack(); - temp=IIC2_Read_Byte(0); - IIC2_Stop(); //产生一个停止条件 - return temp; + uint8_t temp=0; + IIC2_Start(); + IIC2_Send_Byte(0X4e); //发送写命令 + IIC2_Wait_Ack(); + IIC2_Send_Byte(ReadAddr); //发送读地址 + IIC2_Wait_Ack(); + IIC2_Start(); + IIC2_Send_Byte(0X4f); //发送读命令,进入接收模式 + IIC2_Wait_Ack(); + temp=IIC2_Read_Byte(0); + IIC2_Stop(); //产生一个停止条件 + return temp; } //在mir3da指定地址写入一个数据 //WriteAddr :写入数据的目的地址 -- Gitblit v1.9.3