蓝桥杯物联网学习记录【二:温度传感器STS30】

系列文章目录

新建工程及点亮LED


前言

STS30:±0.2°C数字温度传感器 (0-65°C)
STS30:用的是IIC接口,这里为了方便直接用官方给的模拟IIC。


一、IIC操作

1.延时要求

操作的延时必须要再STS30的允许范围
在这里插入图片描述

2.开始条件:SCL 为高电平时,主机将SDA 拉低,表示数据传输即将开始。

void I2CStart2(void)
{
    SDA_Output2(1);//SDA输出高电平
    delay1(DELAY_TIME);//每个操作延时一段时间
    SCL_Output2(1);//SCL输出高电平
    delay1(DELAY_TIME);
    SDA_Output2(0);//SDA输出低电平
    delay1(DELAY_TIME);
    SCL_Output2(0);//SCL输出高电平
    delay1(DELAY_TIME);
}

3.停止条件:在SDA 为低电平时,主机将SCL 拉高并保持高电平,然后在将SDA 拉高,表示传输结束。

void I2CStop2(void)
{
    SCL_Output2(0);//先将数据和时钟都拉低然后时钟拉高,数据拉高
    delay1(DELAY_TIME);
    SDA_Output2(0);
    delay1(DELAY_TIME);
    SCL_Output2(1);
    delay1(DELAY_TIME);
    SDA_Output2(1);
    delay1(DELAY_TIME);

}

4.等待应答:SDA设置为输入,SCL输出高,然后等待STS30将SDA拉低如果超时未拉低则返回错误信号。SDA被STS30拉低后设置为输出模式为后续操作做准备,最后再把SCL输出第;

unsigned char I2CWaitAck2(void)
{
    unsigned short cErrTime = 5;
    SDA_Input_Mode2();//设置为输入模式
    delay1(DELAY_TIME);
    SCL_Output2(1);
    delay1(DELAY_TIME);
    while(SDA_Input2())
    {
        cErrTime--;
        delay1(DELAY_TIME);
        if (0 == cErrTime)
        {
            SDA_Output_Mode2();
            I2CStop2();
            return ERROR;
        }
    }
    SDA_Output_Mode2();//设置为输出模式
    SCL_Output2(0);
    delay1(DELAY_TIME);
    return SUCCESS;
}

5.发送应答:SDA输出低,SCL输出由高变低;

void I2CSendAck2(void)
{
    SDA_Output2(0);
    delay1(DELAY_TIME);
    delay1(DELAY_TIME);
    SCL_Output2(1);
    delay1(DELAY_TIME);
    SCL_Output2(0);
    delay1(DELAY_TIME);

}

6.发送非应答:SDA输出高,SCL输出由高变低;

void I2CSendAck2(void)
{
    SDA_Output2(0);
    delay1(DELAY_TIME);
    delay1(DELAY_TIME);
    SCL_Output2(1);
    delay1(DELAY_TIME);
    SCL_Output2(0);
    delay1(DELAY_TIME);

}

7.发送一个字节数据:先发送高位再发送低位;

void I2CSendByte2(unsigned char cSendByte)
{
    unsigned char  i = 8;
    while (i--)//循环发送8个位
    {
        SCL_Output2(0); //SCL输出低电平
        delay1(DELAY_TIME);
        SDA_Output2(cSendByte & 0x80);//SDA发送高位数据
        delay1(DELAY_TIME);
        cSendByte += cSendByte;//每次循环,数据与自己相加相当于左移一位
        delay1(DELAY_TIME);
        SCL_Output2(1);//SCL输出高电平
        delay1(DELAY_TIME);
    }
    SCL_Output2(0);//SCL输出低电平
    delay1(DELAY_TIME);
}

8.接收一个字节数据:先接收数据高位;

unsigned char I2CReceiveByte2(void)
{
    unsigned char i = 8;
    unsigned char cR_Byte = 0;
    SDA_Input_Mode2();
    while (i--)//循环8次接收数据
    {
        cR_Byte += cR_Byte;//左移一位
        SCL_Output2(0);
        delay1(DELAY_TIME);
        delay1(DELAY_TIME);
        SCL_Output2(1);
        delay1(DELAY_TIME);
        cR_Byte |=  SDA_Input2();//接收数据
    }
    SCL_Output2(0);
    delay1(DELAY_TIME);
    SDA_Output_Mode2();
    return cR_Byte;//返回数据
}

二、读取温度值

STS30地址由引脚二决定这里引脚为低所以芯片地址为0X4A
芯片地址

float Get_Temperature(void)
{
    uint8_t H_VALUE, L_VALUE, CRC_VALUE;
    uint16_t T_VALUE; //转换完成的数字值
    float temperature;//转换完成的温度值

    I2CStart2();//发送开始信号
    I2CSendByte2(0x4A << 1);//0表示写1表示读,这里最低位为0,0X4A为STS30地址
    I2CWaitAck2();
    I2CSendByte2(0x24);//不使能时钟伸缩  
    I2CWaitAck2();
    I2CSendByte2(0x0b);//中重复性测量精度
    I2CWaitAck2();
    I2CStop2();
    LL_mDelay(2);//scl free,最小为1ms

    I2CStart2();
    I2CSendByte2(0x4A << 1 | 1);//读操作
    I2CWaitAck2();
    I2CStop2();
    LL_mDelay(2);//scl free,最小为1ms

    I2CStart2();
    I2CSendByte2(0x4A << 1 | 1);
    I2CWaitAck2();


    H_VALUE = I2CReceiveByte2();//读取数据高位
    I2CSendAck2();
    L_VALUE = I2CReceiveByte2();//读取数据低位
    I2CSendAck2();
    CRC_VALUE = I2CReceiveByte2();//获取校验
    I2CSendNotAck2();
    I2CStop2();

    if (CRC_VALUE)
    {
        ;
    }
    T_VALUE = H_VALUE << 8 | L_VALUE;//整个数据
    temperature = -45 + 175.0 * T_VALUE / 65535;//这个公式在数据手册这里选择摄氏度

    return (temperature);
}

在这里插入图片描述

总结

例如:把官方给的IIC驱动移植到自己建的工程里,然后记住温度获取函数Get_Temperature如何实现。需要获取温度是的时候直接调用Get_Temperature就可以了,就是不知道官方会不会给TST30传感器的驱动哈哈哈哈哈。写的不好献丑啦。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值