generated from hulk/gd32e23x_template
282 lines
7.9 KiB
C
282 lines
7.9 KiB
C
//
|
|
// Created by dell on 24-12-3.
|
|
//
|
|
|
|
#include "ldc1612.h"
|
|
|
|
/** @brief set conversion interval time.
|
|
@param channel LDC1612 has total two channels.
|
|
@param result The value to be set.
|
|
* */
|
|
void ldc1612_set_conversion_time(uint8_t channel, uint16_t result) {
|
|
uint8_t data[2] = {0};
|
|
data[0] = (result >> 8) & 0xFF;
|
|
data[1] = result & 0xFF;
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_write_16bits(LDC1612_ADDR, SET_CONVERSION_TIME_REG_START + channel, data);
|
|
#else
|
|
i2c_write_16bits(LDC1612_ADDR, SET_CONVERSION_TIME_REG_START + channel, data);
|
|
#endif
|
|
}
|
|
|
|
/** @brief set conversion offset.
|
|
@param channel LDC1612 has total two channels.
|
|
@param result The value to be set.
|
|
* */
|
|
void ldc1612_set_conversion_offset(uint8_t channel, uint16_t result) {
|
|
uint8_t data[2] = {0};
|
|
data[0] = (result >> 8) & 0xFF;
|
|
data[1] = result & 0xFF;
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_write_16bits(LDC1612_ADDR, SET_CONVERSION_OFFSET_REG_START + channel, data);
|
|
#else
|
|
i2c_write_16bits(LDC1612_ADDR, SET_CONVERSION_OFFSET_REG_START + channel, data);
|
|
#endif
|
|
|
|
}
|
|
|
|
/** @brief Before conversion,wait LC sensor stabilize for a short time.
|
|
@param channel LDC1612 has total two channels.
|
|
@param result The value to be set.
|
|
* */
|
|
void ldc1612_set_LC_stabilize_time(uint8_t channel, uint16_t result) {
|
|
uint8_t data[2] = {0};
|
|
data[0] = (result >> 8) & 0xFF;
|
|
data[1] = result & 0xFF;
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_write_16bits(LDC1612_ADDR, SET_LC_STABILIZE_REG_START + channel, data);
|
|
#else
|
|
i2c_write_16bits(LDC1612_ADDR, SET_LC_STABILIZE_REG_START + channel, data);
|
|
#endif
|
|
}
|
|
|
|
/** @brief set input frequency divide and fref divide.
|
|
@param channel LDC1612 has total two channels.
|
|
@param FIN_DIV FIN input divide
|
|
@param FREF_DIV fref,reference frequency of sensor.
|
|
* */
|
|
void ldc1612_set_freq_divide(uint8_t channel) {
|
|
uint16_t value;
|
|
uint16_t fin_div, freq_div;
|
|
float sensor_freq;
|
|
|
|
sensor_freq = 1 / (2 * 3.14 * sqrt(COIL_L_UH * COIL_C_PF * pow(10, -18))) * pow(10, -6);
|
|
|
|
fin_div = (uint16_t) (sensor_freq / 8.75 + 1);
|
|
|
|
if (fin_div * 4 < 40) {
|
|
freq_div = 2;
|
|
} else {
|
|
freq_div = 4;
|
|
}
|
|
|
|
value = fin_div << 12;
|
|
value |= freq_div;
|
|
// printf("\tvalue: 0x%x\r\n", value);
|
|
|
|
uint8_t data[2] = {0};
|
|
data[0] = (value >> 8) & 0xFF;
|
|
data[1] = value & 0xFF;
|
|
// printf("\tFIN_DIV: %d, FREF_DIV: %d\r\n", fin_div, freq_div);
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_write_16bits(LDC1612_ADDR, SET_FREQ_REG_START + channel, data);
|
|
#else
|
|
i2c_write_16bits(LDC1612_ADDR, SET_FREQ_REG_START + channel, data);
|
|
#endif
|
|
}
|
|
|
|
/** @brief Error output config.
|
|
@param result The value to be set.
|
|
* */
|
|
void ldc1612_set_error_config(uint16_t value) {
|
|
uint8_t data[2] = {0};
|
|
data[0] = (value >> 8) & 0xFF;
|
|
data[1] = value & 0xFF;
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_write_16bits(LDC1612_ADDR, ERROR_CONFIG_REG, data);
|
|
#else
|
|
i2c_write_16bits(LDC1612_ADDR, ERROR_CONFIG_REG, data);
|
|
#endif
|
|
}
|
|
|
|
/** @brief mux config.
|
|
@param result The value to be set.
|
|
* */
|
|
void ldc1612_set_mux_config(uint16_t value) {
|
|
uint8_t data[2] = {0};
|
|
data[0] = (value >> 8) & 0xFF;
|
|
data[1] = value & 0xFF;
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_write_16bits(LDC1612_ADDR, MUL_CONFIG_REG, data);
|
|
#else
|
|
i2c_write_16bits(LDC1612_ADDR, MUL_CONFIG_REG, data);
|
|
#endif
|
|
}
|
|
|
|
/** @brief reset sensor.
|
|
|
|
* */
|
|
void ldc1612_reset_sensor(void) {
|
|
uint8_t data[2] = {0};
|
|
data[0] = 0x80;
|
|
data[1] = 0x00;
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_write_16bits(LDC1612_ADDR, SENSOR_RESET_REG, data);
|
|
#else
|
|
i2c_write_16bits(LDC1612_ADDR, SENSOR_RESET_REG, data);
|
|
#endif
|
|
}
|
|
|
|
/** @brief set drive current of sensor.
|
|
@param result The value to be set.
|
|
* */
|
|
void ldc1612_set_drive_current(uint8_t channel, uint16_t value) {
|
|
uint8_t data[2] = {0};
|
|
data[0] = (value >> 8) & 0xFF;
|
|
data[1] = value & 0xFF;
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_write_16bits(LDC1612_ADDR, SET_DRIVER_CURRENT_REG + channel, data);
|
|
#else
|
|
i2c_write_16bits(LDC1612_ADDR, SET_DRIVER_CURRENT_REG + channel, data);
|
|
#endif
|
|
}
|
|
|
|
/** @brief Main config part of sensor.Contains select channel、start conversion、sleep mode、sensor activation mode、INT pin disable ..
|
|
@param result The value to be set.
|
|
* */
|
|
void ldc1612_set_sensor_config(uint16_t value) {
|
|
uint8_t data[2] = {0};
|
|
data[0] = (value >> 8) & 0xFF;
|
|
data[1] = value & 0xFF;
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_write_16bits(LDC1612_ADDR, SENSOR_CONFIG_REG, data);
|
|
#else
|
|
i2c_write_16bits(LDC1612_ADDR, SENSOR_CONFIG_REG, data);
|
|
#endif
|
|
}
|
|
|
|
void ldc1612_single_ch0_config(void) {
|
|
ldc1612_reset_sensor(); //0x1C --0x8000
|
|
|
|
ldc1612_set_freq_divide(CHANNEL_0); //0x14 --0x1002
|
|
// channel 0 clock divide 1, fref divide 2
|
|
|
|
ldc1612_set_LC_stabilize_time(CHANNEL_0, LC_STABILIZE_TIME_CH0); //0x10 --0x001E
|
|
|
|
ldc1612_set_conversion_time(CHANNEL_0, LDC1612_CONVERSION_TIME_CH0); //0x08 --0x0546
|
|
|
|
ldc1612_set_error_config(LDC1612_ERROR_CONFIG); //0x19 --0x0000)
|
|
|
|
ldc1612_set_drive_current(CHANNEL_0, LDC1612_DRIVE_CURRENT); //0x1E --0x9000
|
|
|
|
ldc1612_set_mux_config(LDC1612_MUX_CONFIG); //0x1B --0x020C
|
|
|
|
ldc1612_set_sensor_config(LDC1612_SENSOR_CONFIG); //0x1A --0x1601
|
|
}
|
|
|
|
void ldc1612_iic_get_sensor_infomation(void) {
|
|
uint8_t data[2] = {0};
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_read_16bits(LDC1612_ADDR, READ_MANUFACTURER_ID, data);
|
|
#else
|
|
i2c_read_16bits(LDC1612_ADDR, READ_MANUFACTURER_ID, data);
|
|
#endif
|
|
printf("\tManufacturer: 0x%x", (data[0] << 8) | data[1]);
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_read_16bits(LDC1612_ADDR, READ_DEVICE_ID, data);
|
|
#else
|
|
i2c_read_16bits(LDC1612_ADDR, READ_DEVICE_ID, data);
|
|
#endif
|
|
printf("\tDevice: 0x%x", (data[0] << 8) | data[1]);
|
|
}
|
|
|
|
uint16_t ldc1612_get_manufacturer_id(void) {
|
|
uint8_t data[2] = {0};
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_read_16bits(LDC1612_ADDR, READ_MANUFACTURER_ID, data);
|
|
#else
|
|
i2c_read_16bits(LDC1612_ADDR, READ_MANUFACTURER_ID, data);
|
|
#endif
|
|
return (data[0] << 8) | data[1];
|
|
}
|
|
|
|
uint16_t ldc1612_get_deveice_id(void) {
|
|
uint8_t data[2] = {0};
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_read_16bits(LDC1612_ADDR, READ_DEVICE_ID, data);
|
|
#else
|
|
i2c_read_16bits(LDC1612_ADDR, READ_DEVICE_ID, data);
|
|
#endif
|
|
return (data[0] << 8) | data[1];
|
|
}
|
|
|
|
/** @brief read the raw channel result from register.
|
|
@param channel LDC1612 has total two channels.
|
|
@param result raw data
|
|
* */
|
|
uint32_t ldc1612_get_raw_channel_result(uint8_t channel) {
|
|
uint32_t raw_value = 0;
|
|
uint8_t value[2] = {0};
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_read_16bits(LDC1612_ADDR, CONVERTION_RESULT_REG_START + channel, value);
|
|
#else
|
|
i2c_read_16bits(LDC1612_ADDR, CONVERTION_RESULT_REG_START + channel, value);
|
|
#endif
|
|
raw_value |= (uint32_t) ((value[0] << 8) | value[1]) << 16;
|
|
|
|
#ifdef SOFTWARE_IIC
|
|
soft_i2c_read_16bits(LDC1612_ADDR, CONVERTION_RESULT_REG_START + channel + 1, value);
|
|
#else
|
|
i2c_read_16bits(LDC1612_ADDR, CONVERTION_RESULT_REG_START + channel + 1, value);
|
|
#endif
|
|
raw_value |= (uint32_t) ((value[0] << 8) | value[1]);
|
|
return ldc1612_parse_raw_result(raw_value);
|
|
}
|
|
|
|
/** @brief parse the data which read from data register.
|
|
@param channel LDC1612 has total two channels.
|
|
@param raw_result the raw data which read from data register,it contains error codes and sensor value;
|
|
* */
|
|
uint32_t ldc1612_parse_raw_result(uint32_t raw_result) {
|
|
uint32_t calibration_value = 0;
|
|
uint8_t error_code = 0;
|
|
|
|
calibration_value = raw_result & 0x0FFFFFFF;
|
|
if (0xFFFFFFF == calibration_value) {
|
|
return 0xF0000000;
|
|
// ERR_NC-No coil detected!!!
|
|
}
|
|
|
|
error_code = raw_result >> 24;
|
|
|
|
if (error_code & 0x80) {
|
|
return 0x80000000;
|
|
// ERR_UR-Under range error!!!
|
|
}
|
|
if (error_code & 0x40) {
|
|
return 0x40000000;
|
|
// ERR_OR-Over range error!!!
|
|
}
|
|
if (error_code & 0x20) {
|
|
return 0x20000000;
|
|
// ERR_WD-Watch dog timeout error!!!
|
|
}
|
|
if (error_code & 0x10) {
|
|
return 0x10000000;
|
|
// ERR_AE-error!!!
|
|
}
|
|
|
|
return raw_result;
|
|
}
|