标题: MMA7660FC--重力加速度传感器驱动 [打印本页]

作者: xiaos    时间: 2015-4-10 16:55
标题: MMA7660FC--重力加速度传感器驱动
static void I2C_Delay(void)
{
  volatile uint16_t t=0xff;
  while(t--);
}

static void I2C_Start(void)
{
  I2C_SDA_HIGH();
  I2C_SCL_HIGH();
  I2C_Delay();
  I2C_SDA_LOW();
  I2C_Delay();
  I2C_SCL_LOW();
  I2C_Delay();
}

static void I2C_Stop(void)
{
  I2C_SDA_LOW();
  I2C_SCL_HIGH();
  I2C_Delay();
  I2C_SDA_HIGH();
  I2C_Delay();
}

static uint8_t I2C_WaitAck(void)
{
  uint8_t Ack;
  I2C_SDA_HIGH();
  I2C_SCL_HIGH();
  I2C_Delay();
  if(I2C_SDA_Read())
    Ack=1;
  else
    Ack=0;
  I2C_SCL_LOW();
  I2C_Delay();
  return Ack;
}
/*
static void I2C_SendAck(void)
{
  I2C_SDA_LOW();
  I2C_Delay();
  I2C_SCL_HIGH();
  I2C_Delay();
  I2C_SCL_LOW();
  I2C_Delay();
}*/

static void I2C_SendNoAck(void)
{
  I2C_SDA_HIGH();
  I2C_Delay();
  I2C_SCL_HIGH();
  I2C_Delay();
  I2C_SCL_LOW();
  I2C_Delay();
}

static void I2C_SendByte(uint8_t Byte)
{
  uint8_t Bit;
  for(Bit=0;Bit<8;Bit++)
  {
    if(Byte&0x80)
      I2C_SDA_HIGH();
    else
      I2C_SDA_LOW();
    Byte<<=1;
    I2C_Delay();
    I2C_SCL_HIGH();
    I2C_Delay();
    I2C_SCL_LOW();
    I2C_Delay();
  }
}

static uint8_t I2C_ReceiveByte(void)
{
  uint8_t Bit,Byte=0;
  I2C_SDA_HIGH();
  for(Bit=0;Bit<8;Bit++)
  {
    I2C_SCL_HIGH();
    I2C_Delay();
    Byte<<=1;
    if(I2C_SDA_Read())
      Byte++;
    I2C_SCL_LOW();
    I2C_Delay();
  }
  return Byte;
}


/******************************MMA7660FC******************/

uint8_t MMA7660_WriteByte(uint8_t Reg,uint8_t Data)//Reg  MMA7660的寄存器地址  Data 写进寄存器的值
{
  I2C_Start();
  I2C_SendByte(MMA7660_Write);
  if(I2C_WaitAck())
    return 1;
  I2C_SendByte(Reg);
  if(I2C_WaitAck())
    return 2;
  I2C_SendByte(Data);
  if(I2C_WaitAck())
    return 3;
  I2C_Stop();
  return 0;
}

uint8_t MMA7660_ReadByte(uint8_t Reg,uint8_t *pData)
{
  I2C_Start();
  I2C_SendByte(MMA7660_Write);//MMA7660 的I2C写地址
  if(I2C_WaitAck())
    return 1;
  I2C_SendByte(Reg);
  if(I2C_WaitAck())
    return 2;
  I2C_Start();
  I2C_SendByte(MMA7660_Read);//MMA7660的I2C读地址
  if(I2C_WaitAck())
    return 3;
  *pData=I2C_ReceiveByte();
  I2C_SendNoAck();
  I2C_Stop();
  return 0;
}

void MMA7660_Check(void)
{
  I2C_Start();
  I2C_SendByte(MMA7660_Write);
  if(I2C_WaitAck())
  {
    put_str("mei you hui ying \n");
  }
  else
  {
    put_str("you hui ying \n");
  }
  I2C_Stop();
}

void Sys_Init(void)
{
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  MMA7660_Init();
  USART_Configuration();
}

uint8_t MMA7660_Configuration(void)
{
  if(MMA7660_WriteByte(0x05,0xff))
    return 1;
  if(MMA7660_WriteByte(0x06,0x03))
    return 2;
  if(MMA7660_WriteByte(0x08,0x3c))
    return 3;
  if(MMA7660_WriteByte(0x09,0xe0))
    return 4;
  if(MMA7660_WriteByte(0x0a,0x00))
    return 5;
  if(MMA7660_WriteByte(0x07,0x59))
    return 6;
  return 0;
}

//想要获取当前的状态 只需要调用  
MMA7660_ReadByte()  读取0x03 地址的数据  读出来的数据中  [4:2]的数据才是有用数据  001  010  101  110 分别代表的是   左 右 下 上  .









欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1