STM32G474+SPL06-001+I2C通信

一、Cubemx配置

配置参考我之前那个AHT20的文章,配置是一样的。还是利用hlpuart向串口监视器发送信息。

二、SPL06-001代码解释

我在SPL06_001气压计驱动例程的基础上修改的,使用了HAL库。

最后一直运行不出来的原因是SPL06的初始化有问题。

int spl06_init(void)
{
    uint8_t regval = 0;
    uint8_t coef[18] = {0};
  /*
    //i2c_write(SPL06_ADDR, SP06_RESET, 1, &regval);
    HAL_I2C_Mem_Write(&hi2c1, SPL06_ADDR,SP06_RESET, I2C_MEMADD_SIZE_8BIT, &regval, 1, 5000);
    //i2c_read(SPL06_ADDR, SP06_ID, 1, &regval);
    HAL_I2C_Mem_Read(&hi2c1, SPL06_ADDR,SP06_ID, I2C_MEMADD_SIZE_8BIT, &regval, 1, 500);
		
		HAL_UART_Transmit(&hlpuart1, &regval, 10, 500); 
		
    if (0x10 != regval)
    {
        return -1;
    }
    
    HAL_Delay(50);
    */
 
		HAL_I2C_Mem_Read(&hi2c1, SPL06_ADDR,SP06_COEF, I2C_MEMADD_SIZE_8BIT, coef, 18, 500);

    _c0 = ((int16_t)coef[0] << 4) | ((coef[1] & 0xF0) >> 4);
    _c0 = (_c0 & 0x0800) ? (0xF000 | _c0) : _c0;
    _c1 = ((int16_t)(coef[1] & 0x0F) << 8) | coef[2];
    _c1 = (_c1 & 0x0800) ? (0xF000 | _c1) : _c1;
    _c00 = ((int32_t)coef[3] << 12) | ((uint32_t)coef[4] << 4 ) | (coef[5] >> 4);
    _c00 = (_c00 & 0x080000) ? (0xFFF00000 | _c00) : _c00;
    _c10 = ((int32_t)(coef[5] & 0x0F) << 16) | ((uint32_t)coef[6] << 8) | coef[7];
    _c10 = (_c10 & 0x080000) ? (0xFFF00000 | _c10) : _c10;
    _c01 = ((int16_t)coef[8] << 8)  | coef[9];
    _c11 = ((int16_t)coef[10] << 8) | coef[11];
    _c20 = ((int16_t)coef[12] << 8) | coef[13];
    _c21 = ((int16_t)coef[14] << 8) | coef[15];
    _c30 = ((int16_t)coef[16] << 8) | coef[17];
    
    _spl06_pressure_config(PM_RATE_8, PM_PRC_64);
    _spl06_temperature_config(TMP_RATE_1, TMP_PRC_1);
    
    /* 启动测量 */
    regval = MEAS_CTRL_ContinuousPressTemp;
    //i2c_write(SPL06_ADDR, SP06_MEAS_CFG, 1, &regval);
    HAL_I2C_Mem_Write(&hi2c1, SPL06_ADDR,SP06_MEAS_CFG, I2C_MEMADD_SIZE_8BIT, &regval, 1, 5000);

    return 0;
}

我把下面这一段注释掉了,因为我发现我的板子不知道为什么一直过不了这个检查,我感觉这个检查也不太会影响后面代码的运行。注释掉就可以正常工作了。C

//i2c_write(SPL06_ADDR, SP06_RESET, 1, &regval);
    HAL_I2C_Mem_Write(&hi2c1, SPL06_ADDR,SP06_RESET, I2C_MEMADD_SIZE_8BIT, &regval, 1, 5000);
    //i2c_read(SPL06_ADDR, SP06_ID, 1, &regval);
    HAL_I2C_Mem_Read(&hi2c1, SPL06_ADDR,SP06_ID, I2C_MEMADD_SIZE_8BIT, &regval, 1, 500);
		
		HAL_UART_Transmit(&hlpuart1, &regval, 10, 500); 
		
    if (0x10 != regval)
    {
        return -1;
    }
    
    HAL_Delay(50);

除此之外就是这两个函数的替换,我把博主自己写的函数换成HAL库了:

i2c_write(SPL06_ADDR, SP06_RESET, 1, &regval);

换成:

 HAL_I2C_Mem_Write(&hi2c1, SPL06_ADDR,SP06_RESET, I2C_MEMADD_SIZE_8BIT, &regval, 1, 5000);

还有这个

i2c_read(SPL06_ADDR, SP06_ID, 1, &regval);

换成;

 HAL_I2C_Mem_Read(&hi2c1, SPL06_ADDR,SP06_ID, I2C_MEMADD_SIZE_8BIT, &regval, 1, 500);

第一个参数是要用的外设指针,第二个是从机地址,第三个是要读取或者写入的寄存器地址,第四个是大小,第五个是读取或者写入的字符串指针,第六个是要读取或者写入的字符串个数,第七个是等待时间,这个随意设置。

三、工程源码

百度网盘哦

链接:https://pan.baidu.com/s/1s71WMiEG0ta93w9sex8vCg?pwd=6666 
提取码:6666 
--来自百度网盘超级会员V2的分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值