stm32 I2C操作ds1624温度传感器代码

来源:互联网 发布:淘宝卖家地址是真的吗 编辑:程序博客网 时间:2024/06/05 20:54

 STM32 I2C通信

 此项目中的I2C通信协议用于和温度模块(DS1624)进行通信 温度模块有两大功能 采集温度和存取数据

        

I2C的起始信号:

void IIC_Start(void)

 {

    SDA_OUT();

    IIC_SDA(1);

    IIC_SCL(1);

    delay_us(4);

    IIC_SDA(0);

    delay_us(4);

    IIC_SCL(0);

 }

I2C的结束信号:

void IIC_Stop(void)

{

SDA_OUT();

IIC_SCL(0);

IIC_SDA(0);//STOP:when CLK is high DATA change form low to high

  delay_us(4);

IIC_SCL(1);

IIC_SDA(1);

delay_us(4);   

}

//等待应答信号到来

U8 IIC_Wait_Ack(void)

{

  U8 ucErrTime =0;

  SDA_IN();

  IIC_SDA(1);delay_us(1);

  IIC_SCL(1);delay_us(1);

  While(READ_SDA)

  {

      ucErrTime++;

      If(ucErrTime>250)

      {

           IIC_Stop();

           Return 1;

       }

   }

    IIC_SCL(0);

    Return 0;

 }

//产生ACK应答

void IIC_ACK(void)

{

  IIC_SCL(0);

  SDA_OUT();

  IIC_SDA(0);

  Delay_us(2);

  IIC_SCL(1);

  Delay_us(2);

  IIC_SCL(0);

}

//不产生ACK应答

void IIC_ACK(void)

{

  IIC_SCL(0);

  SDA_OUT();

  IIC_SDA(1);

  Delay_us(2);

  IIC_SCL(1);

  Delay_us(2);

  IIC_SCL(0);

}

//送一个Byte数据   

void IIC_Send_Byte(u8 txd)

{                        

      u8 t;   

SDA_OUT();     

IIC_SCL(0);//低时序送数据

    for(t=0;t<8;t++)

    {              

        IIC_SDA((txd&0x80)>>7);

        txd<<=1;   

delay_us(2);  

IIC_SCL(1);

delay_us(2);

IIC_SCL(0);

delay_us(2);

    }  

}

//读一个byte数据

u8 IIC_Read_Byte(u8 ack)

{

u8 i,receive=0;

SDA_IN();//数据线设为输入

    for(i=0;i<8;i++ )

{

        IIC_SCL(0);

        delay_us(2);

IIC_SCL(1); //高时序开始读数据

        receive<<=1;

        if(READ_SDA)receive++;   

delay_us(1);

    }  

    if (!ack)

        IIC_NAck();//产生ack应答

    else

        IIC_Ack(); //产生nack应答

    return receive;

}

原创粉丝点击