找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4947|回复: 0
收起左侧

MMA7660FC--重力加速度传感器驱动

[复制链接]
ID:75926 发表于 2015-4-10 16:55 | 显示全部楼层 |阅读模式
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 分别代表的是   左 右 下 上  .




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表