BMS开发之面向对象思想(adbms1818)

2024-01-04

借鉴adbms1818的底层驱动代码

前言:adbms1818的主要用途就是不同种类的寄存器里面存储不同的数据,程序员需要通过特定的协议往寄存器里面写入或者读出数据

(1)定义一个结构体

里面存储了adbms1818的所有寄存器的信息。然后我们看定义,首先就是配置寄存器config,其次是配置寄存器configB,然后就是电压寄存器cells,辅助寄存器aux,状态寄存器stat,COMM寄存器组com......,但是我们不知道最前面的数据类型,他并不是我们熟知的int , char,short等等。

/*! Cell variable structure */
typedef struct
{
  ic_register config;
  ic_register configb;
  cv  cells;
  ax  aux;
  st  stat;
  ic_register com;
  ic_register pwm;
  ic_register pwmb;
  ic_register sctrl;
  ic_register sctrlb;
  uint8_t sid[6];
  BOOL isospi_reverse;
  pec_counter crc_count;
  register_cfg ic_reg;
  long system_open_wire;
}cell_asic;

(2)跳转到ic_register定义

已知信息是配置寄存器组A占48个位,6个字节,其次协议规定的发送数据格式是 CMD0 CMD1 PEC0 PEC1 6个字节数据 PEC0 PEC1 ,此处我们只需要考虑红色字体,PEC0,PEC1类似于CRC校验码。

再次返回来看结构体,首先tx_data[6]里面存储的就是寄存器里面所有位的数据,rx_data[8]收到的数据(包括PEC0 PEC1),rx_pec_match是标志位,判断接收到的PEC和根据6位数据计算出来的PEC是否相同,相同数据接收正确,不同数据接收错误。

typedef struct
{
  uint8_t tx_data[6];  //!< Stores data to be transmitted 
  uint8_t rx_data[8];  //!< Stores received data 
  uint8_t rx_pec_match; //!< If a PEC error was detected during most recent read cmd
} ic_register;

(3)跳转cv定义

已知信息:电池电压寄存器组总共有A-F,总共6组。每组存放3个电池的电压值,每一个电池的电压值用16位表示。并且电压值我们只会读,不会写,因此只需要定义一块内存用来存储电池电压。

c_code[0]存储电池1电压,c_code[1]存储电池2电压......,c_code[17]存储电池18电压。pec_match[0]存储电池电压寄存器A是否读取错误......pec_match[5]存储电池电压寄存器F是否读取错误

/*! Cell Voltage data structure. */
typedef struct
{
  uint16_t c_codes[18]; //!< Cell Voltage Codes
  uint8_t pec_match[6]; //!< If a PEC error was detected during most recent read cmd
} cv;

处理数据的办法有两种,我们已知有6组数据,每一组数据有3个

  • 方法一:定义一个二维数组 uint16_t arr[6][3];
for(int i=0;i<6;i++)
{
    for(int j=0;j<3;j++)
    {
        arr[i][j]表示电池电压寄存器组i的第j个电池
    }
}
  • 方法二:定义一个一维数组arr[18];
cur_reg//我要读取的电池电压寄存器cur_reg(范围:012345)
cur_num//我要读取的电池电压寄存器的第几个电池电压(范围:012)
arr[(cur_reg-1)*3+cur_num]//我要读取的电池电压寄存器cur_reg的第cur_num个电池电压

(4)跳转st定义

/*! Status Reg data structure. */
typedef struct
{
  uint16_t stat_codes[4]; //!< Status codes.SC ITMP VA VD
  uint8_t flags[3]; //!< flag[0]:C4OV C4UV C3OV C3UV C2OV C2UV C1OV C1UV 依此内推
  uint8_t mux_fail[1]; //!< Mux self test status flag  MUXFAIL
  uint8_t thsd[1]; //!< Thermal shutdown status	THSD
  uint8_t pec_match[2]; //!< pec_match[0]记录状态寄存器A是否读取错误  pec_match[1]记录状态寄存器B是否读取错误
} st;

(5)总结

由上述的结构可以看出,把寄存器当成一个对象,寄存器里面存放的不同内容就是他的属性。把adbms1818当成一个对象,不同的寄存器就是它的属性。因此在阅读别人的代码时,你就可以看结构体,这样可以更快的入手此芯片的作用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BMS开发之面向对象思想(adbms1818) 的相关文章

随机推荐

  • MySQL忘记密码了怎么办

    MySQL忘记密码 今天在写jdbc时很悲催的发现自己的MySQL密码忘记了 没有办法了 重新设置一下密码吧 先关闭mysql服务mysql server stop 跳过权限检验 在使用该命令的时候要确保mysql服务是关闭的 不然是无法正
  • C语言环形缓冲区

    2024第一天 继续给自己加点料 导言 C语言环形缓冲区是一种常用的数据结构 它提供了一种高效的方式来存储和处理数据 本文将深入解析C语言环形缓冲区的定义 原理和应用 并提供一些实际的代码示例 一 什么是环形缓冲区 环形缓冲区 也称为循环缓
  • 比较两个信号的频率成分

    频谱相干性有助于识别频域中信号之间的相似性 大数值表示信号共有的频率分量 将两个声音信号加载到工作区中 以 1 kHz 的频率对其进行采样 使用 periodogram 计算其功率频谱 并以彼此相邻的方式对其绘图 load relateds
  • Win7系统提示找不到KBDUKX.DLL文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个KBDUKX
  • Win7系统提示找不到KBDUR.DLL文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个KBDUR D
  • [每周一更]-(第56期):不能不懂的网络知识

    作为程序员 在网络方面具备一定的知识和技能是非常重要的 以下是一些程序员需要熟练掌握的网络知识 基础网络概念 IP地址 了解IPv4和IPv6地址的格式和分配方式 以及常见的IP地址分类 子网掩码 理解子网掩码的作用 以及如何计算子网的大小
  • Win7系统提示找不到KBDUR1.DLL文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个KBDUR1
  • Java版直播商城免 费 搭 建:平台规划与常见营销模式,电商源码、小程序、三级分销及详解

    saas云平台 打造全行业全渠道全场景的saas产品 为经营场景提供一体化解决方案 门店经营区域化 网店经营一体化 本地化 全方位 一站式服务 为多门店提供统一运营解决方案 提供丰富多样的营销玩法覆盖所有经营场景 助力商家成功 系统稳定压倒
  • 对 pcl::StatisticalOutlierRemoval 滤波器的理解

    对 pcl StatisticalOutlierRemoval 滤波器的理解 注 以下内容基于与 GPT 4 的交流并结合个人理解整理而成 若有描述不准确或模糊之处 欢迎指正 参数配置 setMeanK int meanK 此参数设置每个点
  • Win7系统提示找不到KBDUSA.DLL文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个KBDUSA
  • Docker无法启动Postgresql容器

    目录 问题描述 解决问题 问题描述 拉取了一个Postgresql14 2的镜像 在 docker run 创建并运行容器之后使用 docker ps 发现容器没有跑起来 再次使用 docker start 也没跑起来 docker run
  • 太强了!利用 Python 连接 ES 查询索引某个字段命中数的脚本!

    当我们在工作中 如果频繁查询 Elasticsearch 某个索引中的某个字段命中的记录数量时 可以通过 Python 的 Elasticsearch 库来查询 从而提升工作效率 代码大致思路如下 第一步 从 elasticsearch 模
  • Java版企业电子招标采购系统源码——鸿鹄电子招投标系统的技术特点

    在数字化时代 采购管理也正经历着前所未有的变革 全过程数字化采购管理成为了企业追求高效 透明和规范的关键 该系统通过Spring Cloud Spring Boot2 Mybatis等先进技术 打造了从供应商管理到采购招投标 采购合同 采购
  • 德思特应用 | 革新MIMO无线电测试,精准测量10 MHz-8 GHz复杂射频信号!(二)

    来源 德思特测量测试 德思特应用 革新MIMO无线电测试 精准测量10 MHz 8 GHz复杂射频信号 二 原文链接 https mp weixin qq com s ScYnA3 09XT3Gp6SRg1n4Q 欢迎关注虹科 为您提供最新
  • NetCore Webapi XSRF/CSRF 跨站请求伪造过滤中间件

    XSRF Cross Site Request Forgery 和CSRF Cross Site Request Forgery 是一种常见的网络攻击方式 攻击者通过伪造请求将恶意操作发送到用户正在访问的网站 为了防止这种攻击 可以采取以下
  • 移植useradd到嵌入式Linux设备

    友情提示 前面一大段描述的是在老版本Ubuntu14 4交叉编译新版本shadow 过程曲折 没有结果 分割线后面一段是重新换了一个较老版本shadow 4 4 过程丝滑 结果喜人 诸君如耐心有限可直接划拉至分割线后部分内容 对于其他程序的
  • 如何查看电脑使用记录?分享4个可行方法!

    我在使用电脑时突然想查看一下电脑之前的使用记录 但是不知道应该怎么操作 有没有朋友知道应该怎么做呢 在日常生活和工作中 我们经常需要查看电脑的使用记录 例如访问过的网站 运行过的程序 文档编辑历史等 如何查看电脑使用记录呢 本文将给大家分享
  • Win7系统提示找不到KBDUGHR1.DLL文件的解决办法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个KBDUGHR
  • 如何无需公网IP实现远程访问Windows本地WebDAV服务中存储文件

    文章目录 1 安装IIS必要WebDav组件 2 客户端测试 3 cpolar内网穿透 3 1 打开Web UI管理界面 3 2 创建隧道 3 3 查看在线隧道列表
  • BMS开发之面向对象思想(adbms1818)

    借鉴adbms1818的底层驱动代码 前言 adbms1818的主要用途就是不同种类的寄存器里面存储不同的数据 程序员需要通过特定的协议往寄存器里面写入或者读出数据 1 定义一个结构体 里面存储了adbms1818的所有寄存器的信息 然后我