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