温湿传感器(学习笔记下)

接着我们温湿传感器上半部分的学习,现在我们学习接下来的部分,编写GXHTC3驱动程序,也就是给gxhtc3.c文件添加代码,我们要判断gxhtc3芯片是否存在和正常,就要先读取gxhtc3的ID号,根据gxhtc3的数据手册,读取命令为0xEFC8,发送命令后,可以读出16位的ID号和1个CRC字节。CRC字节用来校验判断读取的数据是否正确。

首先,我们需要先写一个校验代码,如下代码所示,

​
#define POLYNOMIAL  0x31 // P(x) = x^8 + x^5 + x^4 + 1 = 00110001,POLYNOMIAL是多项式因子

//CRC校验
uint8_t gxhtc3_calc_crc(uint8_t *crcdata, uint8_t len) //两个参数分别是需要校验的数据和数据长度
{
    uint8_t crc = 0xFF; 
  
    for(uint8_t i = 0; i < len; i++)
    {
        crc ^= (crcdata[i]); //crc初始值是0xFF,crcdata与crc按位与或运算后,把计算后的值赋值给crc,crcdata中位是0的位置会变成1,位是1的位置会变成0,这条语句的作用就是把crcdata的值,1变成0,0变成1,然后赋值给crc
        for(uint8_t j = 8; j > 0; --j) //这里的for循环按位计算,如果位是0,直接左移1位,如果位是1,左移1位后再与多项式按位与或运算
        {
            if(crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
            else           crc = (crc << 1);
        }
    }
    return crc; //返回值是计算好的CRC字节(需要和读出的CRC字节做对比,一致的话正确)
}

​

接下来,我们需要写一个读取ID的代码,

​
// 读取ID
esp_err_t gxhtc3_read_id(void) //该函数返回一个 esp_err_t 类型的错误码,表示操作是否成功
{
    esp_err_t ret; // 用于存储函数执行过程中返回的错误码
    uint8_t data[3]; //用于存储从传感器读取的3字节数据(包括ID和CRC校验值)

    i2c_cmd_handle_t cmd = i2c_cmd_link_create(); //创建一个新的I2C命令链
    i2c_master_start(cmd); //发送I2C起始信号
    i2c_master_write_byte(cmd, 0x70 << 1 | I2C_MASTER_WRITE, true); //写入I2C设备的地址(0x70),并设置为写模式
    i2c_master_write_byte(cmd, 0xEF, true); //写入命令字节0xEF,用于选择传感器的ID读取命令
    i2c_master_write_byte(cmd, 0xC8, true); //写入命令字节0xC8,可能是用于配置或确认读取操作
    i2c_master_stop(cmd); //发送I2C停止信号

    ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); //执行I2C命令链,超时时间为1000毫秒
    if (ret != ESP_OK) { //如果执行失败(ret != ESP_OK),则跳转到 end 标签,释放资源并返回错误码
        goto end;
    }
    cmd = i2c_cmd_link_create(); //重新创建一个新的I2C命令链
    i2c_master_start(cmd); //发送I2C起始信号
    i2c_master_write_byte(cmd, 0x70 << 1 | I2C_MASTER_READ, true); //写入I2C设备的地址(0x70),并设置为读模式
    i2c_master_read(cmd, data, 3, I2C_MASTER_LAST_NACK); //读取3字节数据到 data 数组中,最后一个字节读取后发送NACK信号
    i2c_master_stop(cmd); //发送I2C停止信号

    ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / port
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值