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

借鉴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 Codesuint8_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 VDuint8_t flags[3]; //!< flag[0]:C4OV C4UV C3OV C3UV C2OV C2UV C1OV C1UV 依此内推uint8_t mux_fail[1]; //!< Mux self test status flag  MUXFAILuint8_t thsd[1]; //!< Thermal shutdown status	THSDuint8_t pec_match[2]; //!< pec_match[0]记录状态寄存器A是否读取错误  pec_match[1]记录状态寄存器B是否读取错误
} st;

(5)总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/598177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

航天航空线束工艺3D虚拟展馆支持多人异地参观漫游

为了满足汽车线束企业员工工作需要&#xff0c;让新老员工了解到更先进、规范的线束工艺设计技术&#xff0c;华锐视点基于VR虚拟仿真、web3d开发和图形图像技术制作了一款汽车线束工艺设计VR虚拟仿真模拟展示系统。 汽车线束工艺设计VR虚拟仿真模拟展示系统共分为pc电脑端和VR…

如何启动flowable的Flowable UI画工作流程图

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

XV4001BC (数字输出) 车载用

XV4001BC、XV4001BD、XV4001KC和XV4001KD是车载用SPI/I2C输出接口&#xff0c;支持角速度输出、温度传感器输出以及20度倾斜实现。这些接口可适应各种汽车导航和通讯系统&#xff0c;符合AEC-Q200标准 SPI / I2C 输出接口角速度输出(16bit)、温度传感器输出(11bit)20度倾斜实现…

初识Web服务器

一、web服务器 1、什么是web服务器&#xff1f; web服务器就是web项目的容器&#xff0c;我们将开发好的web项目部署到web容器中&#xff0c;才能使用网络中的用户通过浏览器进行访问。 一张图带你了解web服务器有啥作用&#xff1a; 在我的电脑上有一个已经做好的项目&#…

大数据Doris(五十):数据导出的其他导出案例参考

文章目录 数据导出的其他导出案例参考 一、​​​​​

Spark调优解析-spark数据倾斜优化2(七)

1 数据倾斜优化 1.1为何要处理数据倾斜&#xff08;Data Skew&#xff09; 什么是数据倾斜 对Spark/Hadoop这样的大数据系统来讲&#xff0c;数据量大并不可怕&#xff0c;可怕的是数据倾斜。 何谓数据倾斜&#xff1f;数据倾斜指的是&#xff0c;并行处理的数据集中&#xf…

Python split()方法详解:分割字符串

Python 中&#xff0c;除了可以使用一些内建函数获取字符串的相关信息外&#xff08;例如 len() 函数获取字符串长度&#xff09;&#xff0c;字符串类型本身也拥有一些方法供我们使用。 注意&#xff0c;这里所说的方法&#xff0c;指的是字符串类型 str 本身所提供的&#x…

[每周一更]-(第80期):分析源码flag,配合示例展示用法

Go 语言标准库中的 flag 包提供了一套简单而又强大的命令行参数解析工具。以下是对 flag 包源码的一些关键点的解析&#xff1a; FlagSet 结构体&#xff1a; FlagSet 是 flag 包的核心结构体&#xff0c;用于表示一组命令行参数。它包含了一个存储命令行参数的 map&#xff…

酷开科技 | 酷开系统9.2,开启个性化时代

现代人&#xff0c;总喜欢不走寻常路&#xff0c;以彰显自己的不同。酷开系统的个性化推荐就能满足你的这类需求&#xff0c;既能给你想要的内容&#xff0c;又能给你与众不同的体验&#xff01; 想听音乐了&#xff1f;打开酷开系统音乐频道&#xff0c;随机播放为你推荐的歌曲…

springboot devtools实现热部署

1.配置devtools依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency>2.配置maven插件&…

【四】CocosCreator-修改引擎源码

看源码的过程中&#xff0c;少不了得修修改改源码&#xff0c;做点实验。果断去找找源码在哪里&#xff0c;然后就可以快乐动手改源码了。 CocosCreator引擎源码主要就是js和原生C两类&#xff0c;分别在引擎目录的resources/engine和resources/cocos2d-x下&#xff0c;如图&am…

WEB 3D技术 three.js 法向量演示性讲解

本文 我们来说法向 法向 又叫 法向量 就是 我们一个三维物体 顶点垂直于面 的方向 向量 他的作用 用来做光反射 根据光照的方向 根据面进行反射 我们上文写的这个代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "…

R语言频率分布直方图绘制教程

本篇笔记分享R语言绘制直方图的方法&#xff0c;通过多种展示风格对数据进行可视化&#xff0c;主要用到ggplot、ggpubr等包。 什么是直方图&#xff1f; 直方图(Histogram)&#xff0c;又称质量分布图&#xff0c;是一种统计报告图&#xff0c;由一系列高度不等的柱子表示数据…

【Java集合类篇】HashMap的数据结构是怎样的?

HashMap的数据结构是怎样的? ✔️HashMap的数据结构✔️ 数组✔️ 链表 ✔️HashMap的数据结构 在Java中&#xff0c;保存数据有两种比较简单的数据结构: 数组和链表&#xff08;或红黑树&#xff09;。 HashMap是 Java 中常用的数据结构&#xff0c;它实现了 Map 接口。Has…

STM32 CubeMX产生的程序架构

使用STM32CubeMX产生启动相关代码&#xff0c;配置各种外设。在后续程序开发过程中&#xff0c;有可能使用STM32CubeMX逐步产生使用的代码&#xff0c;为了将其产生的代码和我们程序隔离&#xff0c;一种可行的程序架构如下&#xff1a; 在此架构中&#xff0c;STM32CubeMX产生…

GraphQL和REST API的区别

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 GraphQL&#xff08;Graph Query Language&#xff09;和REST&#xff08;Representational State Transfer&#xff09;是两种用于构建和设计API的不同方法。以下…

电脑屏幕一直闪烁怎么解决?三大妙招还你清晰视野

电脑屏幕闪烁一直是困扰用户的一个问题&#xff0c;它会影响到用户的使用体验&#xff0c;甚至可能导致眼睛疲劳和头痛。可是电脑屏幕一直闪烁怎么解决呢&#xff1f;在本文中&#xff0c;我们将介绍三个解决电脑屏幕闪烁的方法&#xff0c;从简单的软件调整到硬件检测&#xf…

亚马逊图片上传后变模糊怎么办?亚马逊图片优化指南—站斧浏览器

亚马逊图片上传后变模糊怎么办&#xff1f; 使用高分辨率图片&#xff1a;亚马逊建议卖家使用至少1000 x 1000像素的高分辨率图片。如果您上传的图片分辨率较低&#xff0c;亚马逊系统可能会将其自动调整为较小的尺寸&#xff0c;导致图片模糊。因此&#xff0c;确保您使用高质…

基于Java SSM框架实现宠物管理系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现宠物管理系统演示 摘要 随着我国经济的快速发展&#xff0c;人民生活水平的不断提高&#xff0c;宠物逐渐成为许多宠物爱好者的一种生活方式。 宠物的品种也越来越多样化&#xff0c;宠物不仅能给生活带来乐趣还可以成为空巢老人&#xff0c;独生子女很…

MongoDB批量写入操作

一、概述 MongoDB为客户端提供了批量执行写入操作的能力。批量写入操作影响单个集合。MongoDB允许应用程序确定批量写入操作所需的可接受确认级别。 db.collection.bulkWrite&#xff08;&#xff09;方法提供了执行批量插入、更新和删除操作的能力。 MongoDB还支持通过db.col…