Initial commit: CCU621_M firmware project with BLE debug link support.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
/*!
|
||||
\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 <stdint.h>
|
||||
#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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user