SPL06 基于stm32F103 HAL库驱动(软件模拟IIC)

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-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Crkylin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值