generated from hulk/gd32e23x_template_cmake_vscode
489 lines
21 KiB
C
489 lines
21 KiB
C
//
|
||
// Created by dell on 24-12-3.
|
||
//
|
||
|
||
#ifndef LDC1612_H
|
||
#define LDC1612_H
|
||
|
||
#include "gd32e23x_it.h"
|
||
#include "gd32e23x.h"
|
||
#include "systick.h"
|
||
#include <stdbool.h>
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
#include <math.h>
|
||
#include "board_config.h"
|
||
#include "i2c.h"
|
||
|
||
/***************************************************************************/
|
||
|
||
/* IIC Interface Selection */
|
||
#ifdef SOFTWARE_IIC
|
||
#define LDC1612_IIC_WRITE_16BITS(addr, reg, data) soft_i2c_write_16bits(addr, reg, data)
|
||
#define LDC1612_IIC_READ_16BITS(addr, reg, data) soft_i2c_read_16bits(addr, reg, data)
|
||
#define LDC1612_IIC_TYPE_STR "Software IIC"
|
||
#else
|
||
#define LDC1612_IIC_WRITE_16BITS(addr, reg, data) i2c_write_16bits(addr, reg, data)
|
||
#define LDC1612_IIC_READ_16BITS(addr, reg, data) i2c_read_16bits(addr, reg, data)
|
||
#define LDC1612_IIC_TYPE_STR "Hardware IIC"
|
||
#endif
|
||
|
||
/* >>>>>>>>>>>>>>>>>>>>>>>>>>>>[EXT CLK(MHz)]<<<<<<<<<<<<<<<<<<<< */
|
||
|
||
#define LDC1612_EXT_CLK_MHZ 40
|
||
|
||
/***************************************************************************/
|
||
|
||
#define LDC1612_ADDR (0x2B)
|
||
|
||
/******************************************************************************/
|
||
|
||
#define COIL_L_UH 40.9
|
||
#define COIL_C_PF 180
|
||
|
||
/************************Register Addr***************************************/
|
||
|
||
#define CONVERSION_RESULT_REG_START 0X00
|
||
#define SET_CONVERSION_TIME_REG_START 0X08
|
||
#define SET_CONVERSION_OFFSET_REG_START 0X0C
|
||
#define SET_SETTLECOUNT_REG_START 0X10
|
||
#define SET_FREQ_REG_START 0X14
|
||
#define SENSOR_STATUS_REG 0X18
|
||
#define ERROR_CONFIG_REG 0X19
|
||
#define SENSOR_CONFIG_REG 0X1A
|
||
#define MUX_CONFIG_REG 0X1B
|
||
#define SENSOR_RESET_REG 0X1C
|
||
#define SET_DRIVER_CURRENT_REG 0X1E
|
||
#define READ_MANUFACTURER_ID 0X7E
|
||
#define READ_DEVICE_ID 0X7F
|
||
|
||
/**********************Sensor Channel****************************************/
|
||
|
||
#define CHANNEL_0 0
|
||
#define CHANNEL_1 1
|
||
|
||
/**************************DATA (0x00-0x03)*******************************************/
|
||
/*
|
||
* 作用: 存储28位的传感器转换结果。结果分为高字节(MSB)和低字节(LSB)两个寄存器。
|
||
*
|
||
* 结构说明:
|
||
* - DATA_CHx_MSB: 包含错误标志和数据的高12位 [27:16]。
|
||
* - DATA_CHx_LSB: 包含数据的低16位 [15:0]。
|
||
*
|
||
* MSB寄存器位域:
|
||
* [15] ERR_UR: 转换下溢错误标志 (1 = 发生错误)
|
||
* [14] ERR_OR: 转换上溢错误标志 (1 = 发生错误)
|
||
* [13] ERR_WD: 看门狗超时错误标志 (1 = 发生错误)
|
||
* [12] ERR_AE: 振幅错误标志 (高或低) (1 = 发生错误)
|
||
* [11:0] DATA[27:16]: 数据的高12位
|
||
*
|
||
* 注意:
|
||
* - 仅当ERROR_CONFIG寄存器中对应的ERR2OUT位置1时,这些错误标志才会在MSB寄存器中被设置。
|
||
* - 读取数据时,应先读取LSB,再读取MSB,以确保数据的一致性。
|
||
*/
|
||
|
||
/* --- 数据寄存器错误标志位掩码 --- */
|
||
#define LDC1612_DATA_ERR_UR (1 << 15)
|
||
#define LDC1612_DATA_ERR_OR (1 << 14)
|
||
#define LDC1612_DATA_ERR_WD (1 << 13)
|
||
#define LDC1612_DATA_ERR_AE (1 << 12)
|
||
#define LDC1612_DATA_ERR_MASK (0xF000)
|
||
#define LDC1612_DATA_MSB_MASK (0x0FFF)
|
||
|
||
/**************************RCOUNT (0x08, 0x09)****************************************/
|
||
/*
|
||
* 作用: 设置参考计数器值,决定了传感器的转换时间,从而影响测量分辨率。
|
||
*
|
||
* 位域说明:
|
||
* [15:0] RCOUNT: 参考计数值。
|
||
*
|
||
* 计算公式:
|
||
* t_CONVERSION = (RCOUNT * 16) / f_REF
|
||
*
|
||
* 注意:
|
||
* - RCOUNT值必须 ≥ 0x0004。
|
||
* - 该寄存器在复位后值为 0x0080。
|
||
*
|
||
* 配置建议:
|
||
* - 需要高采样率: 使用较小的RCOUNT值。
|
||
* - 需要高分辨率: 使用较大的RCOUNT值。
|
||
*/
|
||
|
||
/* --- 预设配置示例 --- */
|
||
// 高速采样配置 (分辨率较低)
|
||
#define LDC1612_RCOUNT_HIGH_SPEED (0x04D6) // 1238, 约 1kSPS @ 40MHz/2
|
||
|
||
// 平衡配置 (常用)
|
||
#define LDC1612_RCOUNT_BALANCED (0x1000) // 4096, 约 380SPS @ 40MHz/2
|
||
|
||
// 高分辨率配置 (采样率较低)
|
||
#define LDC1612_RCOUNT_HIGH_RESOLUTION (0xFFFF) // 65535, 约 24SPS @ 40MHz/2
|
||
|
||
// 默认配置
|
||
#define LDC1612_RCOUNT_TIME_CH0 LDC1612_RCOUNT_BALANCED // 0x1000=4096个时钟周期
|
||
|
||
/**************************OFFSET (0x0C, 0x0D)****************************************/
|
||
/*
|
||
* 作用: 设置一个16位的数字偏移量,该值会从原始转换结果中减去。
|
||
*
|
||
* 位域说明:
|
||
* [15:0] OFFSET: 数据偏移值。
|
||
*
|
||
* 计算公式:
|
||
* 最终数据 = 原始转换数据 - OFFSET
|
||
*
|
||
* 注意:
|
||
* - 如果减法结果为负,将触发下溢错误 (ERR_UR)。
|
||
* - 该寄存器在复位后值为 0x0000。
|
||
*
|
||
* 应用场景:
|
||
* - 消除传感器或环境的固有基线偏移。
|
||
* - 实现“去皮”(Tare)功能,将当前读数设为新的零点。
|
||
*/
|
||
|
||
// 默认配置: 不设置偏移
|
||
#define SET_CONVERSION_OFFSET_CH0 0x0000
|
||
|
||
/**************************SETTLECOUNT (0x10, 0x11)***********************************/
|
||
/*
|
||
* 作用: 设置传感器振荡器在开始转换前所需的建立时间。
|
||
*
|
||
* 位域说明:
|
||
* [15:0] SETTLECOUNT: 建立时间计数值。
|
||
*
|
||
* 计算公式:
|
||
* t_SETTLE 的计算方式取决于SETTLECOUNT的值:
|
||
* - 当 SETTLECOUNT = 0x0000 或 0x0001 时, t_SETTLE = 32 / f_REF
|
||
* - 当 SETTLECOUNT ≥ 0x0002 时, t_SETTLE = (SETTLECOUNT * 16) / f_REF
|
||
*
|
||
* 配置建议:
|
||
* - 传感器的Q值越高,所需的建立时间越短 (SETTLECOUNT值可以越小)。
|
||
* - 值过小可能导致传感器未充分稳定,数据不准确。
|
||
* - 值过大则会不必要地增加总转换时间,降低采样率。
|
||
* - 对于大多数应用,0x0100 (256) 是一个很好的起始值。
|
||
*/
|
||
|
||
/* --- 预设配置示例 --- */
|
||
// 适用于高Q值传感器 (建立时间短)
|
||
#define LDC1612_SETTLECOUNT_HIGH_Q (0x000A) // 约 4µs @ 40MHz/2
|
||
|
||
// 适用于中等Q值传感器 (通用)
|
||
#define LDC1612_SETTLECOUNT_MEDIUM_Q (0x0100) // 约 102µs @ 40MHz/2
|
||
|
||
// 适用于低Q值传感器 (建立时间长)
|
||
#define LDC1612_SETTLECOUNT_LOW_Q (0x0400) // 约 410µs @ 40MHz/2
|
||
|
||
// 默认配置
|
||
#define LDC1612_SETTLECOUNT_CH0 LDC1612_SETTLECOUNT_MEDIUM_Q
|
||
|
||
/**************************CLOCK_DIVIDER (0x14, 0x15)***********************************/
|
||
/*
|
||
* 作用: 配置传感器输入频率(f_sensor)和参考时钟(f_ref)的分频器。
|
||
*
|
||
* 位域说明:
|
||
* [15:12] FIN_DIVIDER: 传感器输入分频器。
|
||
* [11:10] RESERVED: 必须为00。
|
||
* [9:0] FREF_DIVIDER: 参考时钟分频器。
|
||
*
|
||
* 配置逻辑:
|
||
* 1. FIN_DIVIDER: 根据传感器的谐振频率 f_sensor 选择。
|
||
* - 目标是使 f_sensor / FIN_DIVIDER <= 8.75MHz。
|
||
* - 例如: 如果 f_sensor = 15MHz, 则 FIN_DIVIDER 必须 >= 2。
|
||
*
|
||
* 2. FREF_DIVIDER: 根据外部时钟 f_clk 和工作模式选择。
|
||
* - 目标是使 f_ref = f_clk / FREF_DIVIDER。
|
||
* - 单通道模式且 f_clk <= 35MHz: FREF_DIVIDER = 1。
|
||
* - 双通道模式或 f_clk > 35MHz: FREF_DIVIDER = 2。
|
||
*
|
||
* 最终寄存器值 = (FIN_DIVIDER << 12) | FREF_DIVIDER;
|
||
*/
|
||
|
||
/* --- 位域选项宏 --- */
|
||
// [15:12] Sensor Input Divider (FIN_DIVIDER)
|
||
#define LDC1612_FIN_DIV_1 (0x1 << 12) // for f_sensor <= 8.75MHz
|
||
#define LDC1612_FIN_DIV_2 (0x2 << 12) // for 8.75MHz < f_sensor <= 17.5MHz
|
||
#define LDC1612_FIN_DIV_4 (0x3 << 12) // for 17.5MHz < f_sensor <= 35MHz
|
||
|
||
// [9:0] Reference Clock Divider (FREF_DIVIDER)
|
||
#define LDC1612_FREF_DIV_1 (0x001)
|
||
#define LDC1612_FREF_DIV_2 (0x002)
|
||
|
||
/* --- 组合宏 --- */
|
||
#define LDC1612_CLOCK_DIVIDER_GEN(fin_div, fref_div) ((fin_div) | (fref_div))
|
||
|
||
/* --- 预设配置示例 (基于40MHz外部时钟) --- */
|
||
// 适用于 f_sensor <= 8.75MHz
|
||
#define LDC1612_CLOCK_DIVIDER_DEFAULT LDC1612_CLOCK_DIVIDER_GEN(LDC1612_FIN_DIV_1, LDC1612_FREF_DIV_2) // 0x1002
|
||
|
||
|
||
/**************************STATUS (0x18) MACROS****************************************
|
||
*
|
||
* 作用: 定义STATUS寄存器的位掩码,用于解析设备状态。
|
||
*
|
||
*/
|
||
#define LDC1612_STATUS_DRDY (1 << 6) // 数据就绪
|
||
#define LDC1612_STATUS_UNREAD_CH0 (1 << 3) // 通道0有未读数据
|
||
#define LDC1612_STATUS_UNREAD_CH1 (1 << 2) // 通道1有未读数据
|
||
|
||
#define LDC1612_STATUS_ERR_ZC (1 << 8) // 零计数错误
|
||
#define LDC1612_STATUS_ERR_ALE (1 << 9) // 振幅过低
|
||
#define LDC1612_STATUS_ERR_AHE (1 << 10) // 振幅过高
|
||
#define LDC1612_STATUS_ERR_WD (1 << 11) // 看门狗超时
|
||
#define LDC1612_STATUS_ERR_OR (1 << 12) // 转换上溢
|
||
#define LDC1612_STATUS_ERR_UR (1 << 13) // 转换下溢
|
||
#define LDC1612_STATUS_ERR_CHAN_MASK (3 << 14) // 错误通道掩码
|
||
|
||
/**************************ERROR_CONFIG (0x19)****************************************/
|
||
/*
|
||
* 作用: 配置状态或错误输出或者触发INTB引脚中断。
|
||
*
|
||
* 位域说明:
|
||
* [15] UR_ERR2OUT: 1 = 转换下溢错误输出到DATA_CHx寄存器
|
||
* [14] OR_ERR2OUT: 1 = 转换上溢错误输出到DATA_CHx寄存器
|
||
* [13] WD_ERR2OUT: 1 = 看门狗超时错误输出到DATA_CHx寄存器
|
||
* [12] AH_ERR2OUT: 1 = 振幅过高错误输出到DATA_CHx寄存器
|
||
* [11] AL_ERR2OUT: 1 = 振幅过低错误输出到DATA_CHx寄存器
|
||
* [10:8] RESERVED
|
||
* [7] UR_ERR2INT: 1 = 转换下溢错误触发INTB
|
||
* [6] OR_ERR2INT: 1 = 转换上溢错误触发INTB
|
||
* [5] WD_ERR2INT: 1 = 看门狗超时错误触发INTB
|
||
* [4] AH_ERR2INT: 1 = 振幅过高错误触发INTB
|
||
* [3] AL_ERR2INT: 1 = 振幅过低错误触发INTB
|
||
* [2] ZC_ERR2INT: 1 = 零计数错误触发INTB
|
||
* [1] RESERVED
|
||
* [0] DRDY_2INT: 1 = 数据就绪标志触发INTB
|
||
*/
|
||
|
||
/* --- 位域选项宏 --- */
|
||
|
||
// --- 中断触发 (ERR2INT) ---
|
||
#define LDC1612_ERR_CFG_DRDY_INT_EN (1 << 0) // 数据就绪中断使能
|
||
#define LDC1612_ERR_CFG_ZC_INT_EN (1 << 2) // 零计数错误中断使能
|
||
#define LDC1612_ERR_CFG_AL_INT_EN (1 << 3) // 振幅过低错误中断使能
|
||
#define LDC1612_ERR_CFG_AH_INT_EN (1 << 4) // 振幅过高错误中断使能
|
||
#define LDC1612_ERR_CFG_WD_INT_EN (1 << 5) // 看门狗超时中断使能
|
||
#define LDC1612_ERR_CFG_OR_INT_EN (1 << 6) // 转换上溢中断使能
|
||
#define LDC1612_ERR_CFG_UR_INT_EN (1 << 7) // 转换下溢中断使能
|
||
|
||
// --- 错误报告至数据寄存器 (ERR2OUT) ---
|
||
#define LDC1612_ERR_CFG_AL_OUT_EN (1 << 11) // 振幅过低错误报告使能
|
||
#define LDC1612_ERR_CFG_AH_OUT_EN (1 << 12) // 振幅过高错误报告使能
|
||
#define LDC1612_ERR_CFG_WD_OUT_EN (1 << 13) // 看门狗超时错误报告使能
|
||
#define LDC1612_ERR_CFG_OR_OUT_EN (1 << 14) // 转换上溢错误报告使能
|
||
#define LDC1612_ERR_CFG_UR_OUT_EN (1 << 15) // 转换下溢错误报告使能
|
||
|
||
// 常用配置: 仅使能 "数据就绪" 中断
|
||
#define LDC1612_ERROR_CONFIG_DRDY_ONLY (LDC1612_ERR_CFG_DRDY_INT_EN) // 结果: 0x0001
|
||
|
||
// 常用配置: 使能所有错误报告
|
||
#define LDC1612_ERROR_CONFIG_OUT_ONLY (LDC1612_ERR_CFG_AL_OUT_EN | \
|
||
LDC1612_ERR_CFG_AH_OUT_EN | \
|
||
LDC1612_ERR_CFG_WD_OUT_EN | \
|
||
LDC1612_ERR_CFG_OR_OUT_EN | \
|
||
LDC1612_ERR_CFG_UR_OUT_EN) // 结果: 0xF800
|
||
|
||
// 调试配置: 使能所有错误中断和错误报告
|
||
#define LDC1612_ERROR_CONFIG_DEBUG_ALL (LDC1612_ERR_CFG_DRDY_INT_EN | \
|
||
LDC1612_ERR_CFG_ZC_INT_EN | \
|
||
LDC1612_ERR_CFG_AL_INT_EN | \
|
||
LDC1612_ERR_CFG_AH_INT_EN | \
|
||
LDC1612_ERR_CFG_WD_INT_EN | \
|
||
LDC1612_ERR_CFG_OR_INT_EN | \
|
||
LDC1612_ERR_CFG_UR_INT_EN | \
|
||
LDC1612_ERR_CFG_AL_OUT_EN | \
|
||
LDC1612_ERR_CFG_AH_OUT_EN | \
|
||
LDC1612_ERR_CFG_WD_OUT_EN | \
|
||
LDC1612_ERR_CFG_OR_OUT_EN | \
|
||
LDC1612_ERR_CFG_UR_OUT_EN) // 结果: 0xF8FD
|
||
|
||
// 默认配置: 所有功能都禁用
|
||
#define LDC1612_ERROR_CONFIG_DEFAULT (0x0000)
|
||
|
||
/**************************SENSOR_CONFIG (0x1A) MACROS***************************************/
|
||
/*
|
||
* CONFIG寄存器位域宏定义,用于灵活组合生成配置值。
|
||
* 使用方法: LDC1612_CONFIG_GEN(ACTIVE_CHAN, SLEEP_MODE, RP_OVERRIDE, AUTO_AMP, CLK_SRC, INTB, CURRENT_DRV)
|
||
*
|
||
* 位域说明 (根据 LDC1612_REG_LIST.md):
|
||
* [15:14] ACTIVE_CHAN: 激活通道选择 (仅在 AUTOSCAN_EN=0 时有效)
|
||
* [13] SLEEP_MODE_EN: 1 = 睡眠模式使能
|
||
* [12] RP_OVERRIDE_EN: 1 = 禁用自动校准 (使用手动的IDRIVE设置)
|
||
* [11] SENSOR_ACTIVATE_SEL: 传感器激活电流选择 (0:低电流, 1:高电流)
|
||
* [10] AUTO_AMP_DIS: 1 = 禁用自动幅度校正
|
||
* [9] REF_CLK_SRC: 1 = 使用外部CLKIN时钟
|
||
* [8] RESERVED: 必须为0
|
||
* [7] INTB_DIS: 1 = 禁用INTB中断引脚
|
||
* [6] HIGH_CURRENT_DRV: 1 = 通道0高电流驱动模式
|
||
* [5:0] RESERVED: 必须写入 0x01
|
||
*/
|
||
|
||
/* --- 位域选项宏 --- */
|
||
// [15:14] Active Channel Selection
|
||
#define LDC1612_CONFIG_ACTIVE_CHAN_CH0 (0x00 << 14)
|
||
#define LDC1612_CONFIG_ACTIVE_CHAN_CH1 (0x01 << 14)
|
||
|
||
// [13] Sleep Mode Enable
|
||
#define LDC1612_CONFIG_SLEEP_MODE_DISABLE (0x00 << 13)
|
||
#define LDC1612_CONFIG_SLEEP_MODE_ENABLE (0x01 << 13)
|
||
|
||
// [12] RP Override Enable (Auto-Calibration Disable)
|
||
#define LDC1612_CONFIG_RP_OVERRIDE_DISABLE (0x00 << 12) // 启用自动校准
|
||
#define LDC1612_CONFIG_RP_OVERRIDE_ENABLE (0x01 << 12) // 禁用自动校准
|
||
|
||
// [11] Sensor Activation Current Selection
|
||
#define LDC1612_CONFIG_SENSOR_ACT_LOW_I (0x00 << 11) // 低电流激活
|
||
#define LDC1612_CONFIG_SENSOR_ACT_HIGH_I (0x01 << 11) // 高电流激活
|
||
|
||
// [10] Auto Amplitude Correction Disable
|
||
#define LDC1612_CONFIG_AUTO_AMP_ENABLE (0x00 << 10) // 启用自动幅度校正
|
||
#define LDC1612_CONFIG_AUTO_AMP_DISABLE (0x01 << 10) // 禁用自动幅度校正
|
||
|
||
// [9] Reference Clock Source
|
||
#define LDC1612_CONFIG_CLK_SRC_INTERNAL (0x00 << 9)
|
||
#define LDC1612_CONFIG_CLK_SRC_EXTERNAL (0x01 << 9)
|
||
|
||
// [7] INTB Pin Disable
|
||
#define LDC1612_CONFIG_INTB_ENABLE (0x00 << 7)
|
||
#define LDC1612_CONFIG_INTB_DISABLE (0x01 << 7)
|
||
|
||
// [6] High Current Drive (Channel 0)
|
||
#define LDC1612_CONFIG_HIGH_CURRENT_DISABLE (0x00 << 6)
|
||
#define LDC1612_CONFIG_HIGH_CURRENT_ENABLE (0x01 << 6)
|
||
|
||
/* --- 组合宏 --- */
|
||
// 将所有位域组合成一个16位值。注意,保留位0x01被固定添加。
|
||
#define LDC1612_CONFIG_GEN(active_chan, sleep, rp_override, sensor_act, auto_amp, clk_src, intb, high_current) \
|
||
( (active_chan) | (sleep) | (rp_override) | (sensor_act) | (auto_amp) | (clk_src) | (intb) | (high_current) | 0x0001 )
|
||
|
||
/* --- 预设配置示例 --- */
|
||
// CH0连续转换, 外部时钟, 高驱动电流, 禁用自动幅度修正(适用于电流检测)
|
||
#define LDC1612_SENSOR_CONFIG_CH0 LDC1612_CONFIG_GEN( \
|
||
LDC1612_CONFIG_ACTIVE_CHAN_CH0, \
|
||
LDC1612_CONFIG_SLEEP_MODE_DISABLE, \
|
||
LDC1612_CONFIG_RP_OVERRIDE_ENABLE, /* Rp覆盖开启 */ \
|
||
LDC1612_CONFIG_SENSOR_ACT_LOW_I, /* 低功耗启动 */ \
|
||
LDC1612_CONFIG_AUTO_AMP_DISABLE, /* 禁用自动幅度校正 */ \
|
||
LDC1612_CONFIG_CLK_SRC_EXTERNAL, /* 外部时钟 */ \
|
||
LDC1612_CONFIG_INTB_ENABLE, /* 启用INTB引脚 */ \
|
||
LDC1612_CONFIG_HIGH_CURRENT_ENABLE /* 大电流模式 */ ) // 结果: 0x1641
|
||
// TODO 对比1601的不同(大电流与标准电流)
|
||
|
||
// 睡眠模式, 外部时钟
|
||
#define LDC1612_SLEEP_MODE LDC1612_CONFIG_GEN( \
|
||
LDC1612_CONFIG_ACTIVE_CHAN_CH0, \
|
||
LDC1612_CONFIG_SLEEP_MODE_ENABLE, \
|
||
LDC1612_CONFIG_RP_OVERRIDE_DISABLE, \
|
||
LDC1612_CONFIG_SENSOR_ACT_HIGH_I, \
|
||
LDC1612_CONFIG_AUTO_AMP_ENABLE, \
|
||
LDC1612_CONFIG_CLK_SRC_INTERNAL, \
|
||
LDC1612_CONFIG_INTB_ENABLE, \
|
||
LDC1612_CONFIG_HIGH_CURRENT_DISABLE ) // 结果: 0x2801
|
||
|
||
/*************************MUX_CONFIG (0x1B) MACROS***************************************/
|
||
/*
|
||
* MUX_CONFIG寄存器位域宏定义,用于灵活组合生成配置值。
|
||
*
|
||
* 位域说明:
|
||
* [15] AUTOSCAN_EN: 1 = 自动顺序扫描模式使能
|
||
* [14:13] RR_SEQUENCE: 扫描序列 (00: CH0, CH1)
|
||
* [12:3] RESERVED: 必须写入 0x041
|
||
* [2:0] DEGLITCH: 输入消抖滤波器带宽
|
||
*/
|
||
/* --- 位域选项宏 --- */
|
||
// [15] Auto Scan Mode
|
||
#define LDC1612_MUX_AUTOSCAN_DISABLE (0x00 << 15) // 单通道连续模式
|
||
#define LDC1612_MUX_AUTOSCAN_ENABLE (0x01 << 15) // 自动扫描模式
|
||
|
||
// [14:13] Round Robin Sequence
|
||
#define LDC1612_MUX_RR_SEQ_CH0_CH1 (0x00 << 13) // 扫描 CH0, CH1
|
||
|
||
// [2:0] Deglitch Filter Bandwidth
|
||
#define LDC1612_MUX_DEGLITCH_1MHZ (0x01)
|
||
#define LDC1612_MUX_DEGLITCH_3_3MHZ (0x04)
|
||
#define LDC1612_MUX_DEGLITCH_10MHZ (0x05)
|
||
#define LDC1612_MUX_DEGLITCH_33MHZ (0x07)
|
||
|
||
/* --- 组合宏 --- */
|
||
// 将所有位域组合成一个16位值。注意,保留位0x0208 (0x041 << 3)被固定添加。
|
||
#define LDC1612_MUX_CONFIG_GEN(autoscan, sequence, deglitch) \
|
||
( (autoscan) | (sequence) | (deglitch) | 0x0208 )
|
||
|
||
/* --- 预设配置示例 --- */
|
||
// 单通道模式, 3.3MHz 滤波
|
||
#define LDC1612_MUX_CONFIG LDC1612_MUX_CONFIG_GEN( \
|
||
LDC1612_MUX_AUTOSCAN_DISABLE, \
|
||
LDC1612_MUX_RR_SEQ_CH0_CH1, /* 此模式下无效,但保持定义 */ \
|
||
LDC1612_MUX_DEGLITCH_3_3MHZ ) // 0x020C
|
||
|
||
/***********************RESET DEVICE (0x1C)***********************************/
|
||
/*
|
||
* 向RESET_DEV寄存器写入 LDC1612_RESET_CMD 会触发软件复位。
|
||
* 复位后,所有寄存器将恢复为默认值,设备进入睡眠模式。
|
||
* 需要大约10ms的稳定时间后才能重新配置。
|
||
*/
|
||
#define LDC1612_RESET_DEV 0x8000
|
||
|
||
/**************************DRIVE_CURRENT (0x1E, 0x1F)****************************************/
|
||
/*
|
||
* 作用: 设置传感器的驱动电流,以确保振荡幅度(Vosc)在1.2V到1.8V之间。
|
||
*
|
||
* 位域说明:
|
||
* [15:11] IDRIVE: 当前驱动电流设置值 (0-31)。
|
||
* [10:6] INIT_IDRIVE: 初始驱动电流设置值 (0-31)。
|
||
* [5:0] RESERVED: 必须为0。
|
||
*
|
||
* 配置建议:
|
||
* 1. 初始阶段可启用自动校准 (CONFIG.RP_OVERRIDE_EN = 0),让芯片自动寻找合适的IDRIVE值。
|
||
* 2. 读取DRIVE_CURRENT寄存器,获得自动校准后的IDRIVE值。
|
||
* 3. 在最终代码中,禁用自动校准 (CONFIG.RP_OVERRIDE_EN = 1),并手动写入这个调试好的IDRIVE值。
|
||
*
|
||
* CH_INIT_IDRIVE will update when every conversion systick ==>AutoAmpDis is 0
|
||
* CH_INIT_IDRIVE will store init drive current calculated ==> AutoAmpDis is 1
|
||
*/
|
||
|
||
/* --- 驱动电流值生成宏 --- */
|
||
// 参数 idrive: 0-31之间的整数
|
||
#define LDC1612_DRIVE_CURRENT_GEN(idrive) ( (uint16_t)(idrive) << 11 )
|
||
|
||
#define LDC1612_DRIVE_CURRENT LDC1612_DRIVE_CURRENT_GEN(18) // 0x9000
|
||
|
||
/**************************IDs (Read Only 0x7E 0x7F)***********************************/
|
||
|
||
#define LDC1612_MANUFACTURER_ID 0x5449
|
||
#define LDC1612_DEVICE_ID 0x3055
|
||
|
||
/******************************************************************************/
|
||
|
||
typedef enum {
|
||
LDC1612_STATUS_SUCCESS = 0,
|
||
LDC1612_STATUS_ERROR,
|
||
LDC1612_STATUS_TIMEOUT,
|
||
LDC1612_STATUS_INVALID_PARAM,
|
||
LDC1612_STATUS_NO_COIL,
|
||
LDC1612_STATUS_UNDER_RANGE,
|
||
LDC1612_STATUS_OVER_RANGE
|
||
} ldc1612_status_t;
|
||
|
||
/******************************************************************************/
|
||
ldc1612_status_t ldc1612_init(void);
|
||
|
||
ldc1612_status_t ldc1612_reset_sensor(void);
|
||
|
||
ldc1612_status_t ldc1612_config_single_channel(uint8_t channel);
|
||
|
||
uint16_t ldc1612_get_manufacturer_id(void);
|
||
|
||
uint16_t ldc1612_get_deveice_id(void);
|
||
|
||
uint32_t ldc1612_get_raw_channel_result(uint8_t channel);
|
||
|
||
void ldc1612_drvie_current_detect(uint8_t channel);
|
||
|
||
uint16_t ldc1612_get_sensor_status(void);
|
||
|
||
bool ldc1612_is_data_ready(uint8_t channel);
|
||
|
||
uint16_t ldc1612_check_status_and_log_errors(void);
|
||
|
||
#endif //LDC1612_H
|