talk is cheap, show you my code
SPL06.c
#include "SPL06.h"
//*************全局变量*************//
Factor_List* b_list; //存储过采样率对应的系数KP,KT
COEF_ValueStruct Coefficient = { 0 }; //存储校准系数
TEMP_InitTypedef TEMP_InitStructure = { 0 }; //温度测量初始化配置结构体
PSR_InitTypedef PSR_InitStructure = { 0 }; //大气压强测量初始化配置结构体
//*************1.初始化相关函数*************//
//*************1.1 链表初始化相关函数*******//
/**
* @name Factor_List* initList(void)
* @brief 初始化链表头节点,将头节点也利用起来,存储信息
* @param [NONE]
* @return [p] 返回创建的链表头节点地址
*/
Factor_List* initList(void)
{
Factor_List *p = (Factor_List*)malloc(sizeof(Factor_List));
p->OverSamplingRate = _SINGLE_OVERSAMPLING;
p->FACTOR = _SINGLE_SCALE_FACTOR;
p->next = NULL;
if (p == NULL) {
// 处理内存分配失败的情况
return NULL;
}
return p;
}
/**
* @name Factor_List* insertTail(Factor_List *l, uint8_t val, uint32_t Factor)
* @brief 向链表的末尾添加一个节点,即尾插法
* @param [Factor_List *list] 链表的起始节点
* [uint8_t val] 链表OverSamplingRate部分的值,对应过采样率的寄存器值
* [uint32_t Factor] 过采样率对应的比例因子
* @return 尾节点指针,由于数据量只有八个,且链表添加数据之后固定,为了简化代码,没有利用尾节点指针
*/
Factor_List* insertTail(Factor_List *l, uint8_t val, uint32_t Factor)
{
//先创建一个新节点
Factor_List *p = (Factor_List*)malloc(sizeof(Factor_List));
p->OverSamplingRate = val;
p->FACTOR = Factor;
p->next = NULL;
while(l->next != NULL) l = l->next;
l->next = p;
return p;
}
/**
* @name void Init_FactorList(void)
* @brief 初始化链表的所有数据,将过采样率及其对应的比例因子插入到链表中
* @param [NONE]
* @return [NONE]
*/
void Init_FactorList(void)
{
b_list = initList(); //_SINGLE_OVERSAMPLING的数据已经放入
insertTail(b_list, _2TIMES_OVERSAMPLING, _2TIMES_SCALE_FACTOR);
insertTail(b_list, _4TIMES_OVERSAMPLING, _4TIMES_SCALE_FACTOR);
insertTail(b_list, _8TIMES_OVERSAMPLING, _8TIMES_SCALE_FACTOR);
insertTail(b_list, _16TIMES_OVERSAMPLING, _16TIMES_SCALE_FACTOR);
insertTail(b_list, _32TIMES_OVERSAMPLING, _32TIMES_SCALE_FACTOR);
insertTail(b_list, _64TIMES_OVERSAMPLING, _64TIMES_SCALE_FACTOR);
insertTail(b_list, _128TIMES_OVERSAMPLING, _128TIMES_SCALE_FACTOR);
}
/**
* @brief 根据对应的过采样率寻找对应的比例因子
* @param [Factor_List *list] 要查找的链表
* [val] 用于查询的过采样率
* @return 返回的比例因子数值
*/
uint32_t FindFactor(Factor_List* l, uint8_t val)
{
while(l->OverSamplingRate != val)
{
l = l->next;
}
return l->FACTOR;
}
//*************1.2 SPL06初始化相关函数******//
/**
* @name uint8_t SPL06_Init(void)
* @brief SPL06初始化,包含采样模式,温度采样配置,大气压强采样配置,可以通过修改对应结构体成员来修改配置
* @return 0 配置成功
* 1 I2C通讯异常
* 2 配置采样模式失败,总线无应答
* 3 配置大气压强采样失败,总线无应答
* 4 配置温度采样失败,总线无应答
* 5 获取校正系数失败,可能是校正系数没有准备好,也可能是I2C通讯异常
*/
uint8_t SPL06_Init(void)
{
//1. 拉高SCL、SDA确保起始条件能够被正确发送
MyI2C_W_SCL(1);
MyI2C_W_SDA(1);
//2. 进行读写校验,验证I2C通讯
uint8_t write_buf[2] = {0x11, 0x13};
uint8_t read_buf[2];
MyI2C_WriteMultiRegister(SPL06_ADDRESS, PRS_CFG, 2, write_buf);
MyI2C_ReadMultiRegister(SPL06_ADDRESS, PRS_CFG, 2, read_buf);
for(uint8_t i = 0; i < 2; i++)
{
if(read_buf[i] != write_buf[i])
{
return 1;
}
}
//3. 确认I2C通信正常后,软复位芯片
MyI2C_WriteRegister(RESET, 0x89);
for(uint16_t i=0; i<1000; i++)
{
for(uint16_t j=0; j<2000; j++);
}
//4. 配置采样模式:连续采样大气压强和温度
if(SPL_OperatingModeInit(STRAT_CONTINUOUS_PSR_TEMP))
return 2;
//5. 配置大气压强采样频率,过采样率
PSR_InitStructure.MEASURE_RATE = _4HZ_MEASUREMENT; //采样频率
PSR_InitStructure.OVER_SAMPLING_TIMES = _64TIMES_OVERSAMPLING; //过采样率
if(SPL06_PSRInitStruct(&PSR_InitStructure))
return 3;
//6. 配置温度采样频率,过采样率
TEMP_InitStructure.MEASURE_RATE = _4HZ_MEASUREMENT; //采样频率
TEMP_InitStructure.OVER_SAMPLING_TIMES = _SINGLE_OVERSAMPLING; //过采样率
TEMP_InitStructure.SENSOR_SOURCE = _EXTERNAL_SENSOR;
if(SPL06_TEMPInitStruct(&TEMP_InitStructure))
return 2;
//7. 当大气压强过采样率>8时,必须启用P Shift
MyI2C_WriteRegister(CFG_REG, 0x04); // 启动P位移,0x04,禁用FIFO 0x06,启用FIFO
//8. 初始化KP、KT链表
Init_FactorList();
//9. 读取矫正系数,保存在Coefficient结构体中
if(GetCoefVal(&Coefficient) != 0)
return 5;
//10. 正常返回0
return 0;
}
/**
* @name uint8_t SPL06_PSRInitStruct(PSR_InitTypedef* PSR_InitStructure)
* @brief 配置大气压强测量控制寄存器,可配置采样频率,过采样率
* @param [PSR_InitStructure] 传入的结构体指针,包含配置信息
* @return 0 成功
* 1 失败
*/
uint8_t SPL06_PSRInitStruct(PSR_InitTypedef* PSR_InitStructure)
{
uint8_t config = 0x00;
config = PSR_InitStructure-