一、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, ®val);
HAL_I2C_Mem_Write(&hi2c1, SPL06_ADDR,SP06_RESET, I2C_MEMADD_SIZE_8BIT, ®val, 1, 5000);
//i2c_read(SPL06_ADDR, SP06_ID, 1, ®val);
HAL_I2C_Mem_Read(&hi2c1, SPL06_ADDR,SP06_ID, I2C_MEMADD_SIZE_8BIT, ®val, 1, 500);
HAL_UART_Transmit(&hlpuart1, ®val, 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, ®val);
HAL_I2C_Mem_Write(&hi2c1, SPL06_ADDR,SP06_MEAS_CFG, I2C_MEMADD_SIZE_8BIT, ®val, 1, 5000);
return 0;
}
我把下面这一段注释掉了,因为我发现我的板子不知道为什么一直过不了这个检查,我感觉这个检查也不太会影响后面代码的运行。注释掉就可以正常工作了。C
//i2c_write(SPL06_ADDR, SP06_RESET, 1, ®val);
HAL_I2C_Mem_Write(&hi2c1, SPL06_ADDR,SP06_RESET, I2C_MEMADD_SIZE_8BIT, ®val, 1, 5000);
//i2c_read(SPL06_ADDR, SP06_ID, 1, ®val);
HAL_I2C_Mem_Read(&hi2c1, SPL06_ADDR,SP06_ID, I2C_MEMADD_SIZE_8BIT, ®val, 1, 500);
HAL_UART_Transmit(&hlpuart1, ®val, 10, 500);
if (0x10 != regval)
{
return -1;
}
HAL_Delay(50);
除此之外就是这两个函数的替换,我把博主自己写的函数换成HAL库了:
i2c_write(SPL06_ADDR, SP06_RESET, 1, ®val);
换成:
HAL_I2C_Mem_Write(&hi2c1, SPL06_ADDR,SP06_RESET, I2C_MEMADD_SIZE_8BIT, ®val, 1, 5000);
还有这个
i2c_read(SPL06_ADDR, SP06_ID, 1, ®val);
换成;
HAL_I2C_Mem_Read(&hi2c1, SPL06_ADDR,SP06_ID, I2C_MEMADD_SIZE_8BIT, ®val, 1, 500);
第一个参数是要用的外设指针,第二个是从机地址,第三个是要读取或者写入的寄存器地址,第四个是大小,第五个是读取或者写入的字符串指针,第六个是要读取或者写入的字符串个数,第七个是等待时间,这个随意设置。
三、工程源码
百度网盘哦
链接:https://pan.baidu.com/s/1s71WMiEG0ta93w9sex8vCg?pwd=6666
提取码:6666
--来自百度网盘超级会员V2的分享