zhangbo
2025-04-21 57b984b8395bb30b2d170369c75f19722502b104
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  :写入数据的目的地址