IIC结合SI7021

IIC主要起始信号、终止信号和应答信号来控制

首先是 起始信号
起始信号

    void IIC_Start(void)
    {
     SDA_OUT();     //配置为输出
     IIC_SDA=1;
      delay_us(10); //不是必须,可以不用。
     IIC_SCL=1;
      delay_us(10); //至少4.7us
      IIC_SDA=0;
      delay_us(10); //至少4us
     IIC_SCL=0; 
    }

然后是 终止信号 :
终止信号

void IIC_Stop(void)
{
 SDA_OUT();//配置为输出
 IIC_SCL=0;
 delay_us(10);
 IIC_SDA=0;
  delay_us(10); //非必须,可不要
  IIC_SCL=1;
  delay_us(10);  //至少4us
 IIC_SDA=1;
  delay_us(10);//至少4.7us          
}

接着是 主机的应答和非应答
主机的应答和非应答

void IIC_Ack(void)
{
 IIC_SCL=0;
 SDA_OUT(); 
 IIC_SDA=0;
 delay_us(5);
 IIC_SCL=1;
 delay_us(5);//至少4us
 IIC_SCL=0;
}

void IIC_NAck(void)
{
 IIC_SCL=0;
 SDA_OUT();
 IIC_SDA=1;
 delay_us(5);
 IIC_SCL=1;
 delay_us(5);//至少4us
 IIC_SCL=0;
}

最后是 从机的应答

u8 IIC_Wait_Ack(void)
{
 u8 tempTime=0;
 SDA_IN();
 IIC_SDA=1;//主机释放数据总线
  delay_us(5);      
 IIC_SCL=1;
 delay_us(5);  
 while(READ_SDA)
 {
  tempTime++;
  if(tempTime>250)
  {
   IIC_Stop();
   return 1;
  }
 }
 IIC_SCL=0;
 return 0;  
} 

IIC的读写

IIC的数据的传输为每次8位。数据的有效性为SCL为低电平的时候可以变换、SCL为高电平的时候保持稳定。
数据的有效性

void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
 SDA_OUT();      
    IIC_SCL=0;
    for(t=0;t<8;t++)
    {              
        if((txd&0x80)>0)
   IIC_SDA=1;
  else
   IIC_SDA=0;
        txd<<=1;    
  delay_us(5);
  IIC_SCL=1;
  delay_us(5); 
  IIC_SCL=0; 
  delay_us(5);
    }  
}
u8 IIC_Read_Byte(u8 ack)
{
 u8 i,receive=0;
 SDA_IN();
    for(i=0;i<8;i++ )
 {
        IIC_SCL=0; 
        delay_us(5);
    IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
  delay_us(5); 
    }      
    if (!ack)
        IIC_NAck();//主机产生非应答
    else
        IIC_Ack();//或者主机产生应答    
    return receive;
}

SI7021温湿度传感器

 void Si7021_Write_Byte(u8 val)
{
  IIC_Start();
   IIC_Send_Byte(SI7021_WRITE_ADDR);
  IIC_Wait_Ack();
  IIC_Send_Byte(val);
  IIC_Wait_Ack();
  IIC_Stop();
  delay_us (10); 
}

uint16_t Si7021_Read_Byte(void)     //two byte
{
  uint16_t val;
  u8 temp1,temp2;
  IIC_Start();
   IIC_Send_Byte(SI7021_READ_ADDR);
  IIC_Wait_Ack();
  delay_us(50000);     //用的是STM32,此处必须的有至少50ms延时。估计得等数据转换完成。
  temp1=IIC_Read_Byte(1);
  temp2=IIC_Read_Byte(0);
  IIC_Stop();
    delay_us(10);
  val=temp1;
  val<<=8;
  val|=temp2;
  return val;
}

对于SI7021的操作和数据的转换。

void Si7021_RH_T_Pro(void)
{
  float hum,tem;
  Si7021_Write_Byte(MASTER_HOLD_HUMIDITY);
  hum= Si7021_Read_Byte();
  Si7021_Write_Byte(MASTER_HOLD_TEMPERATURE);
  tem= Si7021_Read_Byte();
  Si7021_val.Humidity=(125*hum/65536-6+0.5)*10;
  Si7021_val.Temperature=(175.72*tem/65536-46.85+0.5)*10;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值