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

借鉴adbms1818的底层驱动代码

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

(1)定义一个结构体

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

cpp 复制代码
/*! 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是否相同,相同数据接收正确,不同数据接收错误。

cpp 复制代码
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是否读取错误

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

(4)跳转st定义

cpp 复制代码
/*! 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当成一个对象,不同的寄存器就是它的属性。因此在阅读别人的代码时,你就可以看结构体,这样可以更快的入手此芯片的作用

相关推荐
敲上瘾13 分钟前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
不会写代码的ys19 分钟前
【类与对象】--对象之舞,类之华章,共绘C++之美
c++
兵哥工控21 分钟前
MFC工控项目实例三十二模拟量校正值添加修改删除
c++·mfc
长弓聊编程31 分钟前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.38 分钟前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
暮色_年华1 小时前
Modern Effective C++item 9:优先考虑别名声明而非typedef
c++
重生之我是数学王子1 小时前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
我们的五年1 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
做人不要太理性2 小时前
【C++】深入哈希表核心:从改造到封装,解锁 unordered_set 与 unordered_map 的终极奥义!
c++·哈希算法·散列表·unordered_map·unordered_set
程序员-King.2 小时前
2、桥接模式
c++·桥接模式