文章介绍

本文主要描述在 T507 Android 10 Linux 4.9 平台下,调试 SGM58031 芯片的记录,实现单芯片实时采集外部四通道的电压数值。

芯片介绍

SGM58031 是一款低功耗、16 位、精密三角积分模数转换器 (ADC)。

  • 可使用 3V 至 5.5V 电源工作。
  • 包含一个片内基准电压源和振荡器。
  • 它具有 I2C 兼容接口,可以选择四个I2C从地址。
  • 滤波器的数据速率最高可以达到 960 SPS。
  • 具有片内PGA,可从电源提供低至 ±256mV 的输入范围。
  • 输入多路复用器支持 4 个单端输入或 2 个差分输入配置。
  • SGM58031 采用绿色 MSOP-10 和 TDFN-3×3-10L 封装。 该器件的工作环境温度范围为 -40°C 至 +125°C。

硬件电路

  • 以下电路是从 《SGM58031 SCH VER1.pdf》摘选出来,经过略微调整的支持 4 路单端输入的应用电路。
  • RDY:数字比较器输出/转换准备就绪引脚,数据转换需要时间,可以通过次引脚知道什么时候转换完成。
  • SCL\SDA:I2C 通信时钟线和数据线,用于配置芯片和读取转换好的数据。
  • 虽然只有一个 ADDR 地址选择引脚,但是可以通过以下组合实现一条总线最多可以 挂 4 颗 SGM58031。

    ADDR 引脚接至 器件地址(7bit)
    GND 1001000(0x48)
    VDD 1001001(0x49)
    SDA 1001010(0x4A)
    SCL 1001011(0x4B)

必要知识

通道配置

通过以下芯片功能框图即可了解如下几点:

  • 同一时刻只能选择一路采集,通过 Config 寄存器的 MUC[2:0] 设定。
  • PGA 可以设置 AINx 引脚可测量的电压范围,±0.256V 至 ±6.144V,由 CONFIG 寄存器的 PGA 设定。
  • 参考源可以选择内部或外部提供,通过 Config1 寄存器的 EXT_REF 设定,外部参考源可通过 GN_Trim1 寄存器进行校准。

//输入多路复用器配置
enum SMG58031_CONFIG_MUX{
SMG58031_CONFIG_MUX_AIN0_AIN1, // MUX选通的连接到PGA的引脚为 AIN0 和 AIN1(默认)
SMG58031_CONFIG_MUX_AIN0_AIN3, // MUX选通的连接到PGA的引脚为 AIN0 和 AIN3
SMG58031_CONFIG_MUX_AIN1_AIN3, // MUX选通的连接到PGA的引脚为 AIN1 和 AIN3
SMG58031_CONFIG_MUX_AIN2_AIN3, // MUX选通的连接到PGA的引脚为 AIN2 和 AIN3
SMG58031_CONFIG_MUX_AIN0_GND, // MUX选通的连接到PGA的引脚为 AIN0 和 GND
SMG58031_CONFIG_MUX_AIN1_GND, // MUX选通的连接到PGA的引脚为 AIN1 和 GND
SMG58031_CONFIG_MUX_AIN2_GND, // MUX选通的连接到PGA的引脚为 AIN2 和 GND
SMG58031_CONFIG_MUX_AIN3_GND // MUX选通的连接到PGA的引脚为 AIN3 和 GND
};

工作模式

  • 连续模式

    每完成一次转换后,会自动开始新的转换过程,可以通过 ALERT/RDY 来得到转换完成后的通知。连续模式仅适合单通道采集数据,才能达到 960SPS。
  • 单次模式

    单次模式是通过设置 Config 寄存器的 OS 来触发转换,在转换的过程中 OS 保持为 ‘0’,芯片不再响应 OS 位操作。

    如果转换数据就绪了,OS 会被设置为 ‘1’,并且进入掉电模式,这时候可以再次写入 ‘1’ 到 OS 再次触发数据转换。

    单次模式所采集的数据完全稳定,不需要丢弃数据。



// 触发模式
enum SMG58031_CONFIG_MODE{
// 连续模式: ALERT/RDY 引脚在每次转换完成时发出一个脉冲(~8μs)
SMG58031_CONFIG_MODE_CONVERSION,
// 单次模式: ALERT/RDY 引脚在每次转换完成时被设置低电平(COMP_POL = 0)(默认)
SMG58031_CONFIG_MODE_SINGLE_SHOT
};

转换通知

我们可以通过 ALERT/RDY 引脚作为数据转换就绪通知:

  • 将高阈值寄存器的 MSB(最高有效位) 设置为 '1',其次将低阈值寄存器的 MSB(最高有效位) 设置为 '0 '。
  • 设置比较器队列工作模式的寄存器为 ‘00’ ,即设置 Config 寄存器中的 COMP_QUE[1:0] = 0b00。
  • 如果设置 COMP_QUE[1:0] =0b11,那么可以禁止该引脚工作,不会影响比较模式 COMP_MODE 和 锁存控制 COMP_LAT。
  • ALERT/RDY 引脚是开漏输出,因此需要外接上拉电阻。
  • 连续触发模式时,ALERT/RDY 引脚在每次转换完成结束时给出一个脉冲(8μs)。
  • 单次触发模式时,ALERT/RDY 引脚在转换数据准备就绪时变为低电平(COMP_POL= 0b0),并保持低电平直到下一次转换开始。
//比较器队列和失能
//这些位可以设置在 ALERT/RDY 引脚上发出警报输出之前超过阈值的连续 ADC 转换所需的次数。
enum SMG58031_CONFIG_COMP_QUE{
SMG58031_CONFIG_COMP_QUE_ONE_CONVERSION, // 连续超过阈值一次转换即触发 ALERT/RDY 引脚
SMG58031_CONFIG_COMP_QUE_TOW_CONVERSION, // 连续超过阈值两次转换才触发 ALERT/RDY 引脚
SMG58031_CONFIG_COMP_QUE_FOUR_CONVERSION, // 连续超过阈值四次转换才触发 ALERT/RDY 引脚
SMG58031_CONFIG_COMP_QUE_DISABLE_COMPARATOR,// 禁用比较器并将 ALERT/RDY 引脚设置为高阻态(默认)
}; //比较器锁存
//该位设置 ALERT/RDY 引脚是在其输出设置后锁存还是在 ADC 转换结果在上限和下限阈值范围内时重置
enum SMG58031_CONFIG_COMP_LAT{
SMG58031_CONFIG_COMP_LAT_NONLATCHING, // 不锁存比较器(默认)
SMG58031_CONFIG_COMP_LAT_LATCHING, // 锁存比较器, 读取转换数据时解锁
}; //比较器极性
//该位控制 ALERT/RDY 引脚的极性
enum SMG58031_CONFIG_COMP_POL{
SMG58031_CONFIG_ACTIVE_LOW , // 转换数据准备好时低电平有效(默认)
SMG58031_CONFIG_ACTIVE_HIGH // 转换数据准备好时高电平有效
}; //比较器模式
//该位配置比较器工作模式
enum SMG58031_CONFIG_COMP_MODE{
SMG58031_CONFIG_COMP_TRADITIONAL, // 传统模式(默认)
SMG58031_CONFIG_COMP_WINDOW // 窗口模式
};

电压换算

  • SGM58031 有以下 6 种测量范围可选,参考电压可选择内部的 2.048V,也可以通过选择从外部输入。
  • 如果是使用内部参考电源,那么可选的测量范围:±6.144V、±4.096V、±2.048V、±1.024V、±0.512V、±0.256V。
  • 选择的测量范围越小,测量的精度就越高,如 6144mV / 32768 = ±0.1875mV 而 256mV / 32768 = ±0.0078125mV。
  • 如果需要测量 5V 的电压,VDD 的供电就需要选择 5V,所测量的输入信息不能超过 VDD+0.3V。
  • 电压换算公式为:电压数值 = ADC数值(寄存器0x00) / 32768 X 缩放满量程范围(寄存器0x01的PGA[2:0])。

PGA Setting 测量范围 内部基准(2048mV)
2/3 ± 3xVREF ± 3x2.048 = ±6144mV
1 ± 2xVREF ± 2x2048 = ±4096mV
2 ±VREF ±2048mV
4 ±VREF/2 ± 2048 / 2 = ±1024mV
8 ±VREF/4 ± 2048 / 4 = ±512mV
16 ±VREF/8 ± 2048 / 8 = ±256mV
//可编程增益放大器配置
//以基准电压来进行放大或者缩小来决定满量程范围
//此参数表示ADC缩放的满量程范围, 请勿对器件的模拟输入施加超过 VDD + 0.3V 的电压
enum SMG58031_CONFIG_PGA{
SMG58031_CONFIG_PGA_2_3_6144V, //增益为2/3, 引脚最大输入电压为 ±6.144 + 0.3V
SMG58031_CONFIG_PGA_1_4096V, //增益为1, 引脚最大输入电压为 ±4.096 + 0.3V
SMG58031_CONFIG_PGA_2_2048V, //增益为2, 引脚最大输入电压为 ±2.048 + 0.3V(默认)
SMG58031_CONFIG_PGA_4_1024V, //增益为4, 引脚最大输入电压为 ±1.024 + 0.3V
SMG58031_CONFIG_PGA_8_0512V, //增益为8, 引脚最大输入电压为 ±0.512 + 0.3V
SMG58031_CONFIG_PGA_16_0256V0, //增益为16, 引脚最大输入电压为 ±0.256 + 0.3V
SMG58031_CONFIG_PGA_16_0256V1, //增益为16, 引脚最大输入电压为 ±0.256 + 0.3V
SMG58031_CONFIG_PGA_16_0256V2 //增益为16, 引脚最大输入电压为 ±0.256 + 0.3V
}; // 转换代码实现, 实现原理参考 Table 4
float adc_convert_mv(short value)
{
float adc_max = 0.0;
adc_max = value < 0 ? 0x8000 : 0x7FFF;
return value / adc_max * 6144;
}

数据读写

  • 寄存器地址 8 位,寄存器数据 16 位,时钟频率支持 10Hz ~ 3.4MHz。
  • 写入寄存器时,先写入 8 位寄存器地址,再按高字节在先,低字节在后,连续写入两个字节数据。
  • 读取寄存器时,先写入 8 位寄存器地址,再按高字节在先,低字节在后,连续读入两个字节数据。

static inline int sgm58031_read_value16(struct i2c_client *client, unsigned char reg, unsigned short *value)
{
struct i2c_msg msgs[2] = {0};
int num = sizeof(msgs) / sizeof(msgs[0]); msgs[0].flags = !I2C_M_RD;
msgs[0].addr = client->addr;
msgs[0].len = sizeof(unsigned char);
msgs[0].buf = &reg; msgs[1].flags = I2C_M_RD;
msgs[1].addr = client->addr;
msgs[1].len = sizeof(unsigned short);
msgs[1].buf = (unsigned char *)value; if(i2c_transfer(client->adapter, msgs, num) == num){
*value = htons(*value);
return 0;
} return -1;
}

static inline int sgm58031_write_value16(struct i2c_client *client, unsigned char reg, unsigned short value)
{
struct i2c_msg msg = {0};
unsigned char buf[3] = {0}; buf[0] = reg;
buf[1] = (value >> 8) & 0xFF;
buf[2] = (value >> 0) & 0xFF; msg.flags = !I2C_M_RD;
msg.addr = client->addr;
msg.len = sizeof(buf);
msg.buf = buf; return i2c_transfer(client->adapter, &msg, 1) != 1 ? -1 : 0;
}

代码实现

实现逻辑

  • SOC 通过 GPIO 连接 ALERT/RDY 引脚,并注册 GPIO 下降沿中断。
  • 设置 ADC 缩放满量程范围为 6.144V,设置 ALERT/RDY 低电平有效,启动单次触发转换。
  • ADC 完成转换后 ALERT/RDY 引脚会设置为低电平,会触发 SOC 的 GPIO 下降沿中断服务。
  • 在中断线程读取转换结果,并切换下一个通道,再次重新启动单次触发转换。
......
static irqreturn_t sgm58031_ready_hanbler(int irq, void *data)
{
struct sgm58031_platdata *sgmdata = (struct sgm58031_platdata *)data;
struct i2c_client *client = sgmdata->client;
unsigned char ch = 0x00; // 逐个按顺序切换通道进行模拟信号转换
switch(sgmdata->channel.conf.reg.mux){
case SMG58031_CONFIG_MUX_AIN0_GND:
ch = 0;
sgmdata->channel.conf.reg.mux = SMG58031_CONFIG_MUX_AIN1_GND;
break;
case SMG58031_CONFIG_MUX_AIN1_GND:
ch = 1;
sgmdata->channel.conf.reg.mux = SMG58031_CONFIG_MUX_AIN2_GND;
break;
case SMG58031_CONFIG_MUX_AIN2_GND:
ch = 2;
sgmdata->channel.conf.reg.mux = SMG58031_CONFIG_MUX_AIN3_GND;
break;
case SMG58031_CONFIG_MUX_AIN3_GND:
ch = 3;
sgmdata->channel.conf.reg.mux = SMG58031_CONFIG_MUX_AIN0_GND;
break;
default:
ch = 0;
sgmdata->channel.conf.reg.mux = SMG58031_CONFIG_MUX_AIN0_GND;
} // 读取转换数据, 并再次启动单次转换
if(sgmdata->channel.enable){
sgm58031_read_value16(client, SGM58031_REG_CONVERSION, &sgmdata->channel.value[ch]);
sgm58031_write_value16(client, SGM58031_REG_CONFIG, sgmdata->channel.conf.regval);
return IRQ_HANDLED;
}
memset(sgmdata->channel.value, 0x00, sizeof(sgmdata->channel.value));
return IRQ_HANDLED;
} static int sgm58031_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
......
// 申请中断线程, 并设置下降沿触发
devm_request_threaded_irq(dev, sgmdata->gpio_irq, NULL, sgm58031_ready_hanbler, IRQF_TRIGGER_FALLING | IRQF_ONESHOT, np->name, ...);
sgmdata->channel.enable = autostart ? true : false;
sgmdata->channel.conf.regval = SGM58031_REG_CONFIG_DEFAULT; // 恢复为芯片初始值
sgmdata->channel.conf.reg.comp_que = SMG58031_CONFIG_COMP_QUE_ONE_CONVERSION; // 连续超过阈值一次转换即触发 ALERT/RDY 引脚
sgmdata->channel.conf.reg.comp_lat = SMG58031_CONFIG_COMP_LAT_LATCHING; // 锁存比较器, 读取转换数据时解锁
sgmdata->channel.conf.reg.comp_pol = SMG58031_CONFIG_ACTIVE_LOW; // 转换数据准备好时低电平有效
sgmdata->channel.conf.reg.comp_mode = SMG58031_CONFIG_COMP_TRADITIONAL; // 指定比较器工作模式为传统比较模式
sgmdata->channel.conf.reg.dr = SMG58031_CONFIG_DR_HZ_100_OR_120; // 数据速率设置为 100Hz
sgmdata->channel.conf.reg.mode = SMG58031_CONFIG_MODE_SINGLE_SHOT; // 单次转换模式
sgmdata->channel.conf.reg.pga = SMG58031_CONFIG_PGA_2_3_6144V; // 满量程范围为 6.144V
sgmdata->channel.conf.reg.mux = SMG58031_CONFIG_MUX_AIN0_GND; // MUX选通的连接到PGA的引脚为 AIN0 和 GND
sgmdata->channel.conf.reg.os = SMG58031_CONFIG_OS_BEGIN_SINGLE; // 启动单次转换模式
sgm58031_write_value16(client, SGM58031_REG_LO_THRESH, 0x0000); // 将低阈值寄存器的 MSB(最高有效位) 设置为 '0'
sgm58031_write_value16(client, SGM58031_REG_HI_THRESH, 0x8000); // 将高阈值寄存器的 MSB(最高有效位) 设置为 '1'
sgm58031_write_value16(client, SGM58031_REG_CONFIG1, SGM58031_REG_CONFIG1_DEFAULT);
if(sgmdata->channel.enable){
dev_notice(dev, "convert -> [autostart]\n");
sgm58031_write_value16(client, SGM58031_REG_CONFIG, sgmdata->channel.conf.regval);
}
......
return 0;
} static const struct i2c_device_id sgm58031_ids[] = {
{"sgm58031", 0x00},{}
};
MODULE_DEVICE_TABLE(i2c, sgm58031_ids); static struct i2c_driver sgm58031_i2c_driver = {
.driver.name = "sgm58031",
.probe = sgm58031_i2c_probe,
.remove = sgm58031_i2c_remove,
.id_table = sgm58031_ids,
}; module_i2c_driver(sgm58031_i2c_driver);
MODULE_LICENSE("GPL");

数据结构

这些数据结构对应的是 SGM58031 寄存器结构,其中注释解释了大部分寄存器的作用。

#ifndef __SGM58031_REG_H__
#define __SGM58031_REG_H__ // SGM58031 内部寄存器地址
#define SGM58031_REG_CONVERSION 0x00 //AD值转换寄存器,16bit位二进制补码格式,默认值0x0000,只读
#define SGM58031_REG_CONFIG 0x01 //配置寄存器,默认0x8583,可读可写
#define SGM58031_REG_LO_THRESH 0x02 //比较器阈值下限,默认0x8000
#define SGM58031_REG_HI_THRESH 0x03 //比较器阈值上限,默认0x7FFF
#define SGM58031_REG_CONFIG1 0x04 //扩展配置寄存器,默认0x0000
#define SGM58031_REG_CHIPID 0x05 //芯片ID,默认0x0080
#define SGM58031_REG_GN_TRIM1 0x06 //增益修正,默认0x03FA
#define SGM58031_CHIPID 0x80 // SGM58031 内部寄存器默认值
#define SGM58031_REG_CONFIG_DEFAULT 0x8583
#define SGM58031_REG_CONFIG1_DEFAULT 0x0000
#define SGM58031_REG_HI_THRESH_DEFAULT 0x7FFF
#define SGM58031_REG_LO_THRESH_DEFAULT 0x8000 //比较器队列和失能
//这些位可以设置在 ALERT/RDY 引脚上发出警报输出之前超过阈值的连续 ADC 转换所需的次数。
enum SMG58031_CONFIG_COMP_QUE{
SMG58031_CONFIG_COMP_QUE_ONE_CONVERSION, // 连续超过阈值一次转换即触发 ALERT/RDY 引脚
SMG58031_CONFIG_COMP_QUE_TOW_CONVERSION, // 连续超过阈值两次转换才触发 ALERT/RDY 引脚
SMG58031_CONFIG_COMP_QUE_FOUR_CONVERSION, // 连续超过阈值四次转换才触发 ALERT/RDY 引脚
SMG58031_CONFIG_COMP_QUE_DISABLE_COMPARATOR,// 禁用比较器并将 ALERT/RDY 引脚设置为高阻态(默认)
}; //比较器锁存
//该位设置 ALERT/RDY 引脚是在其输出设置后锁存还是在 ADC 转换结果在上限和下限阈值范围内时重置
enum SMG58031_CONFIG_COMP_LAT{
SMG58031_CONFIG_COMP_LAT_NONLATCHING, // 不锁存比较器(默认)
SMG58031_CONFIG_COMP_LAT_LATCHING, // 锁存比较器, 读取转换数据时解锁
}; //比较器极性
//该位控制 ALERT/RDY 引脚的极性
enum SMG58031_CONFIG_COMP_POL{
SMG58031_CONFIG_ACTIVE_LOW , // 转换数据准备好时低电平有效(默认)
SMG58031_CONFIG_ACTIVE_HIGH // 转换数据准备好时高电平有效
}; //比较器模式
//该位配置比较器工作模式
enum SMG58031_CONFIG_COMP_MODE{
SMG58031_CONFIG_COMP_TRADITIONAL, // 传统模式(默认)
SMG58031_CONFIG_COMP_WINDOW // 窗口模式
}; // 数据速率
enum SMG58031_CONFIG_DR{
SMG58031_CONFIG_DR_HZ_6P25_OR_7P5, // 6.25Hz(DR_SEL=0)/7.5Hz(DR_SEL=1)
SMG58031_CONFIG_DR_HZ_12P5_OR_15, // 12.5Hz(DR_SEL=0)/15Hz(DR_SEL=1)
SMG58031_CONFIG_DR_HZ_25_OR_30, // 25Hz(DR_SEL=0)/30Hz(DR_SEL=1)
SMG58031_CONFIG_DR_HZ_50_OR_60, // 50Hz(DR_SEL=0)/60Hz(DR_SEL=1)
SMG58031_CONFIG_DR_HZ_100_OR_120, // 100Hz(DR_SEL=0)/120Hz(DR_SEL=1)(默认)
SMG58031_CONFIG_DR_HZ_200_OR_240, // 200Hz(DR_SEL=0)/240Hz(DR_SEL=1)
SMG58031_CONFIG_DR_HZ_400_OR_480, // 400Hz(DR_SEL=0)/480Hz(DR_SEL=1)
SMG58031_CONFIG_DR_HZ_800_OR_960 // 800Hz(DR_SEL=0)/960HZ(DR_SEL=1)
}; // 触发模式
enum SMG58031_CONFIG_MODE{
SMG58031_CONFIG_MODE_CONVERSION, // 连续模式: ALERT/RDY 引脚在每次转换完成时发出一个脉冲(~8μs)
SMG58031_CONFIG_MODE_SINGLE_SHOT // 单次模式: ALERT/RDY 引脚在每次转换完成时被设置低电平(COMP_POL = 0)(默认)
}; //可编程增益放大器配置
//以基准电压来进行放大或者缩小来决定满量程范围
//此参数表示ADC缩放的满量程范围, 请勿对器件的模拟输入施加超过 VDD + 0.3V 的电压
//电压转换代码:
//float adc_convert_mv(short value)
//{
// float adc_max = 0.0;
// adc_max = value < 0 ? 0x8000 : 0x7FFF;
// return value / adc_max * 6144;
//}
enum SMG58031_CONFIG_PGA{
SMG58031_CONFIG_PGA_2_3_6144V, //增益为2/3, 引脚最大输入电压为 ±6.144 + 0.3V
SMG58031_CONFIG_PGA_1_4096V, //增益为1, 引脚最大输入电压为 ±4.096 + 0.3V
SMG58031_CONFIG_PGA_2_2048V, //增益为2, 引脚最大输入电压为 ±2.048 + 0.3V(默认)
SMG58031_CONFIG_PGA_4_1024V, //增益为4, 引脚最大输入电压为 ±1.024 + 0.3V
SMG58031_CONFIG_PGA_8_0512V, //增益为8, 引脚最大输入电压为 ±0.512 + 0.3V
SMG58031_CONFIG_PGA_16_0256V0, //增益为16, 引脚最大输入电压为 ±0.256 + 0.3V
SMG58031_CONFIG_PGA_16_0256V1, //增益为16, 引脚最大输入电压为 ±0.256 + 0.3V
SMG58031_CONFIG_PGA_16_0256V2 //增益为16, 引脚最大输入电压为 ±0.256 + 0.3V
}; //输入多路复用器配置
enum SMG58031_CONFIG_MUX{
SMG58031_CONFIG_MUX_AIN0_AIN1, // MUX选通的连接到PGA的引脚为 AIN0 和 AIN1(默认)
SMG58031_CONFIG_MUX_AIN0_AIN3, // MUX选通的连接到PGA的引脚为 AIN0 和 AIN3
SMG58031_CONFIG_MUX_AIN1_AIN3, // MUX选通的连接到PGA的引脚为 AIN1 和 AIN3
SMG58031_CONFIG_MUX_AIN2_AIN3, // MUX选通的连接到PGA的引脚为 AIN2 和 AIN3
SMG58031_CONFIG_MUX_AIN0_GND, // MUX选通的连接到PGA的引脚为 AIN0 和 GND
SMG58031_CONFIG_MUX_AIN1_GND, // MUX选通的连接到PGA的引脚为 AIN1 和 GND
SMG58031_CONFIG_MUX_AIN2_GND, // MUX选通的连接到PGA的引脚为 AIN2 和 GND
SMG58031_CONFIG_MUX_AIN3_GND // MUX选通的连接到PGA的引脚为 AIN3 和 GND
}; //运行状态或单次转换位
//运行状态或单次转换启动此位确定设备的运行状态。 OS只能在掉电状态下写入,并且在转换正在进行时无效。
enum SMG58031_CONFIG_OS{
SMG58031_CONFIG_OS_INVALID = 0, // 写入时无效
SMG58031_CONFIG_OS_BEGIN_SINGLE = 1, // 写入时启动单词转换
SMG58031_CONFIG_OS_CONVERT_ING = 0, // 读取时表示芯片正在进行转换
SMG58031_CONFIG_OS_CONVERT_NOT = 1, // 读取时表示芯片没有进行转换
}; // 配置寄存器
typedef union {
unsigned short regval;
struct{
uint8_t comp_que:2; // 比较器队列和失能
uint8_t comp_lat:1; // 比较器锁存配置
uint8_t comp_pol:1; // 比较器极性配置
uint8_t comp_mode:1; // 比较器工作模式
uint8_t dr:3; // 转换速率配置
uint8_t mode:1; // 数据转换模式配置
uint8_t pga:3; // 满量程范围配置
uint8_t mux:3; // 通道选择配置
uint8_t os:1; // 转换控制和工作状态
}reg;
}smg58031_register_config_t; // 是否采用外部电压作为参考电压
enum SGM58031_CONFIG1_EXT_REF{
SGM58031_CONFIG1_EXT_REF_NONE, // 不采用外部电压作为参考电压(默认)
SGM58031_CONFIG1_EXT_REF_AIN3, // 采用 AIN3 电压作为参考电压
}; // 似乎与 I2C 总线电压范围有关
// I2C 电平低于 3V 置 0
// I2C 电平高于 3V 置 1
enum SGM58031_CONFIG1_BUS_FLEX{
// 0 = 在I2C总线电压低于器件VDD的情况下禁用漏电阻断电路(默认)
// I2C 接口仍然正常工作,但当 VBUS < VDD 时 VDD 出现泄漏 - 0.3V
SGM58031_CONFIG1_BUS_LOW_VOLTAGE_DISABLE,
//1 = 总线电压可以低于VDD,而不会引起泄漏。
//VDD 范围为 3V 至 5.5V,I2C 总线电压应限制为 3V 至 5.5V
SGM58031_CONFIG1_BUS_LOW_VOLTAGE_ENABLE
}; // 设置为 1 时, 用于做输入传感器异常检测, 如果输入端的传感器开路, 那读数为最大值
enum SGM58031_CONFIG1_BURNOUT{
SGM58031_CONFIG1_BURNOUT_NOT, // 无电流源(默认)
SGM58031_CONFIG1_BURNOUT_2uA, // 在 AINs 2uA 的电流源
}; // 转换速率模式选择
enum SGM58031_CONFIG1_DR_SEL{
SGM58031_CONFIG1_DR_SEL_1, // 0 = DR[2:0] = 000 ~ 111 for conversion rate of 6.25Hz, 12.5Hz, 25Hz, 50Hz, 100Hz, 200Hz, 400Hz and 800Hz (default)
SGM58031_CONFIG1_DR_SEL_2, // 1 = DR[2:0] = 000 ~ 111 for conversion rate of 7.5Hz, 15Hz, 30Hz, 60Hz, 120Hz, 240Hz, 480Hz and 960Hz
}; // 掉电控制
enum SGM58031_CONFIG1_PD{
SGM58031_CONFIG1_PD_POWER_DOWN = 1, // 掉电控制
}; // 配置寄存器1
typedef union{
unsigned short regval;
struct {
unsigned char na0:3;
unsigned char ext_ref:1;
unsigned char bus_flex:1;
unsigned char reserved:1;
unsigned char burnout:1;
unsigned char dr_sel:1;
unsigned char pd:1;
unsigned char na1:7;
}reg;
}smg58031_register_config1_t; // 芯片 ID
typedef union{
unsigned short regval;
struct {
unsigned char na0:5;
unsigned char ver:3;
unsigned char id:5;
unsigned char na1:3;
}reg;
}smg58031_register_chipid_t; #endif

【随笔记】T507 ADC SGM58031 16BIT 4Channel 调试记录的更多相关文章

  1. SPI 核软件调试记录

    SPI 核软件调试记录 1.首先说说int SpiFlashWaitForFlashReady(void)这一函数,基本上其它函数在执行的时候,都会事先执行一次此函数.    因为此函数的作用主要是用 ...

  2. Video Timing Controller v6.1软件调试记录

    Video Timing Controller v6.1软件调试记录 GUI配置: . case XVTC_VMODE_PAL: //576i@50 { TimingPtr->Interlace ...

  3. Video Test Pattern Generator(7.0)软件调试记录

    Video Test Pattern Generator(7.0)软件调试记录 . XVidC_VideoMode XVIDC_VM_576_50_I = XVIDC_VM_720x576_50_I ...

  4. JFinal使用笔记3-注册和登录功能开发记录

    首页 开源项目 问答 代码 博客 翻译 资讯 移动开发 招聘 城市圈 当前访客身份:游客 [ 登录 | 加入开源中国 ]   当前访客身份: 游客 [ 登录 | 加入开源中国 ] 软件   土龙 关注 ...

  5. MA82G5D16AS16 主频调试记录

    MA82G5D16AS16 主频调试记录 当 SCKS 设置 为 MCKDO / 128 时 MCU 的电流为 0.58mA,100UF 电容可以维持 0.5S,大概可以满足. 但是需要注意外围的线路 ...

  6. Apusic中间件结合MyEclipse进行远程调试记录

    Apusic中间件结合MyEclipse进行远程调试记录. 在金蝶域中正常部署应用. 启动金蝶中间件时使用"startapusic -ds"命令. 在MyEclipse的Run-- ...

  7. http://stblog.baidu-tech.com/?p=1684) coredump调试记录 - PHP篇 原创: 扶墙 贝壳产品技术 今天

    http://stblog.baidu-tech.com/?p=1684) coredump调试记录 - PHP篇 原创: 扶墙 贝壳产品技术 今天

  8. 基于freescale i.Mx6(ARM)的阿里云oss调试记录

    交叉编译阿里OSS调试记录 1.1 开通oss服务 具体参考以下链接: https://help.aliyun.com/document_detail/31884.html?spm=a2c4g.111 ...

  9. [ZJCTF 2019]EasyHeap | house of spirit 调试记录

    BUUCTF 上的题目,由于部分环境没有复现,解法是非期望的 house of spirit 第一次接触伪造堆的利用方式,exp 用的是 Pwnki 师傅的,本文为调试记录及心得体会. 逆向分析的过程 ...

随机推荐

  1. Azure DevOps Server 入门实践与安装部署

    一,引言 最近一段时间,公司希望在自己的服务器上安装本地版的 Azure DevOps Service(Azure DevOps Server),用于项目内的测试,学习.本着学习的目的,我也就开始学习 ...

  2. Excel常用需求

    常用数据统计格式 外列表套内列表 [['name1','age1'],['name2','age2'],['name3','age3']] 外列表套内字典 [{'name':'xie','score' ...

  3. JavaWeb3

    1. 会话技术 会话:一次会话中包含多次请求和响应 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止 功能:在一次会话的范围内的多次请求间共享数据 方式: 客户端会话技术:Co ...

  4. .NET应用开发之SQLServer常见问题分析

    日常我们开发.NET应用时会使用SQLServer数据库,对于SQLServer数据库的日常开发有一些技能和工具,准备给大家分享一下. 一.场景1:SQLServer死锁分析  执行以下SQL,启用S ...

  5. win10系统VMWare16 Pro 安装CentOS8

    目录 一.本机环境与问题解决 二.下载软件 三.VMWare16 Pro安装 四.CentOS8 安装 一.本机环境与问题解决 装了好几遍,感觉坑都踩了一遍,泪奔~,还好终于跑起来了! 查看电脑是否开 ...

  6. 超精准!AI 结合邮件内容与附件的意图理解与分类!⛵

    作者:韩信子@ShowMeAI 深度学习实战系列:https://www.showmeai.tech/tutorials/42 TensorFlow 实战系列:https://www.showmeai ...

  7. Training: WWW-Robots

    原题链接:http://www.wechall.net/challenge/training/www/robots/index.php 打开网页他给我们说什么 说什么这是一个小挑战,你将会了解到机器人 ...

  8. C温故补缺(六):C反汇编常用的AT&Tx86语法

    C语言反汇编用到的AT&T x86汇编语法 参考:CSDN1,CSDN2 默认gcc -S汇编出的,以及反汇编出的,都是AT&T x86代码,可以用-masm=intel指定为inte ...

  9. Nginx 安装篇-1.19.9版本源码安装

    系统环境:CentOS 8.5 64位 [开始安装](此步骤引自网络教程) https://www.cnblogs.com/torchstar/p/16027538.html 教程比较详细,一步步操作 ...

  10. 关于Qt的QPixmap中不支持jpg文件格式的问题

    问题 Qt部分版本存在不支持jpg,JPEG等图像格式的问题 qDebug()<<QImageWriter::supportedImageFormats(); 这行代码可以查看所支持的图像 ...