一、基本情况

LC709203F是一款适用于单节锂离子/聚合物电池应用的电量计,通过HG-CVR算法来测量电池的RSOC(相对电荷状态)。精确的RSOC数据有助于改善便携式设备的运行时间和合理使用。利用单片机的I2C口与LC709203F通讯,实现对其电池温度、电池电压、电池剩余电量(RSOC)等锂电池重要数据的采集。单片机管脚PB10(I2C2_SCL)连接LC709203F的第8脚SCL,单片机管脚PB11(I2C2_SDA))连接LC709203F的第7脚SDA。

二、LC709203F的I2C通讯协议

三、程序

lc709203f.c中程序:

1)初始化函数:void lc709203f_Init(void)

#include "lc709203f.h"
#include "delay.h"                 //初始化IIC接口
void lc709203f_Init(void)
{u16 Buffer_data0=0x0001;//设置电源模式u16 Buffer_data1=0x0010;//设置适合您电池的APA参数u16 Buffer_data2=0x0001;//设置适合您电池的配置文件u16 Buffer_data3=0xAA55;//初始化RSOCu16 Buffer_data4=0x0001;//设置热敏电阻模式IIC2_Init();//IIC初始化lc709203f_WriteOneWord(LC709203F_IC_Power_Mode,Buffer_data0);lc709203f_WriteOneWord(LC709203F_Adjustment_Pack_Appli,Buffer_data1);lc709203f_WriteOneWord(LC709203F_Change_Parameter,Buffer_data2);lc709203f_WriteOneWord(LC709203F_Initial_RSOC,Buffer_data3);lc709203f_WriteOneWord(LC709203F_Status_Bit,Buffer_data4);}

2)读一个字函数:u16 lc709203f_ReadOneWord(u8 ReadAddr),严格按照上述协议中的时许写代码

u16 lc709203f_ReadOneWord(u8 ReadAddr)
{                 u16 data=0;  u8 data_l=0;   u8 data_h=0;u8 crc_8=0;u8 readcrc[5];IIC2_Start();                              //第一步:第一次启动delay_us(100);IIC2_Send_Byte(LC709203F_ADDR_wr); //第二步:写入从机地址和写入指令delay_us(100);IIC2_Wait_Ack();                           //第三步:等待从机确认delay_us(100);IIC2_Send_Byte(ReadAddr);                  //第四步:发送寄存器地址(字节最高位为虚拟位)delay_us(100);IIC2_Wait_Ack();                             //第五步:等待从机确认delay_us(100);IIC2_Start();                              //第六步:第二次启动 delay_us(100);IIC2_Send_Byte(LC709203F_ADDR_rd); //第七步:写入从机地址和读取指令  delay_us(100);  IIC2_Wait_Ack();                              //第八步:等待从机确认delay_us(100);data_l=IIC2_Read_Byte(1);                     //第九步:接收低字节数据delay_us(100);//IIC2_Ack();                                   //产生应答1data_h=IIC2_Read_Byte(1);                     //第十步:接收高字节数据delay_us(100);//IIC2_Ack();                                   //产生应答2crc_8=IIC2_Read_Byte(0);                      //第十一步:接收CRC-8数据delay_us(100);//IIC2_NAck();                                  //不产生应答IIC2_Stop();                                //第十二步:停止readcrc[0]=LC709203F_ADDR_wr;readcrc[1]=ReadAddr;readcrc[2]=LC709203F_ADDR_rd;readcrc[3]=data_l;readcrc[4]=data_h;if(gh_crc8(readcrc,5)==crc_8)data=data_h*256+data_l;return data;
}

3)写一个字函数:void lc709203f_WriteOneWord(u8 WriteAddr,u16 DataToWrite)

void lc709203f_WriteOneWord(u8 WriteAddr,u16 DataToWrite)
{                                                                                                  u8 data[4];IIC2_Start();                              //第一步:启动IIC2_Send_Byte(LC709203F_ADDR_wr); //第二步:写入从机地址和写入指令IIC2_Wait_Ack();                              //第三步:等待从机确认IIC2_Send_Byte(WriteAddr);                 //第四步:发送寄存器地址(字节最高位为虚拟位)IIC2_Wait_Ack();                            //第五步:等待从机确认                                 IIC2_Send_Byte((u8)(DataToWrite&0x00FF));               //第六步:发送低字节数据                               IIC2_Wait_Ack();                            //第七步:等待从机确认IIC2_Send_Byte((u8)(DataToWrite>>8));      //第八步:发送高字节数据    IIC2_Wait_Ack();                            //第九步:等待从机确认data[0]=LC709203F_ADDR_wr;data[1]=WriteAddr;data[2]=(u8)(DataToWrite&0x00FF);data[3]=(u8)(DataToWrite>>8);IIC2_Send_Byte(gh_crc8(data,4));      //第十步:发送CRC-8数据    IIC2_Wait_Ack();                            //第十一步:等待从机确认IIC2_Stop();                               //第十二步:停止delay_ms(10);
}

4)获取数据函数:void getLC709203FOutput(s16* LC709203FData)

void getLC709203FOutput(s16* LC709203FData)
{u16 data0,data1,data2;data0=lc709203f_ReadOneWord(LC709203F_Cell_Temperature);//电池温度data1=lc709203f_ReadOneWord(LC709203F_RSOC);//电池剩余电量data2=lc709203f_ReadOneWord(LC709203F_Cell_Voltage); //电池电压if((data0>=0x0AAC)&&(data0<=0x7FFF)) //读取的数据处理LC709203FData[0]=data0-0x0AAC;if(data1<=0x0064)LC709203FData[1]=data1;if((data2<=0x0FA0)&&(data2>=0x07D0))LC709203FData[2]=data2;
}

四、调试中遇到的问题处理总结

1、起初,未严格按照协议,读取到的数据均是0XABAB等,以为是I2C读写函数信号延时函数设置不合适的问题,后来多次测试还是不行,再后来仔细阅读协议,发现此协议还需要CRC8校验,比其他一些芯片的I2C通讯协议要复杂,于是按照通讯协议写lc709203f_ReadOneWord()和lc709203f_WriteOneWord()函数;

2、之后下载程序运行,仍然读不到正确数据,检查程序,发现lc709203f_ReadOneWord()中第九步、第十步、第十一步都是IIC2_Read_Byte(1),函数的形参都为1,而该函数1表示为产生应答ACK,0为不产生应答NACK,根据I2C通讯协议,应该为上面程序所写的,不产生应答的改为IIC2_Read_Byte(0),并且此函数里面已经有ACK和NACK函数,如上述程序所写的需要注释掉产生应答1、产生应答2和不产生应答。

IIC2_Read_Byte()如下:

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC2_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA2_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC2_SCL=0; delay_us(4);                   //LC709203F时钟频率400Khz=2.5usIIC2_SCL=1;receive<<=1;  //receive=receive<<1;if(READ2_SDA)receive++;   // 根据READ_SDA的值(SDA),从高到低顺序依次写入一个字节,delay_us(4);             //i=0时,SDA=1则receive=0B00000001,i=1,SDA=1则receive=0B00000011}                     if (!ack)IIC2_NAck();//发送nACKelseIIC2_Ack(); //发送ACK   return receive;
}

3、修改上述后,下载程序运行仍然读不到正确数据,但是通过单步调试都能正确读到数据,原因在哪里呢?单步调试发现写的数据均已写入进去了,于是在读字节函数lc709203f_ReadOneWord()中,在每一步之间增加delay_us(100);//延时100us,此时运行,都能正确读到数据。

STM32F103CBT6单片机I2C接口读取锂电池电量计LC709203F数据相关推荐

  1. STM32F103ZE单片机FSMC接口读取NAND Flash芯片K9F1G08U0E的数据时出现数据丢失的解决办法

    [问题] STM32单片机使用FSMC读取K9F1G08U0E NAND Flash时,出现部分字节丢失的情况.例如:Flash存储器中存储有连续的0xff字节,则在进行连续读(Page Read)操 ...

  2. I2C接口读取MPU9250磁力数值

    一开始拿到芯片手册云里雾里,根本没有找到关于磁力数据的寄存器,结果上网一查才知道,这芯片竟然是个胶水芯片... MPU9250内部是MPU6050和AK8963两个芯片合并在一起的,感觉傻傻的. 内部 ...

  3. 【龙芯1c库】封装模拟I2C接口和使用示例

    龙芯1c库是把龙芯1c的常用外设的常用功能封装为一个库,类似于STM32库.Git地址:https://gitee.com/caogos/OpenLoongsonLib1c I2C接口是常用的接口之一 ...

  4. CH341的I2C接口编程说明

    CH341的I2C接口特性: 1.支持I2C速度20K/100K/400K/750K: 2.默认不支持设备的ACK应答监测,即忽略ACK状态:强制支持需修改软件: 引脚序号 功能说明 24 SCL 2 ...

  5. STM32单片机硬件I2C读取AHT10温湿度传感器数据

    STM32使用硬件IIC读取AHT10温湿度传感器的数据并显示在0.96寸OLED屏上. 我用的单片机是STM32F103C8T6,程序用的是ST标准库写的. STM32使用硬件I2C读取SHTC3温 ...

  6. TI | TM4C123Gx单片机之---I2C接口笔记

    一.I2C接口的介绍: 内部集成电路(I2C)总线通过一个两线设计(串行数据线 SDA 和串行时钟线 SCL)来提供双向数据传输,并且与外部 I2C 器件诸如串行存储器(RAM 和 ROM),网络设备 ...

  7. i2c hid 触摸板不能用_I2C 总线协议初探 - STM32 I2C 接口外设学习笔记

    I2C(Inter-Integrated Circuit)总线是由 PHILIPS(飞利浦) 公司开发的两线式串行总线,用于连接微控制器及其外围设备.是微电子通信控制领域广泛采用的一种总线标准.它是同 ...

  8. stm32 iic接口 进入busy_STM32通过IIC接口读取JY61模块MPU6050陀螺仪芯片数据核心程序...

    1 简述 最近,想学角度融合算法在网上买一个JY61的模块.他们家的模块用起来还不错.模块分为串口通讯和IIC通讯的.串口读取数据他们家有例程,我就不说了.想分享给大家这个模块的IIC是怎么去读取MP ...

  9. EEPROM的操作---SPI接口和I2C接口

    参考:http://blog.csdn.net/yuanlulu/article/details/6163106 ROM最初不能编程,出厂什么内容就永远什么内容,不灵活.后来出现了PROM,可以自己写 ...

最新文章

  1. jupyter 多个python版本
  2. 1.1 基本图像导入、处理和导出
  3. 20220312 矩阵许瓦茨不等式
  4. c语言构造数据类型有,《c语言程序设计基础7构造数据类型.ppt
  5. 日语等级考试测试网站
  6. 【转】一劳永获的解决textbox 只能输入数字、汉字、字母等问题
  7. 磁盘碎片整理工具:Diskeeper 2010简体中文专业豪华版+有效激活
  8. Android热修复技术初探(三):动态加载外部资源
  9. FastFel解析一个公式的步骤
  10. oracle相同sql执行计划不同,相同的SQL 在正式和测试环境中执行计划的不同
  11. C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)
  12. WINDOWS系统下四叶草CLOVER引导U盘制作
  13. 学生信息管理系统需求规格说明书
  14. android音频系统分析,详细分析智能手机Android系统硬件音频架构_ Android手机_Android手机开发_Android_课课家...
  15. 联想win10安全模式进入以及退出
  16. DDR3的配置及仿真教程
  17. 系统传输过程中 中文点 · 对方无法解析的问题查找
  18. linux如何查找下一个
  19. 3dMax模型导入SuperMap
  20. 算法导论第八章思考题

热门文章

  1. 在.net Core 使用PDF模板文件生成PDF文件,代替WEB打印控件!
  2. 【2022-09-14】米哈游秋招笔试三道编程题
  3. 50道Python面试题集锦【附答案】
  4. 微信打飞机升级版(Qt实现)
  5. 诺基亚或将成为中国手机的威胁
  6. Vue使用speak-tts插件实现后台管理系统语音播报功能
  7. 赣南师大计算机科学学院,徐会林 - 赣南师范大学 - 数学与计算机科学学院
  8. 计算每月员工住宿的天数
  9. 机器人程序用c 语言编写,RobotC与机器人程序设计
  10. android web连接问题,Android WebView或手机浏览器打开连接问题解决办法总结