避孕套上的油是什么油| 口腔老是出血是什么原因| 蝉鸣是什么季节| 肱骨头小囊变什么意思| 可可是什么饮料| 封闭针是什么药| 孕妇血压低吃什么能补上来| 减肥期间可以吃什么零食| surprise是什么意思| 明天属什么生肖| 为什么打哈欠会流泪| 中医考证需要什么条件| 免疫组化是什么意思| 背水一战是什么意思| 恐龙是什么时代| 冬至吃什么| 沙门氏菌用什么药| 葱白是什么| 淋巴清扫是什么意思| 四个又读什么| 蚂蚁爱吃什么东西| 味淋是什么调料| hpv是什么原因引起的| 韭菜什么人不能吃| 家徒四壁是什么生肖| 赵本山什么学历| 软骨炎吃什么药| 香菇配什么菜炒着好吃| 秋葵与什么菜相克| 11是什么生肖| 什么矿泉水比较好| 找工作上什么网| 尿频尿急挂什么科| 摩羯座女和什么星座最配| 身体虚弱打什么营养针| 立刀旁与什么有关| 安门是什么意思| 股票里xd是什么意思| 铺天盖地的意思是什么| 静脉曲张是什么症状| 总是犯困是什么原因| 舌边有齿痕是什么原因| 社保缴费基数和工资有什么关系| 玉树临风是什么生肖| 折耳猫什么颜色最贵| sm是什么意思| 吃孕酮片有什么副作用| 什么东西进去是硬的出来是软的| 一个巾一个童读什么| 什么时候不容易怀孕| fmc是什么意思| 咳嗽呕吐是什么原因| 湿温病是什么症状| 马夫是什么意思| 紫薇花什么季节开花| 牛仔裤搭配什么鞋| 寻麻疹吃什么药| 非钙化斑块是什么意思| 孕妇脚肿是什么原因引起的| 大便成细条状是什么病| 户籍所在地是指什么| 痛风能喝什么酒| 兔头是什么意思| 海马用什么呼吸| 胃胀打嗝吃什么药最好| 星月菩提五行属什么| 迪奥口红属于什么档次| 三周年祭奠有什么讲究| 杨枝甘露是什么做的| 朗格手表什么档次| 镶嵌什么意思| 一喝牛奶就拉肚子是什么原因| 竞走是什么意思| 野鸭子吃什么| 毛囊炎吃什么药| 王维是什么派诗人| 舌根痛吃什么药好得快| 西安古时候叫什么| 521是什么星座| 白脉病是什么病| 江西景德镇有什么好玩的地方| 喝什么茶降血压最好最快| 冲猪煞东是什么意思| 外阴病变有什么症状| 阴毛瘙痒是什么原因| 吃什么不会长胖| 1963年属兔的是什么命| 兔子是什么意思| 烦恼是什么意思| 5月29日是什么星座| 颈部彩超能检查出什么| ovs是什么品牌| 最新奥特曼叫什么| 惊弓之鸟是什么意思| 猫的偏旁叫什么| 血糖高一日三餐吃什么东西最适合| 考试为什么要用2b铅笔| 为什么暑假比寒假长| 白带黄是什么原因| 脾不统血吃什么中成药| 悲智双运什么意思| 尿白细胞十一是什么意思| 抗sm抗体阳性什么意思| 什么是激素脸| 耳膜炎是什么原因引起的| 心脏彩超主要检查什么| 吃什么东西去湿气| 熊猫为什么被称为国宝| 尿道口痛什么原因| 蝉什么时候出来| 蓝色属于什么五行属性| 鸽子拉水便是什么原因| 体检挂什么科室| 什么的星空| 怹是什么意思| 出淤泥而不染是什么花| 保胎吃什么药| 脚上长痣代表什么| 乳腺结节是什么病| 女性喝红茶有什么好处| 黄金有什么用| 黑糖和红糖有什么区别| 痤疮长什么样| 杜甫是什么派诗人| 胸口有痣代表什么意思| 乳蛾是什么意思| 肝脂肪浸润是什么意思| 嚭是什么意思| 咽峡炎是什么病| 胃不舒服挂什么科| 动则气喘是什么原因| 门槛石有什么讲究| 胸口容易出汗是什么原因| 风热感冒吃什么药最好| 阳历8月份是什么星座| 阿哥是什么意思| 恩替卡韦片是什么药| 猫薄荷是什么东西| 上热下寒吃什么药| 饭中吃药是什么时候吃| 做三明治需要什么材料| 衔接是什么意思| 一听是什么意思| 拉不出来屎是什么原因| 蓝莓有什么功效与作用| 胃溃疡吃什么好| 大头菜是什么菜| 滴度是什么意思| 脚腕酸是什么原因| 车前草有什么功效| 高反是什么意思| 孕妇吃鹅蛋有什么好处| 气血两虚吃什么药| 日什么月什么| 狗的尾巴有什么作用| 二个月不来月经是什么原因| 梦见孩子结婚什么预兆| 黑醋是什么醋| 为什么肾阳虚很难恢复| 专科什么意思| 雌蕊由什么组成| 老是腹泻是什么原因导致的| 嗓子痒痒是什么原因| 气短气喘吃什么药| 力不到不为财是什么意思| 微信号为什么会封号| 9月3号是什么日子| 抑郁气滞是什么症状| 液氮是什么| 狗狗耳螨用什么药| 人体最大的器官是什么| 上海最高楼叫什么大厦有多少米高| 什么叫变态| 苍蝇为什么喜欢往人身上飞| 玻璃水是什么| noon什么意思| 毛主席什么时候死的| 组织液是什么| 手和脚脱皮是什么原因| 反流性食管炎吃什么药| 97年是什么年| 大便前面硬后面稀是什么原因| 控评是什么意思| 黄鼠狼吃什么| 梅花象征着什么| 气促是什么意思| 啤酒和什么不能一起吃| 龟头流脓小便刺痛吃什么药| 怕热易出汗是什么原因| 什么花最好养| 倾国倾城是什么生肖| 液体变固体叫什么| 蜂蜜不能和什么食物一起吃| kingtis手表什么牌的| 丝瓜为什么会变黑| 腋下有异味是什么原因导致的| 痢疾是什么| 坚壁清野什么意思| 十月十五号是什么星座| 为什么要小心AB型血的人| 6月11号是什么星座| 什么叫割礼| 空姐在飞机上干什么| 讲义气是什么意思| 今天是什么月| 一个不一个好念什么| 甲苯对人体有什么危害| 血滴子是什么意思| pn医学上是什么意思| 为什么会长花斑癣| 头晕目眩是什么原因| 拔胡子有什么危害| 中国最大的湖泊是什么湖| 于文华朱之文什么关系| 星星代表什么生肖| 风疹是什么样子图片| 太阳穴疼痛是什么原因| 甲沟炎看什么科| 儿童感冒咳嗽吃什么药| 内分泌失调是什么意思| 蓝加黄是什么颜色| 九月十二号是什么星座| 臊子面的臊子是什么| 中性粒细胞是指什么| 窦性心动过缓伴不齐是什么意思| n是什么| 周瑜是什么样的人| 乙肝五项第二项阳性是什么意思| 附件是什么| 手指麻木是什么原因| 玉屏风治什么病最好| 拜谢是什么意思| 回族不吃什么| kg是什么单位| 什么是道| 上厕所出血是什么原因| 做肉丸用什么淀粉最佳| 龛影是什么意思| 脾虚的人有什么症状| 司法警察是做什么的| 心跳加快吃什么药| 推头是什么意思| 肝虚火旺吃什么中成药| 嬴政姓什么| 磁共振是做什么的| 为什么射出来的精子是黄色的| 崩塌的读音是什么| 肺气阴两虚吃什么中成药| 天龙八部是指佛教中的什么| 目鱼和墨鱼有什么区别| 脖子肿是什么原因| 米酒是什么酒| 叶子像什么| 刘姥姥和贾府什么关系| 汗毛旺盛是什么原因| 大便感觉拉不干净什么原因| 皱纹是什么意思| 为什么一直下雨| 啼笑皆非的意思是什么| 难怪是什么意思| 便是什么意思| 羁什么意思| 狗狗拉虫子又细又长吃什么药| 水瓶座是什么象| 百度
打印
[麦麦茶水间]

十年筑“一梦”——中国“天眼”移民“回家记”

[复制链接]
214|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dffzh|  楼主 | 2025-8-1 13:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dffzh 于 2025-8-1 13:22 编辑

#申请原创#
@21小跑堂

我们在使用ADC芯片时,往往都需要编写基于MCU和C语言的ADC芯片驱动代码,通过驱动代码以SPI总线等方式对ADC芯片的寄存器进行相关读写操作,并且读取ADC的采样数据。大部分ADC芯片的总线接口方式都是SPI,如下图所示:

在驱动代码中,ADC芯片的初始化代码是非常重要的,即对ADC芯片的寄存器进行相关配置的代码,那究竟通过C语言以什么样的方式编写初始化代码会比较好呢?会便于后面调试修改呢?会增加代码可读性呢?接下来我就以TI的ADC芯片ADS1262为例向大家展示一下我这边的初始化代码及相关宏定义及枚举操作等。不过在这之前,我们先来看下下面的初始化代码:

即将寄存器值reg_data写入相应的ADC寄存器中,如果后面需要通过修改寄存器值进行芯片调试,估计还得去打开芯片手册看下每个寄存器的位定义,然后计算一下十六进制值,最后再修改reg_data的值去更新寄存器。所以,这种代码操作方式的效率是不是比较低?而且还容易出错,即使你把魔法数字改成宏定义方式也无济于事。
接下来看看我实现的这种方式。
我们先来看看ADC芯片的寄存器,主要讲解如下6个寄存器的操作,包括如下:

要想在代码调试时快速且精准的进行寄存器值修改,那就是要在代码中明确现在需要修改的是哪个寄存器的哪个位配置,以及可以配置哪些值,因此代码的相关名称怎么命名和C语言的相关技术如何使用就显得尤为重要了。因此,我们就需要通过枚举,宏定义和位运算符等操作进行初始化代码的编写。
我们先用枚举方式定义好寄存器地址(写寄存器值即向寄存器地址写入数据),代码如下:
/*ADC register address define*/
typedef enum
{
    ID_REG = 0x00,          //decvice identification register
        POWER_REG = 0x01,       //power register
        INTERFACE_REG = 0x02,   //interface register
        MODE0_REG = 0x03,       //mode0 register
        MODE1_REG = 0x04,       //mode1 register
        MODE2_REG = 0x05,       //mode2 register
        INPMUX_REG = 0x06,      //input multiplexer register
        OFCAL0_REG = 0x07,      //offset calibration register 0
        OFCAL1_REG = 0x08,      //offset calibration register 1
        OFCAL2_REG = 0x09,      //offset calibration register 2
        FSCAL0_REG = 0x0A,      //full-scale calibration register 0
        FSCAL1_REG = 0x0B,      //full-scale calibration register 1
        FSCAL2_REG = 0x0C,      //full-scale calibration register 2
        IDACMUX_REG = 0x0D,     //IDAC multiplexer register
        IDACMAG_REG = 0x0E,     //IDAC magnitude register
        REFMUX_REG = 0x0F,      //reference multiplexer register
        TDACP_REG = 0x10,       //TDACP control register
        TDACN_REG = 0x11,       //TDACN control register
        GPIOCON_REG = 0x12,     //GPIO Connection register
        GPIODIR_REG = 0x13,     //GPIO direction register
        GPIODAT_REG = 0x14,     //GPIO data register
        ADC2CFG_REG = 0x15,     //ADC2 configuration register
        ADC2MUX_REG = 0x16,     //ADC2 input multiplexer register
        ADC2OFC0_REG = 0x17,    //ADC2 offset calibration register 0
        ADC2OFC1_REG = 0x18,    //ADC2 offset calibration register 1
        ADC2FSC0_REG = 0x19,    //ADC2 full-scale calibration register 0
        ADC2FSC1_REG = 0x1A,    //ADC2 full-scale calibration register 1
}ads1262_reg_addr_e;
寄存器的名称命名方式可以采用“寄存器名称_REG”的方式,并在每个寄存器后面加上注释,备注一下寄存器的含义。
然后用枚举和宏定义方式定义好每个寄存器,比如以下定义INTERFACE寄存器的代码:
/*interface register*/
#define ADS1262_INTERFACE_REG_TIMEOUT(x)                (((x) & 0x01) << 3) //RW
typedef enum {
        TIMEOUT_CONFIG_DISABLE = 0,  //default
        TIMEOUT_CONFIG_ENABLE = 1,
}ads1262_inerface_reg_timeout_config_e;

#define ADS1262_INTERFACE_REG_STATUS(x)                (((x) & 0x01) << 2) //RW
typedef enum {
        STATUS_CONFIG_DISABLE = 0,  
        STATUS_CONFIG_ENABLE = 1, //default
}ads1262_inerface_reg_status_config_e;

#define ADS1262_INTERFACE_REG_CRC(x)                ((x) & 0x03) //RW
typedef enum {
        CRC_CONFIG_DISABLE = 0,  
        CRC_CONFIG_CHECKSUM_MODE = 1, //default
        CRC_CONFIG_CRC_MODE = 2,
}ads1262_inerface_reg_crc_config_e;
寄存器位的名称命名方式可以采用“ADC芯片名称_寄存器名称_REG_位名称”或者“寄存器名称_REG_位名称”,寄存器位值的名称命名方式可以采用“位名称_CONFIG_位值”,位值枚举的名称命名方式可以采用小写的“ADC芯片名称_寄存器名称_reg_位名称_config_e”或者“寄存器名称_reg_位名称_config_e”。
而宏定义里面的x的值即对应位值枚举里面的值,直接修改即可,比如:
ADS1262_INTERFACE_REG_TIMEOUT(TIMEOUT_CONFIG_DISABLE)或者
ADS1262_INTERFACE_REG_TIMEOUT(TIMEOUT_CONFIG_ENABLE)。
其他5个寄存器的定义代码如下所示:
/*power register*/
#define ADS1262_POWER_REG_RESET(x)                (((x) & 0x01) << 4) //RW
typedef enum {
        RESET_CONFIG_CLEAR = 1,
}ads1262_power_reg_reset_config_e;

#define ADS1262_POWER_REG_VBIAS(x)                (((x) & 0x01) << 1) //RW
typedef enum {
        VBIAS_CONFIG_DISABLE = 0, //default
        VBIAS_CONFIG_ENABLE = 1,
}ads1262_power_reg_vbias_config_e;

#define ADS1262_POWER_REG_INTREF(x)                ((x) & 0x01) //RW
typedef enum {
        INTREF_CONFIG_DISABLE = 0,
        INTREF_CONFIG_ENABLE = 1, //default
}ads1262_power_reg_intref_config_e;

/*mode0 register*/
#define ADS1262_MODE0_REG_REFREV(x)                (((x) & 0x01) << 7) //RW
typedef enum {
        REFREV_CONFIG_NORMAL_POLARITY = 0,  //default
        REFREV_CONFIG_REVERSE_POLARITY = 1,
}ads1262_mode0_reg_refrev_config_e;

#define ADS1262_MODE0_REG_RUNMODE(x)                (((x) & 0x01) << 6) //RW
typedef enum {
        RUNMODE_CONFIG_CONTINUOUS_CONVERSION = 0,  //default
        RUNMODE_CONFIG_PULSE_CONVERSION = 1,
}ads1262_mode0_reg_runmode_config_e;

#define ADS1262_MODE0_REG_CHOP(x)                (((x) & 0x03) << 4) //RW
typedef enum {
        CHOP_CONFIG_DISABLE = 0,  //default
        CHOP_CONFIG_INPUT_CHOP_ENABLE = 1,
        CHOP_CONFIG_IDAC_ROTATION_ENABLE = 2,
        CHOP_CONFIG_ALL_ENABLE = 3,
}ads1262_mode0_reg_chop_config_e;

#define ADS1262_MODE0_REG_DELAY(x)                ((x) & 0x0F) //RW
typedef enum {
        DELAY_CONFIG_NO_DELAY = 0,  //default
        DELAY_CONFIG_8_7US = 1,  //8.7us
        DELAY_CONFIG_17US = 2,   //17us
        DELAY_CONFIG_35US = 3,   //35us
        DELAY_CONFIG_69US = 4,
        DELAY_CONFIG_139US = 5,
        DELAY_CONFIG_278US = 6,
        DELAY_CONFIG_555US = 7,
        DELAY_CONFIG_1_1MS = 8,  // 1.1ms
        DELAY_CONFIG_2_2MS = 9,
        DELAY_CONFIG_4_4MS = 10,
        DELAY_CONFIG_8_8MS = 11,
}ads1262_mode0_reg_delay_config_e;

/*mode1 register*/
#define ADS1262_MODE1_REG_FILTER(x)                (((x) & 0x07) << 5) //RW
typedef enum {
        FILTER_CONFIG_SINC1_MODE = 0,
        FILTER_CONFIG_SINC2_MODE = 1,
        FILTER_CONFIG_SINC3_MODE = 2,
        FILTER_CONFIG_SINC4_MODE = 3,
        FILTER_CONFIG_FIR_MODE = 4, //default
}ads1262_mode1_reg_filter_config_e;

#define ADS1262_MODE1_REG_SBADC(x)                (((x) & 0x07) << 4) //RW
typedef enum {
        SBADC_CONFIG_CONNECT_ADC1 = 0, //default
        SBADC_CONFIG_CONNECT_ADC2 = 1,
}ads1262_mode1_reg_sbadc_config_e;

#define ADS1262_MODE1_REG_SBPOL(x)                (((x) & 0x07) << 3) //RW
typedef enum {
        SBPOL_CONFIG_PULLUP_MODE = 0, //default
        SBPOL_CONFIG_PULLDOWN_MODE = 1,
}ads1262_mode1_reg_sbpol_config_e;

#define ADS1262_MODE1_REG_SBMAG(x)                ((x) & 0x07) //RW
typedef enum {
        SBMAG_CONFIG_NO = 0, //default
        SBMAG_CONFIG_0_5UA = 1,
        SBMAG_CONFIG_2UA = 2,
        SBMAG_CONFIG_10UA = 3,
        SBMAG_CONFIG_50UA = 4,
        SBMAG_CONFIG_200UA = 5,
        SBMAG_CONFIG_10M = 6, // 10MΩresistor
}ads1262_mode1_reg_sbmag_config_e;

/*mode2 register*/
#define ADS1262_MODE2_REG_BYPASS(x)                (((x) & 0x07) << 7) //RW
typedef enum {
        BYPASS_CONFIG_PGA_ENABLE = 0, //default
        BYPASS_CONFIG_PGA_BYPASS = 1,
}ads1262_mode2_reg_bypass_config_e;

#define ADS1262_MODE2_REG_GAIN(x)                (((x) & 0x07) << 4) //RW
typedef enum {
        GAIN_CONFIG_1V = 0, //default,1V/V
        GAIN_CONFIG_2V = 1,
        GAIN_CONFIG_4V = 2,
        GAIN_CONFIG_8V = 3,
        GAIN_CONFIG_16V = 4,
        GAIN_CONFIG_32V = 5,
}ads1262_mode2_reg_gain_config_e;

#define ADS1262_MODE2_REG_DR(x)                ((x) & 0x0F) //RW
typedef enum {
        DR_CONFIG_2_5SPS = 0, //2.5 SPS, data rate
        DR_CONFIG_5SPS = 1,
        DR_CONFIG_10SPS = 2,
        DR_CONFIG_16_6SPS = 3,
        DR_CONFIG_20SPS = 4, //default
        DR_CONFIG_50SPS = 5,
        DR_CONFIG_60SPS = 6,
        DR_CONFIG_100SPS = 7,
        DR_CONFIG_400SPS = 8,
        DR_CONFIG_1200SPS = 9,
        DR_CONFIG_2400SPS = 10,
        DR_CONFIG_4800SPS = 11,
        DR_CONFIG_7200SPS = 12,
        DR_CONFIG_14400SPS = 13,
        DR_CONFIG_19200SPS = 14,
        DR_CONFIG_38400SPS = 15,
}ads1262_mode2_reg_dr_config_e;

/*input multiplexer register*/
#define ADS1262_INPMUX_REG_MUXP(x)                (((x) & 0x0F) << 4) //RW
typedef enum {
        MUXP_CONFIG_AIN0 = 0, //default
        MUXP_CONFIG_AIN1 = 1,
        MUXP_CONFIG_AIN2 = 2,
        MUXP_CONFIG_AIN3 = 3,
        MUXP_CONFIG_AIN4 = 4,
        MUXP_CONFIG_AIN5 = 5,
        MUXP_CONFIG_AIN6 = 6,
        MUXP_CONFIG_AIN7 = 7,
        MUXP_CONFIG_AIN8 = 8,
        MUXP_CONFIG_AIN9 = 9,
        MUXP_CONFIG_AINCOM = 10,
        MUXP_CONFIG_TSMP = 11,
        MUXP_CONFIG_APSMP = 12,
        MUXP_CONFIG_DPSMP = 13,
        MUXP_CONFIG_TTSP = 14,
        MUXP_CONFIG_FLOAT = 15,
}ads1262_inpmux_reg_muxp_config_e;

#define ADS1262_INPMUX_REG_MUXN(x)                ((x) & 0x0F) //RW
typedef enum {
        MUXN_CONFIG_AIN0 = 0,
        MUXN_CONFIG_AIN1 = 1, //default
        MUXN_CONFIG_AIN2 = 2,
        MUXN_CONFIG_AIN3 = 3,
        MUXN_CONFIG_AIN4 = 4,
        MUXN_CONFIG_AIN5 = 5,
        MUXN_CONFIG_AIN6 = 6,
        MUXN_CONFIG_AIN7 = 7,
        MUXN_CONFIG_AIN8 = 8,
        MUXN_CONFIG_AIN9 = 9,
        MUXN_CONFIG_AINCOM = 10,
        MUXN_CONFIG_TSMN = 11,
        MUXN_CONFIG_APSMN = 12,
        MUXN_CONFIG_DPSMN = 13,
        MUXN_CONFIG_TTSN = 14,
        MUXN_CONFIG_FLOAT = 15,
}ads1262_inpmux_reg_muxn_config_e;
以上的代码都写在ADS1262.h文件里面,即ADC芯片驱动代码的头文件可以用“ADC芯片名称.h”或者“drv_ADC芯片名称.h”来命名。
接下来就是编写初始化代码接口了,对应写在ADS1262.c里面,同样地,ADC芯片驱动代码的源文件可以用“ADC芯片名称.c”或者“drv_ADC芯片名称.c”来命名。初始化函数接口可以用“ADC芯片名称_init”来命名。
以下即为ads1262_init函数接口,实现对ADC芯片的初始化配置操作:
void ads1262_init(void) 
{
    uint8_t write_byte = 0x00;

         ads1262_cs_set(ADS1262_CS_HIGH);   
    //config power register
    write_byte = ADS1262_POWER_REG_RESET(RESET_CONFIG_CLEAR) \
                     | ADS1262_POWER_REG_VBIAS(VBIAS_CONFIG_ENABLE) \
                     | ADS1262_POWER_REG_INTREF(INTREF_CONFIG_ENABLE);
    ads1262_write_register(POWER_REG, write_byte);

    //config interface register
    write_byte = ADS1262_INTERFACE_REG_TIMEOUT(TIMEOUT_CONFIG_DISABLE) \
                     | ADS1262_INTERFACE_REG_STATUS(STATUS_CONFIG_ENABLE) \
                     | ADS1262_INTERFACE_REG_CRC(CRC_CONFIG_DISABLE);
    ads1262_write_register(INTERFACE_REG, write_byte);
   
    //config mode0 register
    write_byte = ADS1262_MODE0_REG_REFREV(REFREV_CONFIG_NORMAL_POLARITY) \
                     | ADS1262_MODE0_REG_RUNMODE(RUNMODE_CONFIG_CONTINUOUS_CONVERSION) \
                     | ADS1262_MODE0_REG_CHOP(CHOP_CONFIG_DISABLE) \
                     | ADS1262_MODE0_REG_DELAY(DELAY_CONFIG_NO_DELAY);
    ads1262_write_register(MODE0_REG, write_byte);

    //config mode1 register
        write_byte = ADS1262_MODE1_REG_FILTER(FILTER_CONFIG_FIR_MODE) \
                     | ADS1262_MODE1_REG_SBADC(SBADC_CONFIG_CONNECT_ADC1) \
                     | ADS1262_MODE1_REG_SBPOL(SBPOL_CONFIG_PULLUP_MODE) \
                     | ADS1262_MODE1_REG_SBMAG(SBMAG_CONFIG_0_5UA);
    ads1262_write_register(MODE1_REG, write_byte);

    //config mode2 register
    write_byte = ADS1262_MODE2_REG_BYPASS(BYPASS_CONFIG_PGA_ENABLE) \
                     | ADS1262_MODE2_REG_GAIN(GAIN_CONFIG_1V)\
                     | ADS1262_MODE2_REG_DR(DR_CONFIG_7200SPS);
    ads1262_write_register(MODE2_REG, write_byte);

    //config input multiplexer register
    write_byte = ADS1262_INPMUX_REG_MUXP(MUXP_CONFIG_AIN0) \
                     | ADS1262_INPMUX_REG_MUXN(MUXN_CONFIG_AIN1);
    ads1262_write_register(INPMUX_REG, write_byte);
        ads1262_cs_set(ADS1262_CS_HIGH);
}
通过以上的基于位或运算符的代码操作,后面如果需要修改某个寄存器的某个位值,直接用枚举值复制粘贴进行替换即可,而且可以保证准确无误。
虽然一开始对照寄存器进行代码编写时会比较繁琐费时,但这是事半功倍的操作,代码的可读性和可维护性是比较好的。
以上是个人见解,有更好的方式也欢迎分享,比如使用表驱动法等也是非常好的,方法很多,归根结底,目的是增加可读性和可维护性。
另外,对于其他的外置芯片驱动初始化代码,包括DAC芯片和EEPROM芯片等,同样可以以这种方式实现一劳永逸的操作。
评论
dffzh 2025-8-1 13:25 回复TA
@21小跑堂 管理员,你好,求原创审核哦! 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

1102

帖子

20

粉丝
卡介苗是什么 什么是离子 咳嗽变异性哮喘吃什么药 锤子是什么意思 标的是什么
日本兵为什么不怕死 脸上长斑是什么原因引起的 一个目一个于念什么 看花灯是什么节日 什么是纤维瘤
窦性心律不齐是什么情况 田反念什么 糖耐什么时候做 汪星人什么意思 梨状肌综合症吃什么药
胃动力不足吃什么药 艾叶煮水喝有什么功效 什么样的梦才算是胎梦 茄子炒什么好吃 佛性是什么意思
神经病吃什么药效果好hcv9jop5ns6r.cn 做阴超有黄体说明什么hcv9jop5ns4r.cn 晴字五行属什么hcv8jop6ns9r.cn 感染幽门螺旋杆菌吃什么药hcv9jop2ns7r.cn 手掌像什么wzqsfys.com
怀孕第一个月最怕什么hcv8jop5ns3r.cn 表面积是什么hlguo.com y是什么元素hcv9jop4ns3r.cn 鹿晗女朋友叫什么名字hcv9jop2ns0r.cn 去医院打耳洞挂什么科hcv9jop6ns3r.cn
尿白细胞高是什么原因hcv7jop6ns1r.cn 三什么一什么四字词语hcv9jop5ns2r.cn 手术后可以吃什么水果hcv8jop5ns2r.cn 血虚吃什么好hcv8jop7ns2r.cn nsaids是什么药hcv9jop7ns2r.cn
经常泡脚有什么好处hcv9jop7ns1r.cn 葛根和粉葛有什么区别hcv8jop3ns0r.cn 什么是三焦hcv8jop0ns0r.cn 阳刃是什么意思hcv8jop2ns3r.cn 南无是什么意思hcv8jop2ns4r.cn
百度