/*! \file sgm51652hx \brief 1. 芯片基本信息: 1)型号:sgm51652H4(4通道)、sgm51652H8(8通道) 2)类型:16位500kSPS单电源 SAR ADC 3)基准:片内4.096V高精度基准(温漂9ppm/℃) 4)供电:AVDD:4.75~5.25(典型5V),DVDD:1.65~AVDD(典型3.3V) 2. 模拟输入特性 1)支持输入类型:双极性单端、单极性单端、双极性差分 2)量程配置(软件独立设置) 量程配置值 -- 输入范围 -- 对应VREF倍数 0000 ±10.24V ±2.5 * VREF 0001 ±5.12V ±1.25 * VREF 0010 ±2.56V ±0.625 * VREF 0101 0~10.24V 0~2.5 * VREF 0110 0~5.12V 0~1.25 * VREF 3. 数字接口与时序 1)通信接口:SPI,模式Mode3(CPOL=1 时钟空闲时为高电平、CPHA=1 数据在时钟下降沿采样) 2)SCLK最高频率:17Mhz。(GD32H759芯片SPI3/SPI5挂在APB2总线,当前APB2时钟300Mhz,按32预分频设置) 3)转换时间1μs,采集时间1μs 4)帧结构:寄存器读写24个SCLK,数据读取32个SCLK ***每个通道读数,是CS拉低后【此句很重要,查看芯片数据手册波形图】,后面16个时钟读出的数据才是。虽然这个图是auto的,但跟手动是一样的。*** 5)支持拓扑:菊花链,最多挂4片 4. 寄存器与命令系统 1)命令寄存器(16位,只写),详见 sgm51652hxCmd_e 2)关键程序寄存器,详见 sgm51652hxReg_e 5. 工作模式 1)自动扫描模式(AUTO_SCAN):按使能通道升序循环采集 2)手动通道模式(MAN_CH_n):固定采集指定单通道 3)待机模式(STDBY):低功耗,唤醒约20μs,保留配置 4)掉电模式(PWR_DOWN):极低功耗,唤醒需15ms 5)复位模式(RST):寄存器恢复默认值 */ #ifndef _SGM51652HX_H_ #define _SGM51652HX_H_ #include #include "spi_if.h" /******* Macro Definitions *******************/ #define __SGM51652H8__ 1 //SPI3-H4、SPI5-H8 #define ERR_OK_SGM 0 #define ERR_INVALIDPARAMETER -1 #define ERR_TIMEOUT_SGM -2 typedef struct { spi_dev_t spi_dev; // SPI设备 uint8_t initialized; // 初始化状态 } sgm51652hx_dev_t; // 兼容旧结构体名称 typedef sgm51652hx_dev_t sgm51652hxDevice_t; //命令寄存器映射(命令寄存器是1个 16 位的只写寄存器,用于设置SGM51652H4/SGM51652H8 的工作模式。) typedef enum{ NO_OP = 0x0000, //保持当前模式 STDBY = 0x8200, //进入待机模式 PWR_DN = 0x8300, //进入断电模式 RST = 0x8500, //重置程序寄存器 AUTO_RST = 0xA000, //启用通道自动扫描模式 MAN_CH_0 = 0xC000, //选择通道0手动读取模式 MAN_CH_1 = 0xC400, //选择通道1手动读取模式 MAN_CH_2 = 0xC800, //选择通道2手动读取模式 MAN_CH_3 = 0xCC00, //选择通道3手动读取模式 #if __SGM51652H8__ == 1 MAN_CH_4 = 0xD000, MAN_CH_5 = 0xD400, MAN_CH_6 = 0xD800, MAN_CH_7 = 0xDC00, #endif MAN_AUX = 0xE000, //特殊功能,手动采辅助通道Aux,纯差分输入,无PGA/滤波,范围-VREF~+VREF MAX_CMD_NUM }sgm51652hxCmd_e; //程序寄存器映射(程序寄存器是 16 位的可读写寄存器,用于设置SGM51652H4/SGM51652H8 的工作状态。) /* 数据位 DB[15:9]是寄存器地址。数据位 DB[8]是写或读指令位。 在写操作周期中,SDI 引脚上的 DIN[7:0]是写入目标寄存器的数据,SDO 引脚上的 DIN[7:0]是从目标寄存器读回的数据。读回数据可用于验证写入是否成功。 在1个读周期中,SDI 数据位 DB[8]是读指令位。SDO DOUT[7:0]上的数据是来自目标地址程序寄存器的读回数据。 读回数据是MSB(高位优先)模式 */ typedef enum{ AUTO_SEQ_EN = 0x01, // 自动扫描通道使能。通道自扫描模式下,扫描通道的选定,数据bit7-bit0代表通道7-通道9,0:不选定该通道,1:选定该通道 CHANNEL_PD = 0x02, // 通道独立断电。通道自扫描模式下,通道电源控制,数据bit7-bit0代表通道7-通道9,0:通道开启电源,1:通道电源关闭 FEATURE_SEL, // 菊花链/输出格式 RANGE_CH0 = 0x05, // 0x05~0x0C:CH0-CH7量程配置。 RANGE_CHn 通道 n 选择输入范围位,数据bit7-bit4补0,数据bit3-bit0定义如下 RANGE_CH1, // 0000 = 输入范围设置为±2.5 × V(默认) RANGE_CH2, // 0001 = 输入范围设置为±1.25 × V RANGE_CH3, // 0010 = 输入范围设置为±0.625 × V #if __SGM51652H4__ == 0 // 0101 = 输入范围设置为 0 到 2.5 × V RANGE_CH4, // 0110 = 输入范围设置为 0 到 1.25 × V RANGE_CH5, RANGE_CH6, RANGE_CH7, #endif FLOATING_DETECTION_EN = 0x0D, //悬空检测使能。输入浮动检测启用控制,数据bit7:0 = 禁用,1 = 启用,bit6-bit0 保留,补0 FLOATING_DETECTION_STATUS, //悬空检测状态。查询输入浮动状态,数据bit7-bit0代表通道7-1,0=通道未处于浮动状态(默认)1=通道处于浮动状态 CMD_READ_BK = 0x3F, //命令回读(只读),查询前1个数据帧中执行的命令 }sgm51652hxReg_e; /* 量程配置值(写进CHx量程寄存器的配置值) * 详见本文件顶部2.2。 双极性bipolar,单极性unipolar */ typedef enum{ RGVL_BP_1024 = 0x00, //类型:双极性,输入范围:±10.24V RGVL_BP_512, RGVL_BP_256, RGVL_UP_1024 = 0x05, //类型:单极性,输入范围:0~10.24V RGVL_UP_512, }sgm51652hxRngVlu_e; // 芯片操作函数 int sgm51652hx_init(sgm51652hx_dev_t *dev, spi_dev_t *spi_dev); int sgm51652hx_deinit(sgm51652hx_dev_t *dev); int sgm51652hx_write_reg(sgm51652hx_dev_t *dev, uint8_t reg, uint8_t value); int sgm51652hx_read_reg(sgm51652hx_dev_t *dev, uint8_t reg, uint8_t *value); int sgm51652hx_set_range(sgm51652hx_dev_t *dev, uint8_t channel, sgm51652hxRngVlu_e range); int sgm51652hx_read_channel(sgm51652hx_dev_t *dev, uint8_t channel, uint16_t *value); float sgm51652hx_calc_voltage(uint16_t adc_val, sgm51652hxRngVlu_e range); #endif