/*
*********************************************************************************************************
*
* 模块名称 : ds2782驱动
* 文件名称 : DS2782.c
* 版 本 : V1.0
* 说 明 :
*
* 修改记录 :
* 版本号 日期 作者 说明
* V1.0 2019-02-022 Baiyang
*
* Copyright (C), 本宝宝不高兴
*
*********************************************************************************************************
*/
#include "stm8s.h"
#include "bsp.h"
#include "bsp_ds2782.h"
#include "bsp_i2c_gpio.h"
Ds2782_Typedef Ds2782;
Ds278x Ds2782_RAM;
/*
* 函数名 Get_DS2782_Register
* 功能 获取DS2782寄存器
* 详见数据手册 P26页 Basic Transaction Formats 章节
*/
uint8_t Read_DS2782_Shadow_RAM(uint8_t reg_Addres)
{
uint8_t ack,data;
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_WR); //器件地址 | 写
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(reg_Addres); //寄存器地址
ack=i2c_WaitAck(); //等待应答
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_RD); //器件地址 | 读
ack=i2c_WaitAck(); //等待应答
data=i2c_ReadByte(); //获取 低字节
i2c_NAck(); //非应答
i2c_Stop();
ack=ack; //防止编译器警告
return data;
}
/*
* 函数名 Read_DS2782_Multi_Shadow_RAM
* 功能 获取DS2782多个寄存器
* 详见数据手册 P26页 Basic Transaction Formats 章节
*/
void Read_DS2782_Multi_Shadow_RAM(uint8_t reg_Addres,uint8_t Size,uint8_t * data)
{
uint8_t ack;
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_WR); //器件地址 | 写
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(reg_Addres); //寄存器地址
ack=i2c_WaitAck(); //等待应答
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_RD); //器件地址 | 读
ack=i2c_WaitAck(); //等待应答
for(int i=0;i<Size;i++)
{
data[i]=i2c_ReadByte(); //获取 字节
if(i<(Size-1)) i2c_Ack(); //应答
else i2c_NAck(); //非应答
}
i2c_Stop();
ack=ack; //防止编译器警告
}
/*
* 函数名 Write_DS2782_Shadow_RAM
* 功能 写DS2782影子寄存器
*/
void Write_DS2782_Shadow_RAM(uint8_t reg_Addres,uint8_t data)
{
uint8_t ack;
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_WR); //器件地址 | 写
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(reg_Addres); //寄存器地址
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(data); //写数据
ack=i2c_WaitAck(); //等待应答
i2c_Stop();
ack=ack; //防止编译器警告
}
/*
* 函数名 Copy_Data_For_Shadow_RAM_To_EEPROM
* 功能 将影子寄存器数据Copy至EEPROM
* 详见数据手册 P26页 Function Command Protocol 章节
*/
void Copy_Data_For_Shadow_RAM_To_EEPROM(uint8_t EEPROM_BLOCK)
{
uint8_t ack;
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_WR); //器件地址 | 写
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(FCR); //寄存器地址
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(EEPROM_BLOCK); //写数据
ack=i2c_WaitAck(); //等待应答
i2c_Stop();
ack=ack; //防止编译器警告
}
/*
* 函数名 Data_For_EEPROM_To_Shadow_RAM
* 功能 将EEPROM数据Recall至影子寄存器
* 详见数据手册 P26页 Function Command Protocol 章节
*/
void Recall_Data_For_EEPROM_To_Shadow_RAM(uint8_t EEPROM_BLOCK)
{
uint8_t ack;
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_WR); //器件地址 | 写
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(FCR); //寄存器地址
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(EEPROM_BLOCK); //写数据
ack=i2c_WaitAck(); //等待应答
i2c_Stop();
ack=ack; //防止编译器警告
}
/*
* 函数名 Get_DS2782_STATUS
* 功能 度状态寄存器
*/
uint8_t Get_DS2782_STATUS()
{
uint8_t ack,data;
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_WR); //器件地址 | 写
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(STATUS); //寄存器地址
ack=i2c_WaitAck(); //等待应答
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_RD); //器件地址 | 读
ack=i2c_WaitAck(); //等待应答
data=i2c_ReadByte(); //获取
i2c_NAck(); //非应答
i2c_Stop();
ack=ack; //防止编译器警告
return data;
}
/*
* 函数名 Get_DS2782_Temperature
* 红能 获取DS2782温度 放大十倍
*/
uint16_t Get_DS2782_Temperature()
{
uint8_t ack,data[2];
uint16_t Temperature=0;
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_WR); //器件地址 | 写
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(TEMPMSB); //寄存器地址
ack=i2c_WaitAck(); //等待应答
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_RD); //器件地址 | 读
ack=i2c_WaitAck(); //等待应答
data[0]=i2c_ReadByte(); //获取温度 高字节
i2c_Ack(); //应答
data[1]=i2c_ReadByte(); //获取温度 低字节
i2c_NAck(); //非应答
i2c_Stop();
ack=ack; //防止编译器警告
Temperature+=data[0]<<3;
Temperature+=data[1]>>5;
Temperature*=1.25; //放大十倍
return Temperature;
}
/*
* 函数名 Get_DS2782_Voltage
* 红能 获取DS2782电压
*/
uint16_t Get_DS2782_Voltage()
{
uint8_t ack,data[2];
uint16_t Voltage=0;
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_WR); //器件地址 | 写
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(VOLTMSB); //寄存器地址
ack=i2c_WaitAck(); //等待应答
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_RD); //器件地址 | 读
ack=i2c_WaitAck(); //等待应答
data[0]=i2c_ReadByte(); //获取电压 高字节
i2c_Ack(); //应答
data[1]=i2c_ReadByte(); //获取电压 低字节
i2c_NAck(); //非应答
i2c_Stop();
ack=ack; //防止编译器警告
Voltage+=data[0]<<3;
Voltage+=data[1]>>5;
Voltage*=4.88;
Voltage*=3;
return Voltage;
}
/*
* 函数名 Get_DS2782_Current
* 功能 获取DS2782电流
*/
int16_t Get_DS2782_Current()
{
uint8_t ack,data[2];
int16_t Current=0;
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_WR); //器件地址 | 写
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(CURRENTMSB); //寄存器地址
ack=i2c_WaitAck(); //等待应答
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_RD); //器件地址 | 读
ack=i2c_WaitAck(); //等待应答
data[0]=i2c_ReadByte(); //获取电压 高字节
i2c_Ack(); //应答
data[1]=i2c_ReadByte(); //获取电压 低字节
i2c_NAck(); //非应答
i2c_Stop();
ack=ack; //防止编译器警告
Current+=data[0]<<8;
Current+=data[1];
Current=(int)(Current*1.5625/RSNSP_mOhm); //mA
return Current;
}
/*
* 函数名 Get_DS2782_RAAC
* 功能 剩余绝对有效电量 (RAAC) [mAh]
*/
uint16_t Get_DS2782_RAAC()
{
uint8_t ack,data[2];
uint16_t Remaining_Capacity=0;
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_WR); //器件地址 | 写
ack=i2c_WaitAck(); //等待应答
i2c_SendByte(RAACMSB); //寄存器地址
ack=i2c_WaitAck(); //等待应答
i2c_Start();
i2c_SendByte(DS2782_8bit_Slave_Address|I2C_RD); //器件地址 | 读
ack=i2c_WaitAck(); //等待应答
data[0]=i2c_ReadByte(); //获取电压 高字节
i2c_Ack(); //应答
data[1]=i2c_ReadByte(); //获取电压 低字节
i2c_NAck(); //非应答
DS2782 美信电量计芯片 IIC STM32/STM8/51单片机 C代码
5星 · 超过95%的资源 需积分: 42 101 浏览量
2019-05-16
08:34:57
上传
评论 6
收藏 4KB ZIP 举报
baiyang80
- 粉丝: 17
- 资源: 3
最新资源
- 基于Pytorch复现Point-Transformer,用于ShapeNet数据集点云分割
- 【医学影像分析】2D超声图像的分割检测(Ultrasound Nerve Segmentation - Kaggle数据集)
- 嘎嘎香的五款神仙谷歌插件
- .arch书源导入教程.mp4
- 贪心算法介绍及代码示例讲解
- CR13SP35MSI64 Crystal 水晶报表运行组件最后版本64位
- 图像分类数据集:玉米叶是否感染分类数据集(2分类,包含训练集、验证集)
- 小U商城.zip
- 高光谱图像计算机视觉分类图像预处理工具集,包含去除图片无关背景,数据增强,生成标签文件等功能
- (顶刊复现)基于配电网韧性提升的应急移动电源预配置和动态调度(下)-MPS动态调度
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈