资讯详情

SPL06-001 驱动代码

1. .h需要定义文件的部分

/************************************************************************** *宏定义 **************************************************************************/  ///气压测量速率(sample/sec),Background 模式使用 #define PM_RATE_1 (0<<4) //1 measurements pr. sec. #define PM_RATE_2 (1<<4) //2 measurements pr. sec. #define PM_RATE_4 (2<<4) //4 measurements pr. sec.  #define PM_RATE_8 (3<<4) //8 measurements pr. sec. #define PM_RATE_16 (4<<4) //16 measurements pr. sec. #define PM_RATE_32 (5<<4) //32 measurements pr. sec. #define PM_RATE_64 (6<<4) //64 measurements pr. sec. #define PM_RATE_128 (7<<4) //128 measurements pr. sec.  //气压重采样率(times),Background 模式使用 #define PM_PRC_1 0 //Sigle kP=524288 ,3.6ms #define PM_PRC_2 1 //2 times kP=1572864 ,5.2ms #define PM_PRC_4 2 //4 times kP=3670016 ,8.4ms #define PM_PRC_8 3 //8 times kP=7864320 ,14.8ms #define PM_PRC_16 4 //16 times kP=253952 ,27.6ms #define PM_PRC_32 5 //32 times kP=516096 ,53.2ms #define PM_PRC_64 6 //64 times kP=1040384 ,104.4ms #define PM_PRC_128 7 //128 times kP=2088960 ,206.8ms //温度测量速率(sample/sec),Background 模式使用 #define TMP_RATE_1 (0<<4) //1 measurements pr. sec. #define TMP_RATE_2 (1<<4) //2 measurements pr. sec. #define TMP_RATE_4 (2<<4) //4 measurements pr. sec.  #define TMP_RATE_8 (3<<4) //8 measurements pr. sec. #define TMP_RATE_16 (4<<4) //16 measurements pr. sec. #define TMP_RATE_32 (5<<4) //32 measurements pr. sec. #define TMP_RATE_64 (6<<4) //64 measurements pr. sec. #define TMP_RATE_128 (7<<4) //128 measurements pr. sec. //温度重采样速率(times),Background 模式使用 #define TMP_PRC_1 0 //Sigle #define TMP_PRC_2 1 //2 times #define TMP_PRC_4 2 //4 times #define TMP_PRC_8 3 //8 times #define TMP_PRC_16 4 //16 times #define TMP_PRC_32 5 //32 times #define TMP_PRC_64 6 //64 times #define TMP_PRC_128 7 //128 times //SPL06_MEAS_CFG #define MEAS_COEF_RDY 0x80 #define MEAS_SENSOR_RDY 0x40 //传感器初始化完成 #define MEAS_TMP_RDY 0x20 //有新的温度数据 #define MEAS_PRS_RDY 0x10 //有新的气压数据 #define MEAS_CTRL_Standby 0x00 //空闲模式 #define MEAS_CTRL_PressMeasure 0x01 //单次气压测量 #define MEAS_CTRL_TempMeasure 0x02 //单次温度测量 #define MEAS_CTRL_ContinuousPress 0x05 //连续气压测量 #define MEAS_CTRL_ContinuousTemp 0x06 //连续温度测量 #define MEAS_CTRL_ContinuousPressTemp 0x07 //连续气压温度测量 //FIFO_STS #define SPL06_FIFO_FULL 0x02 #define SPL06_FIFO_EMPTY 0x01 //INT_STS #define SPL06_INT_FIFO_FULL 0x04 #define SPL06_INT_TMP 0x02 #define SPL06_INT_PRS 0x01 //CFG_REG #define SPL06_CFG_T_SHIFT 0x08 //oversampling times>8时必须使用 #define SPL06_CFG_P_SHIFT 0x04 #define SPL06_PSR_B2 0x00 //气压值 #define SPL06_PSR_B1 0x01 #define SPL06_PSR_B0 0x02 #define SPL06_TMP_B2 0x03 //温度值 #define SPL06_TMP_B1 0x04 #define SPL06_TMP_B0 0x05 #define SPL06_PSR_CFG 0x06 //气压测量配置 #define SPL06_TMP_CFG 0x07 //温度测量配置 #define SPL06_MEAS_CFG 0x08 //测量模式配置 #define SPL06_CFG_REG 0x09 #define SPL06_INT_STS 0x0A #define SPL06_FIFO_STS 0x0B #define SPL06_RESET 0x0C #define SPL06_ID 0x0D #define SPL06_COEF 0x10 //-0x21 #define SPL06_COEF_SRCE 0x28 #define SPL06DeviceAdd (0x77<<1)  /************************************************************************** *结构体定义 **************************************************************************/ /*BMP280 校准参数*/ typedef struct { 
           INT16 C0; INT16 C1; INT32 C00; INT32 C10; INT16 C01; INT16 C11; INT16 C20; INT16 C21; INT16 C30; float kT; float kP; }T_SPL06_calibPara; /************************************************************************** *全局变量申明 **************************************************************************/ extern T_SPL06_calibPara t_SPL06_calibPara; 

2. .C函数

/************************************************************************** *全局变量定义 **************************************************************************/ 
T_SPL06_calibPara t_SPL06_calibPara;

/************************************************************************** *函数实现 **************************************************************************/


/**************************************************************************** * @function : SPL06ReadRes_Buf * @brief : SPL06 I2C 读取多字节函数 * @input : * @output : * @return : * @author : CaiNiao 2021/06/07 13:40 *****************************************************************************/ 
bool SPL06ReadRes_Buf(UINT8 ResAddr, UINT8 *pData,UINT8 DataLen)
{ 
        
	UINT8 i = 0;
	I2C1_Start();					//I2C start

	if (FALSE == I2C1_Write(SPL06DeviceAdd & 0xFE))	//写器件
		return FALSE;

	I2C1_Write(ResAddr);			//写入寄存器地址
	I2C1_Start();
	I2C1_Write(SPL06DeviceAdd | 0x01);					//读器件

	if (DataLen > 1)
	{ 
        //读取多个字节
		for (i = 0; i < DataLen; i++)
		{ 
        
			if (i < DataLen - 1)
				*(pData + i) = I2C1_Read(ACK);
			else
				*(pData + i) = I2C1_Read(NACK);
		}
	}
	else//读单个字节
		*(pData) = I2C1_Read(NACK);

	I2C1_Stop();
	return TRUE;
}

/**************************************************************************** * @function : SPL06ReadRes_Single * @brief : SPL06 I2C读取单字节函数 * @input : * @output : * @return : * @author : CaiNiao 2021/06/07 13:40 *****************************************************************************/
UINT8 SPL06ReadRes_Single(UINT8 ResAddr)
{ 
        
	UINT8 DataTemp = 0;
	I2C1_Start();					//I2C start

	if (FALSE == I2C1_Write(SPL06DeviceAdd & 0xFE))	//写器件
		return DataTemp;

	I2C1_Write(ResAddr);			//写入寄存器地址
	I2C1_Start();
	I2C1_Write(SPL06DeviceAdd | 0x01);					//读器件
	DataTemp = I2C1_Read(NACK);
	I2C1_Stop();
	return DataTemp;
}

/**************************************************************************** * @function : SPL06WriteRes_Single * @brief : SPL06 I2C WriteRes * @input : * @output : * @return : * @author : CaiNiao 2021/06/07 13:40 *****************************************************************************/ 
bool SPL06WriteRes_Single(UINT8 ResAddr,UINT8 DataTemp)
{ 
        
	I2C1_Start();					//I2C start

	if (FALSE == I2C1_Write(SPL06DeviceAdd & 0xFE))	//写器件
		return FALSE;

	I2C1_Write(ResAddr);			//写入寄存器地址
	I2C1_Write(DataTemp);			//写数据

	I2C1_Stop();					//I2C Stop
	return TRUE;
}

void SPL06_Config_Temperature(UINT8 rate, UINT8 oversampling, T_SPL06_calibPara *ptSPL06_calibPara)
{ 
        
	UINT8 temp;
	switch (oversampling)
	{ 
        
	case TMP_PRC_1:
		ptSPL06_calibPara->kT = 524288;
		break;
	case TMP_PRC_2:
		ptSPL06_calibPara->kT = 1572864;
		break;
	case TMP_PRC_4:
		ptSPL06_calibPara->kT = 3670016;
		break;
	case TMP_PRC_8:
		ptSPL06_calibPara->kT = 7864320;
		break;
	case TMP_PRC_16:
		ptSPL06_calibPara->kT = 253952;
		break;
	case TMP_PRC_32:
		ptSPL06_calibPara->kT = 516096;
		break;
	case TMP_PRC_64:
		ptSPL06_calibPara->kT = 1040384;
		break;
	case TMP_PRC_128:
		ptSPL06_calibPara->kT = 2088960;
		break;
	}

	SPL06WriteRes_Single(SPL06_TMP_CFG, rate | oversampling | 0x80);   //温度每秒128次测量一次
	if (oversampling > TMP_PRC_8)
	{ 
        
		temp = SPL06ReadRes_Single(SPL06_CFG_REG);
		SPL06WriteRes_Single(SPL06_CFG_REG, temp | SPL06_CFG_T_SHIFT);
	}
}

void SPL06_Config_Pressure(UINT8 rate, UINT8 oversampling, T_SPL06_calibPara *ptSPL06_calibPara)
{ 
        
	UINT8 temp;
	switch (oversampling)
	{ 
        
	case PM_PRC_1:
		ptSPL06_calibPara->kP = 524288;
		break;
	case PM_PRC_2:
		ptSPL06_calibPara->kP = 1572864;
		break;
	case PM_PRC_4:
		ptSPL06_calibPara->kP = 3670016;
		break;
	case PM_PRC_8:
		ptSPL06_calibPara->kP = 7864320;
		break;
	case PM_PRC_16:
		ptSPL06_calibPara->kP = 253952;
		break;
	case PM_PRC_32:
		ptSPL06_calibPara->kP = 516096;
		break;
	case PM_PRC_64:
		ptSPL06_calibPara->kP = 1040384;
		break;
	case PM_PRC_128:
		ptSPL06_calibPara->kP = 2088960;
		break;
	}

	SPL06WriteRes_Single(SPL06_PSR_CFG, rate | oversampling);
	if (oversampling > PM_PRC_8)
	{ 
        
		temp = SPL06ReadRes_Single(SPL06_CFG_REG);
		SPL06WriteRes_Single(SPL06_CFG_REG, temp | SPL06_CFG_P_SHIFT);
	}
}

void SPL06_Start(UINT8 mode)
{ 
        
	SPL06WriteRes_Single(SPL06_MEAS_CFG, mode);
}

/**************************************************************************** * @function : SPL06_Init * @brief : SPL06 初始化函数 * @input : * @output : * @return : * @author : CaiNiao 2021/06/07 13:40 *****************************************************************************/ 
void SPL06_Init(T_SPL06_calibPara *ptSPL06_calibPara)
{ 
        
	UINT8 coef[18];
	UINT8 id;

	id = SPL06ReadRes_Single(SPL06_ID);//ID 正常情况是0x10
	
	SPL06ReadRes_Buf(SPL06_COEF, coef, 18);
	ptSPL06_calibPara->C0 = ((INT16)coef[0] << 4) + ((coef[1] & 0xF0) >> 4);
	ptSPL06_calibPara->C0 = (ptSPL06_calibPara->C0 & 0x0800) ? (0xF000 | ptSPL06_calibPara->C0) : ptSPL06_calibPara->C0;
	ptSPL06_calibPara->C1 = ((INT16)(coef[1] & 0x0F) << 8) + coef[2];
	ptSPL06_calibPara->C1 = (ptSPL06_calibPara->C1 & 0x0800) ? (0xF000 | ptSPL06_calibPara->C1) : ptSPL06_calibPara->C1;
	ptSPL06_calibPara->C00 = ((INT32)coef[3] << 12) + ((INT32)coef[4] << 4) + (coef[5] >> 4);
	ptSPL06_calibPara->C00 = (ptSPL06_calibPara->C00 & 0x080000) ? (0xFFF00000 | ptSPL06_calibPara->C00) : ptSPL06_calibPara->C00;
	ptSPL06_calibPara->C10 = ((INT32)(coef[5] & 0x0F) << 16) + ((INT32)coef[6] << 8) + coef[7];
	ptSPL06_calibPara->C10 = (ptSPL06_calibPara->C10 & 0x080000) ? (0xFFF00000 | ptSPL06_calibPara->C10) : ptSPL06_calibPara->C10;
	ptSPL06_calibPara->C01 = ((INT16)coef[8] << 8) + coef[9];
	ptSPL06_calibPara->C11 = ((INT16)coef[10] << 8) + coef[11];
	ptSPL06_calibPara->C20 = ((INT16)coef[12] << 8) + coef[13];
	ptSPL06_calibPara->C21 = ((INT16)coef[14] << 8) + coef[15];
	ptSPL06_calibPara->C30 = ((INT16)coef[16] << 8) + coef[17];

	SPL06_Config_Pressure(PM_RATE_4, PM_PRC_32, ptSPL06_calibPara);
	SPL06_Config_Temperature(PM_RATE_4, TMP_PRC_8, ptSPL06_calibPara);

	SPL06_Start(MEAS_CTRL_ContinuousPressTemp); //启动连续的气压温度测量
}

/**************************************************************************** * @function : SPL06_SoftReset * @brief : SPL06软件复位 * @input : * @output : * @return : * @author : CaiNiao 2021/06/07 13:40 *****************************************************************************/
void SPL06_SoftReset()
{ 
        
	I2C1_Start();				//I2C start
	
	I2C1_Write(SPL06DeviceAdd & 0xFE);			//写入从机地址与写标志位
	I2C1_Write(SPL06_RESET);					//写入寄存器地址--芯片复位
	I2C1_Write(0x89);			//写数据
	I2C1_Stop();				//I2C Stop
}

INT32 SPL06_Get_Pressure_Adc()
{ 
        
	UINT8 buf[3];
	INT32 adc;

	SPL06ReadRes_Buf(SPL06_PSR_B2, buf, 3);
	adc = (INT32)(buf[0] << 16) + (INT32)(buf[1] << 8) + buf[2];
	adc = (adc & 0x800000) ? (0xFF000000 | adc) : adc;
	return adc;
}

INT32 SPL06_Get_Temperature_Adc()
{ 
        
	UINT8 buf[3];
	INT32 adc;

	SPL06ReadRes_Buf(SPL06_TMP_B2, buf, 3);
	adc = (INT32)(buf[0] << 16) + (INT32)(buf[1] << 8) + buf[2];
	adc = (adc & 0x800000) ? (0xFF000000 | adc) : adc;
	return adc;
}

float  

标签: 传感器中spl

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台