// // Created by dell on 24-12-3. // #ifndef LDC1612_H #define LDC1612_H #include "gd32e23x_it.h" #include "gd32e23x.h" #include "systick.h" #include #include #include #include #include #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 /***************************************************************************/ #define LDC1612_ADDR (0x2B) /************************Register Addr***************************************/ #define CONVERTION_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 /*************************MUX_CONFIG******************************************** * 0x0209 AutoScanEN: 0 / RR_SEQ: 00 / RESERVED: 0 0010 0000 1 / Deglitch: 001( 1MHz) * 0x020C AutoScanEN: 0 / RR_SEQ: 00 / RESERVED: 0 0010 0000 1 / Deglitch: 100(3.3MHz) * 0x020D AutoScanEN: 0 / RR_SEQ: 00 / RESERVED: 0 0010 0000 1 / Deglitch: 100( 10MHz) * 0x020F AutoScanEN: 0 / RR_SEQ: 00 / RESERVED: 0 0010 0000 1 / Deglitch: 100( 33MHz) */ #define LDC1612_MUX_CONFIG 0x020C /***********************SENSOR_CONFIG******************************************** * 0x1601 Active CH0: 00 / SLEEP: 0 / OVERDRIVE: 1 / LowPowerMode: 0 / AutoAmpDis 1 / CLK(ext): 1 / RESERVED: 0 / INTB_Dis : 0 / HighCurrent: 0 / RESERVED: 00 0001 * 0x1201 Active CH0: 00 / SLEEP: 0 / OVERDRIVE: 1 / LowPowerMode: 0 / AutoAmpDis 0 / CLK(ext): 1 / RESERVED: 0 / INTB_Dis : 0 / HighCurrent: 0 / RESERVED: 00 0001 * 0x1641 Active CH0: 00 / SLEEP: 0 / OVERDRIVE: 1 / LowPowerMode: 0 / AutoAmpDis 1 / CLK(ext): 1 / RESERVED: 0 / INTB_Dis : 0 / HighCurrent: 1 / RESERVED: 00 0001 * 0x1241 Active CH0: 00 / SLEEP: 0 / OVERDRIVE: 1 / LowPowerMode: 0 / AutoAmpDis 0 / CLK(ext): 1 / RESERVED: 0 / INTB_Dis : 0 / HighCurrent: 1 / RESERVED: 00 0001 */ #ifdef EDDY_DRIVE_CURRENT_DETECTION #define LDC1612_SENSOR_CONFIG_CH0 0x1241 #else #define LDC1612_SENSOR_CONFIG_CH0 0x1641 #endif #define LDC1612_SLEEP_MODE 0x2801 /****************************CONVERSION_TIME************************************ * Freq_ref = 40MHz / CHx_FREF_DIVIDER * ******RCOUNT_CHx******* * Reference Count Conversion Interval Time * 0x0005 ~ 0xFFFF * default: 0x0080 * RCOUNT_CHx * 16 / Freq_ref = Conversion Interval Time * * ******SETTLECOUNT_CHx******* * Conversion Settling Time * 0x0000 ~ 0xFFFF * default: 0x0000 * SETTLECOUNT_CHx * 16 / Freq_ref = Conversion Settling Time * 0x1000 4096*16个时钟周期 * 0x0100 256*16个时钟周期 * 0x0000/0x0001 32*16个时钟周期 * * ******RCOUNT_CHx******* */ #define LDC1612_RCOUNT_TIME_CH0 0x1000 // 0x1000=4096个时钟周期 #define LDC1612_SETTLECOUNT_CH0 0x0100 /**************************DRIVE_CURRENT**************************************** * 0xA000 CH_IDRIVE: 1010 0 / CH_INIT_IDRIVE: 000 00 / RESERVED: 00 0000 * 0x9000 CH_IDRIVE: 1001 0 / CH_INIT_IDRIVE: 000 00 / RESERVED: 00 0000 * CH_INIT_IDRIVE will update when every conversion systick ==>AutoAmpDis is 0 * CH_INIT_IDRIVE will store init drive current calculated ==> AutoAmpDis is 1 */ #define LDC1612_DRIVE_CURRENT 0x9000 /**************************SENSOR_CONFIG***************************************/ /**************************ERROR_CONFIG**************************************** * [15] Under-Range ERR to OUT (DATA_CHx.CHx_ERR_UR) * [14] Over-Range ERR to OUT (DATA_CHx.CHx_ERR_OR) * [13] Watchdog-Timeout ERR to OUT (DATA_CHx.CHx_ERR_WD) * [12] Amplitude-High-Error ERR to OUT (DATA_CHx.CHx_ERR_AE) * [11] Amplitude-Low-Error ERR to OUT (DATA_CHx.CHx_ERR_AE) * [10] RESERVED * [ 9] RESERVED * [ 8] RESERVED * [ 7] Under-Range ERR to INTB (STATUS.ERR_UR) * [ 6] Over-Range ERR to INTB (STATUS.ERR_OR) * [ 5] Watchdog-Timeout ERR to INTB (STATUS.ERR_WD) * [ 4] Amplitude-High-Error ERR to INTB (STATUS.ERR_AHE) * [ 3] Amplitude-Low-Error ERR to INTB (STATUS.ERR_ALE) * [ 2] Zero_Count_Error ERR to INTB (STATUS.ERR_ZC) * [ 1] RESERVED * [ 0] Data_Ready_Flag to INTB (STATUS.DRDY) * * 0x0000 No ERR to OUT or INTB */ #define LDC1612_ERROR_CONFIG 0x0000 /**************************STATUS**************************************** * [15] * [14] Error Channel 0b00: CH0 / 0b01: CH1 / 0b10: CH2 / 0b11: CH3 * [13] Conversion Under-Range Error 0b0: No / 0b1: Yes * [12] Conversion Over-Range Error 0b0: No / 0b1: Yes * [11] Watchdog Timeout Error 0b0: No / 0b1: Yes * [10] Amplitude High Error 0b0: No / 0b1: Yes * [ 9] Amplitude Low Error 0b0: No / 0b1: Yes * [ 8] Zero Count Error 0b0: No / 0b1: Yes * [ 7] RESERVED * [ 6] Ddata Ready Flag 0b0: No new results / 0b1: New results available * [ 5] RESERVED * [ 4] RESERVED * [ 3] CH0 Unread Conversion Result 0b0: No / 0b1: Yes(DATA_CH0) * [ 2] CH1 Unread Conversion Result 0b0: No / 0b1: Yes(DATA_CH1) * [ 1] CH2 Unread Conversion Result 0b0: No / 0b1: Yes(DATA_CH2) * [ 0] CH3 Unread Conversion Result 0b0: No / 0b1: Yes(DATA_CH3) * * 0x0000 No ERR to OUT or INTB */ /*****************CONVERSION_OFFSET_CONFIG****************************************/ #define SET_CONVERSION_OFFSET_CH0 0x0000 /***********************RESET DEVICE******************************************** 0x8000 RESET_DEV: 1 / RESERVED: 000 0000 0000 0000 */ #define LDC1612_RESET_DEV 0x8000 //[15:0] 0b1000 0000 0000 0000 /***********************IDs****************************************************/ #define LDC1612_MANUFACTURER_ID 0x5449 #define LDC1612_DEVICE_ID 0x3055 /******************************************************************************/ #define COIL_RP_KOM 7.2 #define COIL_L_UH 11.22 #define COIL_C_PF 150 #define COIL_Q_FACTOR 31.09 #define COIL_FREQ_HZ 5323770 /******************************************************************************/ 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); #endif //LDC1612_H