yincheng.zhong
3 天以前 2ebb8217f43b69f491620423ea4d5d5944d1f91d
keil/include/drivers/lis3dh_driver.c
@@ -168,14 +168,68 @@
static void delay_us(uint32_t nTimer)
{
    uint32_t i=0;
    for(i=0;i<nTimer;i++){
    for(i=0; i<nTimer; i++) {
        __NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
      __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
      __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
      __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
      __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
        __NOP();
    }
@@ -200,7 +254,7 @@
    io_pin_mux_set(SCL_PIN, IO_FUNC0);
    gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1);
      //io_open_drain_set(SDA_PIN, 1);
    //io_open_drain_set(SDA_PIN, 1);
    io_pull_set(SDA_PIN , IO_PULL_UP, IO_PULL_UP_LEVEL2);//输出高阻态
    gpio_pin_set_dir(SCL_PIN , GPIO_DIR_OUT, 1);
@@ -214,18 +268,37 @@
void Accelerometer_Init()
{
    LIS3DH_GetWHO_AM_I(&lisidtemp);
    lisid=(uint16_t)lisidtemp;
//    LIS3DH_GetWHO_AM_I(&lisidtemp);
//    lisid=(uint16_t)lisidtemp;
    if(lisid == 0x33)
//    if(lisid == 0x33)
//    {
//        LIS3DH_Data_Init();
//    }
//    else
//    {
//        g_com_map[IMU_ENABLE]=0;
//    }
    lisid = mir3da_ReadOneByte(REG_CHIP_ID);
    if(lisid == 0x13)
    {
        LIS3DH_Data_Init();
        mir3da_init();
    }
    else
    {
        g_com_map[IMU_ENABLE]=0;
    }
        LIS3DH_GetWHO_AM_I(&lisidtemp);
        lisid=(uint16_t)lisidtemp;
        if(lisid == 0x33)
        {
            LIS3DH_Data_Init();
        }
        else
        {
            g_com_map[IMU_ENABLE]=0;
        }
    }
}
void mir3da_init()
@@ -488,36 +561,36 @@
void  IIC2_SDA_OUT()
{
gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1);
    gpio_pin_set_dir(SDA_PIN , GPIO_DIR_OUT, 1);
}
void  IIC2_SDA_IN()
{
gpio_pin_set_dir(SDA_PIN,GPIO_DIR_IN,1); //SDA设置为输入等待接收端的应答信号
    gpio_pin_set_dir(SDA_PIN,GPIO_DIR_IN,1); //SDA设置为输入等待接收端的应答信号
}
//产生IIC起始信号
void IIC2_Start(void)
{
      IIC2_SDA_OUT();     //sda线输出
      SDA_1;
//      delay_us(10);
      SCL_1;
    IIC2_SDA_OUT();     //sda线输出
    SDA_1;
//      delay_us(10);
      SDA_0;//START:when CLK is high,DATA change form high to low
      delay_us(10);
      SCL_0;//钳住I2C总线,准备发送或接收数据
}
    SCL_1;
//      delay_us(10);
    SDA_0;//START:when CLK is high,DATA change form high to low
    delay_us(10);
    SCL_0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC2_Stop(void)
{
      IIC2_SDA_OUT();//sda线输出
      SCL_0;
    IIC2_SDA_OUT();//sda线输出
    SCL_0;
//      delay_us(10);
      SDA_0;//STOP:when CLK is high DATA change form low to high
       delay_us(10);
      SCL_1;
    SDA_0;//STOP:when CLK is high DATA change form low to high
    delay_us(10);
    SCL_1;
//      delay_us(10);
      SDA_1;//发送I2C总线结束信号
      delay_us(10);
    SDA_1;//发送I2C总线结束信号
    delay_us(10);
}
@@ -526,95 +599,95 @@
//        0,接收应答成功
uint8_t IIC2_Wait_Ack(void)
{
   uint8_t ucErrTime=0;
IIC2_SDA_IN();
    SDA_1;
   delay_us(15);
   SCL_1;
   delay_us(15);
    uint8_t ucErrTime=0;
    IIC2_SDA_IN();
    SDA_1;
    delay_us(15);
    SCL_1;
    delay_us(15);
   while(IIC2_READ_SDA)
   {
      ucErrTime++;
      if(ucErrTime>250)
      {
         IIC2_Stop();
         return 1;
      }
   }
   SCL_0;//时钟输出0
   return 0;
}
    while(IIC2_READ_SDA)
    {
        ucErrTime++;
        if(ucErrTime>250)
        {
            IIC2_Stop();
            return 1;
        }
    }
    SCL_0;//时钟输出0
    return 0;
}
//产生ACK应答
void IIC2_Ack(void)
{
   SCL_0;
   IIC2_SDA_OUT();
   SDA_0;
   delay_us(10);
   SCL_1;
   delay_us(10);
   SCL_0;
    SCL_0;
    IIC2_SDA_OUT();
    SDA_0;
    delay_us(10);
    SCL_1;
    delay_us(10);
    SCL_0;
}
//不产生ACK应答
//不产生ACK应答
void IIC2_NAck(void)
{
   SCL_0;
   IIC2_SDA_OUT();
   SDA_1;
   delay_us(10);
   SCL_1;
   delay_us(10);
   SCL_0;
    SCL_0;
    IIC2_SDA_OUT();
    SDA_1;
    delay_us(10);
    SCL_1;
    delay_us(10);
    SCL_0;
}
//IIC发送一个字节,WRITE
//返回从机有无应答
//1,有应答
//0,无应答
//0,无应答
void IIC2_Send_Byte(uint8_t txd)
{
    uint8_t t;
      IIC2_SDA_OUT();
      SCL_0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {
         if((txd&0x80)>>7)
         {
            SDA_1;
         }
         else
         {
            SDA_0;
         }
      txd <<= 1;
      delay_us(10);
      SCL_1;
      delay_us(10);
      SCL_0;
      delay_us(10);
    }
}
{
    uint8_t t;
    IIC2_SDA_OUT();
    SCL_0;//拉低时钟开始数据传输
    for(t=0; t<8; t++)
    {
        if((txd&0x80)>>7)
        {
            SDA_1;
        }
        else
        {
            SDA_0;
        }
        txd <<= 1;
        delay_us(10);
        SCL_1;
        delay_us(10);
        SCL_0;
        delay_us(10);
    }
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
uint8_t IIC2_Read_Byte(unsigned char ack)
{
   unsigned char i,receive=0;
   IIC2_SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
   {
    SCL_0;
    delay_us(10);
      SCL_1;
    receive<<=1;
    if(IIC2_READ_SDA)receive++;
      delay_us(5);
    }
    unsigned char i,receive=0;
    IIC2_SDA_IN();//SDA设置为输入
    for(i=0; i<8; i++ )
    {
        SCL_0;
        delay_us(10);
        SCL_1;
        receive<<=1;
        if(IIC2_READ_SDA)receive++;
        delay_us(5);
    }
    if (!ack)
        IIC2_NAck();//发送nACK
    else
        IIC2_Ack(); //发送ACK
        IIC2_Ack(); //发送ACK
    return receive;
}