文章介绍

本文主要描述在 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 环境】把OpenSSL生产的自签名证书导入到Azure Key Vault Certificate中报错

    问题描述 通过本地生成的自签名证书导入到Azure Key Vault Certificate报错. 错误信息 the specified PEM X.509 certificate content ...

  2. 基于 .NET 7 的 QUIC 实现 Echo 服务

    前言 随着今年6月份的 HTTP/3 协议的正式发布,它背后的网络传输协议 QUIC,凭借其高效的传输效率和多路并发的能力,也大概率会取代我们熟悉的使用了几十年的 TCP,成为互联网的下一代标准传输协 ...

  3. 解决Halcon转C#时,图像显示的问题

    不知道大家在使用Halcon进行图像处理,由于要连续处理多张图片,转为C#代码的时候,使用了Halcon控件显示图像,但是运行的时候,中间的其他图片没有显示在控件上,之前我一直以为是运行速度快导致看不 ...

  4. Linux 中的文件简单说明

    Linux 中的文件简单说明 作者:Grey 原文地址: 博客园:Linux 中的文件简单说明 CSDN:Linux 中的文件简单说明 说明 本文基于 CentOS 7 根目录(/)下文件夹主要作用 ...

  5. 网络I/O模型 解读

    网络.内核 网卡能「接收所有在网络上传输的信号」,但正常情况下只接受发送到该电脑的帧和广播帧,将其余的帧丢弃. 所以网络 I/O 其实是网络与服务端(电脑内存)之间的输入与输出 内核 查看内核版本 : ...

  6. #define 的神奇操作

    # define 的神奇操作 一.宏定义中的 #.## 符号的神奇用法 1.1 # 的用法 1.1.1 作用 #表示字符串化操作符(stringification),其作用是将宏定义中的传入参数名转换 ...

  7. (四) 一文搞懂 JMM - 内存模型

    4.JMM - 内存模型 1.JMM内存模型 JMM与happen-before 1.可见性问题产生原因 下图为x86架构下CPU缓存的布局,即在一个CPU 4核下,L1.L2.L3三级缓存与主内存的 ...

  8. Day38:Lambda表达式

    Lambda表达式 1.1 概述 Lambda是JDK8开始后的一种新语法形式. 作用:简化函数式匿名内部类的代码写法. 简化格式: /*部类被重写方法的参数)->{ 被重写方法的方法体代码 } ...

  9. input、print、字符串格式化输出

    1.使用input(), print()进行用户交互 """ 以前银行取钱只能拿着存折去柜台跟小姐姐交流才可以 你想干嘛 我想取钱 请输入密码 滴滴滴密码 想取多少钱 我 ...

  10. 《HTTP权威指南》 – 11.验证码和新鲜度

    服务器应当告知客户端能够将内容缓存多长时间,在这个时间内就是新鲜的.服务器可以用这两个首部之一来提供信息: Expires(过期) Cache - Control(缓存控制) Expires首部 规定 ...