日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/3/24 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32F103CBT6单片机I2C接口读取锂电池电量计LC709203F数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、基本情況

? ? ? ?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数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人免费毛片足控 | 男人在线视频 | 天堂在线视频免费观看 | 黄色免费网站在线看 | 操操影视 | 中文字幕在线观看视频一区 | 18禁男女爽爽爽午夜网站免费 | 亚洲日本欧美精品 | 久久久久久久久久99 | 免费爱爱视频网站 | 天天搞夜夜 | 麻豆一区二区三区四区 | av天堂永久资源网 | 国产一级做a爰片在线看免费 | 韩国甜性涩爱 | 欧美精品在线观看视频 | 国产婷婷一区二区 | 亚洲狠 | 成人国产免费视频 | 久久精品国产免费 | 欧美三级午夜理伦三级老人 | 伊人久久在线 | 漂亮人妻被中出中文字幕 | 黄色美女片 | 五月天国产视频 | 狼人综合伊人 | 久久成人精品视频 | 91国内揄拍国内精品对白 | 91中文在线观看 | 香蕉一区二区三区四区 | 欧美一级性 | 亚洲精品成 | 国产精品麻豆一区二区 | 欧美特级a | 秋葵视频成人 | 亚洲一区| 亚洲精品一区二三区不卡 | 免费观看高清在线 | wwwxxx日韩 | 精品香蕉视频 | 亚洲国产999 | 尤物影院在线观看 | 18成人免费观看视频 | 少妇又色又紧又爽又刺激视频 | 潘金莲裸体一级淫片视频 | 免费暧暧视频 | 在线观看色网 | 四虎影视在线播放 | 无码精品视频一区二区三区 | 香蕉茄子视频 | 天天操女人 | 天天摸天天舔天天操 | 欧美一级淫片 | 欧美一区二区在线观看视频 | 在线国产一区 | 国产传媒视频 | av色区| 久久成人国产精品 | 国产精品网址 | 一本久久综合 | 欧美一级精品 | 国产精品爽 | 伊人久久中文字幕 | 性中文字幕 | 麻豆久久久午夜一区二区 | 日本在线免费播放 | 久久久久www | 美女av网站 | 人妻一区二区三区免费 | 99国产揄拍国产精品 | 日本一二三区在线视频 | 神马午夜电影一区二区三区在线观看 | 午夜av一区二区三区 | 日韩免费视频观看 | 少妇系列av | 性感美女被爆操 | 成人在线网站 | 淫辱的世界(调教sm)by | 欧美 亚洲 另类 偷偷 自拍 | 美女福利网站 | 亚洲精品中文字幕在线 | 精品99在线观看 | 亚洲视频一二三四 | 国产福利片在线观看 | 亚洲一区二区三区影视 | 视频在线免费观看 | 成人教育av | 欧美中文字幕第一页 | 射射综合网 | 国产ts丝袜人妖系列视频 | 亚洲一区欧美二区 | 女女同性女同一区二区三区按摩 | av在线观看地址 | 视频在线中文字幕 | 日本人dh亚洲人ⅹxx | 国产91综合| 神马午夜在线 | 屁屁影院国产第一页 | 精品亚洲aⅴ无码一区二区三区 |