找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3143|回复: 0
收起左侧

ti的电量计bq27750芯片.C .H与程序文件

[复制链接]
ID:789199 发表于 2020-6-25 00:45 | 显示全部楼层 |阅读模式
bq27750 电量计芯片,适用于手持仪器的电量管理,本次上传的为本人初步使用,供学习参考,包括有TI的说明书;以压缩文件:BQ2750.RAR

单片机源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. //#include "bq27200.h"
  3. #include "bq27750/bq27750.h"
  4. #include "globalmvf.h"



  5. // control register params
  6. #define BQ27200_SOFT_FRSET                   0x42   //全复位
  7. #define BQ27200_SOFT_PRSET                   0x48   //部分复位

  8. #define BQ27750_RS                             20   // Resistor sense mOhm

  9. // Register

  10. #define BQ27750_REG_CTRL_L   0X00   //控制寄存器
  11. #define BQ27750_REG_CTRL_H   0X01

  12. #define        BQ27750_REG_TEMP_L  0x06   //温度寄存器
  13. #define        BQ27750_REG_TEMP_H  0x07

  14. #define        BQ27750_REG_VOLT_L  0x08   //电压寄存器
  15. #define        BQ27750_REG_VOLT_H  0x09

  16. #define        BQ27750_REG_FLAGS_L  0x0A  //电池状态寄存器
  17. #define        BQ27750_REG_FLAGS_H  0x0B

  18.          #define BATTERY_FLAGS_CHARGING     0X00   //正充电
  19.          #define BATTERY_FLAGS_DISCHARGING  0X40   //正放电
  20.                                                          
  21. #define        BQ27750_REG_INSTCURR_L  0x0C   //SENSOR电阻上瞬时电流 1秒刷新一次
  22. #define        BQ27750_REG_INSTCURR_H  0x0D

  23. #define        BQ27750_REG_AI_L    0x14   //平均电流寄存器
  24. #define        BQ27750_REG_AI_H    0x15

  25. #define        BQ27750_REG_RM_L    0x10 //预测的剩余容量
  26. #define        BQ27750_REG_RM_H    0x11

  27. #define        BQ27750_REG_FCC_L    0x12 //预设的满充容量
  28. #define        BQ27750_REG_FCC_H    0x13

  29. #define        BQ27750_REG_INT_TEMP_L  0x28   //内部温度  0.1K为单位
  30. #define        BQ27750_REG_INT_TEMP_H  0x29

  31. #define        BQ27750_REG_CCOUNT_L    0x2A   //放电次数
  32. #define        BQ27750_REG_CCOUNT_H    0x2B

  33. #define        BQ27750_REG_SOC_L    0x2C   //充电百分比
  34. #define        BQ27750_REG_SOC_H    0x2D

  35. #define        BQ27750_REG_SOH_L    0x2E   //设计容量的百分比作为电池健康状况
  36. #define        BQ27750_REG_SOH_H    0x2F

  37. #define        BQ27750_REG_CV_L    0x30   //将充电电压
  38. #define        BQ27750_REG_CV_H    0x31

  39. #define        BQ27750_REG_CC_L    0x32   //将充电电流
  40. #define        BQ27750_REG_CC_H    0x33

  41. #define        BQ27750_REG_DC_L    0x3C   //设计容量
  42. #define        BQ27750_REG_DC_H    0x3D

  43. #define        BQ27750_REG_MAC_L          0x3E   //制造商数据访问指令
  44. #define        BQ27750_REG_MAC_H          0x3F
  45. #define        BQ27750_REG_MAC_DATA_L     0x40   //制造商数据
  46. #define        BQ27750_REG_MAC_DATA_H     0x5F
  47. #define        BQ27750_REG_MAC_DATA_SUM_L 0x60   //制造商数据校验和
  48. #define        BQ27750_REG_MAC_DATA_LEN_H 0x61   //制造商数据长度


  49. //====设置设计参数  FLASH数据--------------------------------------------------------------------------------
  50. #define   DA_CONFIG_VALUE           0X10  //1串电池  睡眠使                默认值 0X11  2串电池  睡眠使   
  51. #define   DESIGN_CAPACITY_MAH_VALUE 2000  //MAH 设计容量MAH                默认值 5300MAH
  52. #define   DESIGN_CAPACITY_CWH_VALUE 770   //CWH 设计容量CWH                默认值 2040CWH
  53. #define   DESIGN_VOLTAGE_VALUE      4100  //MV  设计电压MV                 默认值 3850MV
  54. //#define DEVICE_CHEMISTRY            //按默认的锂电  LION                 默认值 锂电  LION   
  55. #define   COV_VALUE             4300  //过高电压值                         默认值 4300MA  
  56. #define   CUV_VALUE             2500  //过低电压值                         默认值 2500MA
  57. #define   SHUTDOWN_VALUE        2300  //关断电压值                         默认值 2300MA
  58. #define   OCC_VALUE             2000  //最大流电电流值                     默认值 5000MA
  59. #define   OCD_VALUE             1500  //最大放电流值                       默认值 5000MA
  60. #define   ASCC_VALUE            0X77  //100MA 5秒   //瞬时短路充电电流值   默认值   0X77  //100MA 5秒
  61. #define   ASCD_VALUE            0X77  //100MA 5秒   //瞬时短路放电电流值   默认值   0X77  //100MA 5秒
  62. #define   SOV_VALUE             4500  // 电池永久损坏值                    默认值  4500MA
  63. #define   TEMP_SENSOR_SELECT    0X01  //内外温度传感器选择   选择内部的    默认值  0x03  内外两个
  64. #define   UTC_VALUE             0    //充电温度值  0度   默认值 0
  65. #define   UTD_VALUE             0    //放电温度值  0度   默认值 0
  66. //#define   BCAST                    //没有找到

  67. //====设置设计参数  FLASH地址--------------------------------------------------------------------------------
  68. #define   ADDR_DA_CONFIG_VALUE           0X45E2  // 默认值 0X45E2=0X18

  69. #define   ADDR_DESIGN_CAPACITY_MAH_VALUE 0X4563  // 默认值 0X4563 =5300MAH      现设计为2000MAH
  70. #define   ADDR_DESIGN_CAPACITY_CWH_VALUE 0X4565  // 默认值 0X4565 =2040CWH      现设计为770CWH
  71. #define   ADDR_DESIGN_VOLTAGE_VALUE      0X4567  // 默认值 0X4567 =3850MV       现设计为4100MV

  72. #define   ADDR_DEVICE_CHEMISTRY          0X4095  //默认值 锂电  LION   
  73. #define   ADDR_COV_VALUE                 0X4602  //默认值 4300MA                现设计为4300MV  //过高电压值  
  74. #define   ADDR_CUV_VALUE                 0X45FB  //默认值 2500MA                现设计为2500MV  //过低电压值                        
  75. #define   ADDR_SHUTDOWN_VALUE            0X4547  //默认值 2300MA                现设计为2300MV  //关断电压值                        
  76. #define   ADDR_OCC_VALUE                 0X4611  //默认值 9000MA                现设计为2000    //最大流电电流值      
  77. #define   ADDR_OCD_VALUE                 0X4617  //默认值 6000MA                现设计为1500    //最大放电流值         
  78. #define   ADDR_ASCC_VALUE                0X46E7  //默认值   0X77  //100MA 0.4MS 现设计为 0X77  //100MA   0.4MS //瞬时短路充电电流值   
  79. #define   ADDR_ASCD_VALUE                0X45E8  //0X77  //100MA 0.4MS   //瞬时短路放电电流值   默认值   0X77  //100MA 0.4MS
  80. #define   ADDR_SOV_VALUE                 0X4648  //默认值  4500MA               现设计为 4500  // 电池永久损坏值                  

  81. #define   ADDR_TEMP_SENSOR_SELECT       0X45E1   // 0X01  //内外温度传感器选择   选择内部的    默认值  0x03  内外两个

  82. #define   ADDR_UTC_VALUE             0X462A    // 默认值 0                      现设计为 0    //充电温度值  0度   
  83. #define   ADDR_UTD_VALUE             0X462F    // 默认值 0   放电温度值  0度    现设计为  0
  84. //#define   BCAST                    //没有找到

  85. //#define SlaveAddress_read   0xAB    //1   27200
  86. //#define SlaveAddress_write  0xAA    //0
  87. #define SlaveAddress_write 0xAa       //   BIT0=1    27750
  88. #define SlaveAddress_read  0xAb   //   BIT0=0


  89. static void SDA_OUT(void);  //PC2   
  90. static void SDA_IN(void);   //PC3   
  91. static void BQ_I2C_DELAY_x100ns(u8 x100ns_data);
  92. static void BQ_I2C_DELAY(void);
  93. static u8 BQ_I2C_START(void);
  94. static void BQ_I2C_STOP(void);
  95. static void BQ_I2C_Ack(void);
  96. static void BQ_I2C_NoAck(void);
  97. static u8 BQ_I2C_WaitAck(void);  //返回=1有ACK,=0无ACK
  98. static void BQ_I2C_SendByte(u8 SendByte); //数据从高位到低位
  99. //static u8 BQ_I2C_ReceiveByte(void); //数据从高位到低位
  100. static u8  BQ_I2C_ReceiveByte(unsigned char ack);


  101. //################################### IO口模拟法##############################################
  102. extern void BQ27750_IO_I2C_Configuration(void)
  103. {
  104.                 GPIO_InitTypeDef GPIO_InitStructure;

  105.                 //PC3----SCL   
  106.                 //PC2----SDA
  107.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);

  108.                 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2|GPIO_Pin_3;  
  109.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//最高输出速度50M
  110.                 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD; //GPIO_Mode_Out_PP;////GPIO_Mode_Out_PP;  //GPIO_Mode_AF_OD;  // GPIO_Mode_Out_PP; //输出  GPIO_Mode_IPU    GPIO_Mode_Out_OD)
  111.                 GPIO_Init(GPIOC, &GPIO_InitStructure);         

  112.                 BQ_SDA_H;     //总线初始
  113.                 BQ_SCL_H;        
  114. }


  115. static void write_BQ_Delay(uint16_t X10MS)
  116. {
  117.                 TIM3_X10MS(X10MS);   //主程序运行前延时2秒
  118.                 while(timer3_X10ms>0);  
  119.                 TIM_Cmd(TIM3, DISABLE);
  120. }


  121.         
  122. //IO方向设置
  123. static void SDA_IN(void)   //PC2   
  124. {
  125.         
  126.         //1.FUNCTION MODE:
  127.   GPIO_InitTypeDef GPIO_InitStructure;               

  128.          RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);
  129.          GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2;
  130.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  131.          GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU; // GPIO_Mode_Out_OD; //开漏    GPIO_Mode_IPU; //上拉输入
  132.          GPIO_Init(GPIOC, &GPIO_InitStructure);


  133.   //2.REGISTER MODE:
  134.          //RCC->APB2ENR |= 0x00000010; //C口时钟开启
  135. //         GPIOC->CRL&=0XFFFFF0FF;     //取PC2 IN
  136. //         GPIOC->CRL|=0X00000800;
  137.         
  138. }


  139. static void SDA_OUT(void)  //PC2   
  140. {
  141.         //1.FUNCTION MODE:        
  142.          GPIO_InitTypeDef GPIO_InitStructure;
  143.         
  144.          RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC , ENABLE);
  145.          GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2;
  146.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//最高输出速度50M
  147.          GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_OD; //开漏 GPIO_Mode_Out_PP; //输出
  148.          GPIO_Init(GPIOC, &GPIO_InitStructure);        

  149.          //2.REGISTER MODE:
  150.          //RCC->APB2ENR |= 0x00000010; //C口时钟开启
  151. //         GPIOC->CRL&=0XFFFFF0FF;     //取PC2 OUT
  152. //         GPIOC->CRL|=0X00000300;             //  3/7
  153.         
  154. }

  155. //extern void BQ27200_Write_Design_Capacity(u16 capacity_xmah)
  156. //{
  157. //u8 set_CapPercent=1;
  158. //u8 val_l=0,val_h=0;
  159. //u16  val_76=0,set_capacity=0;
  160. //float val=0;
  161. //        
  162. //set_CapPercent=1;   //100%

  163. ////高字节值:(Design_Capacity*R)/(256*3.57) :  Design_Capacity=2000mah   R=20毫欧     (2000*20)/(256*3.57)=43;
  164. ////低字节值:0X00
  165. //        
  166. //set_capacity=capacity_xmah;        
  167. //val=set_capacity*BQ27200_RS;
  168. //val=(val/256)/3.57;


  169. //val=val*256;        
  170. //val_76=((int)val+0)*set_CapPercent;  
  171. //        
  172. //val_l=val_76/256;  //高字节
  173. //val_h=val_76%256;  //低字节
  174. //        
  175. //        
  176. //BQ_I2C_WriteByte(val_l, SlaveAddress_write,         BQ27200_REG_AR_L);        
  177. //write_BQ_Delay(1);        //10MS
  178. //        

  179. //BQ_I2C_WriteByte(val_h, SlaveAddress_write,         BQ27200_REG_AR_H);        
  180. //write_BQ_Delay(1);        //10MS        


  181. //BQ_I2C_WriteByte(0X20, SlaveAddress_write,         BQ27200_REG_MODE);        //WRTNAC=1
  182. //write_BQ_Delay(1);        //10MS


  183. //BQ_I2C_WriteByte(0Xa9, SlaveAddress_write,         BQ27200_REG_CTRL);        //
  184. //write_BQ_Delay(1);        //10MS

  185. //BQ_I2C_WriteByte(0X40, SlaveAddress_write,         BQ27200_REG_MODE);        //WRTNAC=1
  186. //write_BQ_Delay(1);        //10MS        

  187. //}


  188. extern void BQ27750_Write_SETTING_DESIGN_PARAMETERS(void)
  189. {
  190.       //BQ_I2C_WriteByte(0x0012, 0XAA,         0X3E);        
  191.       //BQ_I2C_WriteByte(0X00, 0XAA, 0X00);    BQ_I2C_WriteByte(0X22, 0XAA, 0X01);
  192.    
  193.                 BQ_I2C_WriteByte_toflash(DA_CONFIG_VALUE , SlaveAddress_write, ADDR_DA_CONFIG_VALUE);
  194.                 BQ_I2C_WriteByte_toflash(DESIGN_CAPACITY_MAH_VALUE , SlaveAddress_write, ADDR_DESIGN_CAPACITY_MAH_VALUE);
  195.                 BQ_I2C_WriteByte_toflash(DESIGN_VOLTAGE_VALUE, SlaveAddress_write, ADDR_DESIGN_VOLTAGE_VALUE);        
  196.                 BQ_I2C_WriteByte_toflash(COV_VALUE , SlaveAddress_write, ADDR_COV_VALUE);        

  197.                 BQ_I2C_WriteByte_toflash(CUV_VALUE , SlaveAddress_write, ADDR_CUV_VALUE);        
  198.                 BQ_I2C_WriteByte_toflash(SHUTDOWN_VALUE , SlaveAddress_write, ADDR_SHUTDOWN_VALUE);                        
  199.                 BQ_I2C_WriteByte_toflash(OCC_VALUE , SlaveAddress_write, ADDR_OCC_VALUE);
  200.                 BQ_I2C_WriteByte_toflash(OCD_VALUE , SlaveAddress_write, ADDR_OCD_VALUE );

  201.                 BQ_I2C_WriteByte_toflash(ASCC_VALUE , SlaveAddress_write, ADDR_ASCC_VALUE );
  202.                 BQ_I2C_WriteByte_toflash(ASCD_VALUE  , SlaveAddress_write, ADDR_ASCD_VALUE );        
  203.                 BQ_I2C_WriteByte_toflash(SOV_VALUE , SlaveAddress_write, ADDR_SOV_VALUE);        
  204.                 BQ_I2C_WriteByte_toflash(TEMP_SENSOR_SELECT, SlaveAddress_write, ADDR_TEMP_SENSOR_SELECT);        

  205.                 BQ_I2C_WriteByte_toflash(UTC_VALUE , SlaveAddress_write, ADDR_UTC_VALUE);        

  206.                 BQ_I2C_WriteByte_toflash(UTD_VALUE, SlaveAddress_write, ADDR_UTD_VALUE);        
  207. //                        
  208. }

  209. extern void BQ27200_Write_Design_Capacity(u16 capacity_xmah)
  210. {
  211.         
  212. u8 set_CapPercent=1;
  213. u8 val_l=0,val_h=0;
  214. u16  val_76=0,set_capacity=0;
  215. float val=0;
  216.         
  217. set_CapPercent=1;   //100%

  218. //高字节值:(Design_Capacity*R)/(256*3.57) :  Design_Capacity=2000mah   R=20毫欧     (2000*20)/(256*3.57)=43;
  219. //低字节值:0X00
  220.         
  221. set_capacity=capacity_xmah;        
  222. val=set_capacity*BQ27750_RS;
  223. val=(val/256)/3.57;


  224. val=val*256;        
  225. val_76=((int)val+0)*set_CapPercent;  
  226.         
  227. val_l=val_76/256;  //高字节
  228. val_h=val_76%256;  //低字节
  229.         
  230.         
  231. BQ_I2C_WriteByte(0x2b, SlaveAddress_write,         0X76);         //ILMD:   (2000*20)/(256*3.57)=43=0x2b
  232. write_BQ_Delay(1);        //10MS        


  233. BQ_I2C_WriteByte(0x77, SlaveAddress_write,         0X77);         //SEVF:   (3000/8)-256=119=0X77
  234. write_BQ_Delay(1);        //10MS        


  235. BQ_I2C_WriteByte(0xA2, SlaveAddress_write,         0X78);         //SEV1:   (3350/8)-256=162=0XA2
  236. write_BQ_Delay(1);        //10MS        


  237. BQ_I2C_WriteByte(0x0E, SlaveAddress_write,         0X79);         //ISLC:   (50*20)/7.14=14=0X0E
  238. write_BQ_Delay(1);        //10MS


  239. BQ_I2C_WriteByte(0x58, SlaveAddress_write,         0X7A);         //DMFSD:   
  240. write_BQ_Delay(1);        //10MS


  241. BQ_I2C_WriteByte(0x88, SlaveAddress_write,         0X7B);         //TAPER:  (100*20)/228 =8    ,BIT7=1
  242. write_BQ_Delay(1);        //10MS


  243. BQ_I2C_WriteByte(0x70, SlaveAddress_write,         0X7C);         //PKCXFG:  GPIO禁止外用  4.112V    -9.8UV   固定补偿   
  244. write_BQ_Delay(1);        //10MS


  245. BQ_I2C_WriteByte(0X16, SlaveAddress_write,         0x7D);        //IMLC: (500*20)/457=22=0x16
  246. write_BQ_Delay(1);        //10MS


  247. BQ_I2C_WriteByte(0X42, SlaveAddress_write,         0x7e);        //DCOMP:
  248. write_BQ_Delay(1);        //10MS

  249. BQ_I2C_WriteByte(0X7C, SlaveAddress_write,         0x7F);        //TCOMP:
  250. write_BQ_Delay(1);        //10MS


  251. //BQ_I2C_WriteByte(0X20, SlaveAddress_write,         BQ27200_REG_MODE);        //WRTNAC=1
  252. //write_BQ_Delay(1);        //10MS


  253. //BQ_I2C_WriteByte(0Xa9, SlaveAddress_write,         BQ27200_REG_CTRL);        //
  254. //write_BQ_Delay(1);        //10MS

  255. //BQ_I2C_WriteByte(0X40, SlaveAddress_write,         BQ27200_REG_MODE);        //WRTNAC=1
  256. //write_BQ_Delay(1);        //10MS        
  257. }





  258. extern void BQ27750_Write_Design_Capacity(u16 capacity_xmah)
  259. {
  260.         
  261. u8 set_CapPercent=1;
  262. u8 val_l=0,val_h=0;
  263. u16  val_76=0,set_capacity=0;
  264. float val=0;
  265.         
  266. set_CapPercent=1;   //100%

  267. //高字节值:(Design_Capacity*R)/(256*3.57) :  Design_Capacity=2000mah   R=20毫欧     (2000*20)/(256*3.57)=43;
  268. //低字节值:0X00
  269.         
  270. set_capacity=capacity_xmah;        
  271. val=set_capacity*BQ27750_RS;
  272. val=(val/256)/3.57;


  273. val=val*256;        
  274. val_76=((int)val+0)*set_CapPercent;  
  275.         
  276. val_l=val_76/256;  //高字节
  277. val_h=val_76%256;  //低字节



  278. }


  279. static void BQ_I2C_DELAY_x100ns(u8 x100ns_data)
  280. {        
  281.         u16 i=1;   //    //实验调到0.2US左右
  282.         u8 h=0;
  283.         
  284.         for(h=0;h<x100ns_data;h++)
  285.                 {
  286.                                 for(;i>0;i--) ;
  287.                 }
  288. }


  289. static void BQ_I2C_DELAY(void)
  290. {        
  291.         u16 i=800;   //800--1     //实验调到5-6US左右
  292.         //u16 i=4;
  293.         while(i) i--;        
  294. }

  295. static void BQ_I2C_DELAY1(void)
  296. {        
  297.         u16 i=400;   //400--1     //实验调到5-6US左右
  298.         //u16 i=4;
  299.         while(i) i--;        
  300. }


  301. static void BQ_I2C_DELAY2(void)
  302. {        
  303.         u16 i=200;   //200--1     //实验调到5-6US左右
  304.         //u16 i=4;
  305.         while(i) i--;        
  306. }
  307. static x_sft(u8 shift_cnt)
  308. {
  309.          u8 kk=2;
  310.          for(;shift_cnt>0;shift_cnt--) {kk=kk<<1;}
  311. }


  312. static u8 BQ_I2C_START(void)
  313. {
  314.         
  315.           SDA_OUT();  //SDA输出
  316.         
  317.                 BQ_SDA_H;        //释放SDA总线
  318.                 BQ_I2C_DELAY();
  319.                 BQ_SCL_H;                        
  320.                 BQ_I2C_DELAY();
  321.         
  322.                 //if(!BQ_SDA_READ) return 0;  //SDA线低电平则总线忙  退出
  323.                         
  324.                 BQ_SDA_L;                   //开始信号
  325.                 BQ_I2C_DELAY();           
  326.         
  327.                 //if(BQ_SDA_READ) return 0;  //SDA线高电平则总线出错  退出        

  328.                 BQ_SCL_L;                        
  329.                 BQ_I2C_DELAY();
  330.                  
  331.                 return 1;                        
  332. }


  333. static void BQ_I2C_STOP(void)
  334. {        
  335.     SDA_OUT();  //SDA输出
  336.                 BQ_SDA_L;
  337.           BQ_I2C_DELAY();

  338.                 BQ_SCL_H;
  339.                 BQ_I2C_DELAY();
  340.         
  341.                 BQ_SDA_H;          //停止信号
  342.         BQ_I2C_DELAY();
  343.         BQ_I2C_DELAY();
  344. }



  345. static void BQ_I2C_Ack(void)
  346. {
  347.         
  348.            SDA_OUT();  //SDA输出
  349.                  BQ_SCL_L;
  350.                 BQ_I2C_DELAY();
  351.                         
  352.                  BQ_SDA_L;
  353.                 BQ_I2C_DELAY();
  354.                         
  355.                  BQ_SCL_H;
  356.                  BQ_I2C_DELAY();
  357.                         
  358.                  BQ_SCL_L;
  359.            BQ_I2C_DELAY();


  360. }



  361. static void BQ_I2C_NoAck(void)
  362. {
  363.            u8 ft=2;
  364.         
  365.                  //BQ_SCL_L;  //应答脉冲形成前置0
  366.            //x_sft(2);                  
  367.            //SDA_OUT();  //SDA输出
  368.         
  369.                  BQ_SCL_L;
  370.                  BQ_I2C_DELAY();
  371.                         
  372.                  BQ_SDA_H;
  373.                  BQ_I2C_DELAY();
  374.                         
  375.                  BQ_SCL_H;
  376.                  BQ_I2C_DELAY();
  377.                         
  378.                  BQ_SCL_L;
  379.                  BQ_I2C_DELAY();
  380. }

  381. static u8 BQ_I2C_WaitAck(void)  //返回=1有ACK,=0无ACK
  382. {
  383.         u8 ft=2;
  384.         u8 ucErrTime=0;
  385.    
  386.            SDA_IN();    //SDA设置为输入  
  387.         
  388.                  BQ_SDA_H;   
  389.                  BQ_I2C_DELAY();
  390.                         
  391.                  BQ_SCL_H;
  392.                  BQ_I2C_DELAY();
  393.         

  394.                
  395.                  while(BQ_SDA_READ)   //检测应答的数据
  396.                                  {
  397.                                                 ucErrTime++;
  398.                                                 if(ucErrTime>250)
  399.                                                         {
  400.                                                                 //BQ_I2C_STOP();
  401.                                                                 BQ_SCL_L;
  402.                                                                 return 0;
  403.                                                         }
  404.                                  }                        
  405.                                          
  406.                  BQ_SCL_L;                        
  407.                  return 1;        
  408.                  
  409. }



  410. static void BQ_I2C_SendByte(u8 SendByte) //数据从高位到低位
  411. {
  412.     u8 i=8,ft=1;
  413.         
  414.           SDA_OUT();  //SDA输出
  415.         
  416.     while(i--)
  417.                                 {
  418.                                          BQ_SCL_L;
  419.                                          BQ_I2C_DELAY1();
  420.                                        
  421.                                          if(SendByte&0x80)  BQ_SDA_H;  
  422.                                          else               BQ_SDA_L;  
  423.                                        
  424.                                          SendByte<<=1;
  425.                                          BQ_I2C_DELAY2();
  426.                                        
  427.                                          BQ_SCL_H;
  428.                                          BQ_I2C_DELAY2();
  429.                                 }
  430.                                 
  431.     BQ_SCL_L;                 
  432. }



  433. /**************************************************************
  434. * 功能描述:读1字节
  435. ** 输入参数:ack,1--发送ACK
  436.                                    0--发送nACK
  437. ** 输出参数: 无
  438. ** 返    回:返回读取的一字节数据
  439. ***************************************************************/
  440. static u8  BQ_I2C_ReceiveByte(unsigned char ack) //数据从高位到低位
  441. {
  442.     u8 i=8;
  443.     u8 ReceiveByte=0;

  444.                 SDA_IN();//SDA设置为输入
  445.         
  446.      BQ_SDA_H;  
  447.   
  448.     while(i--)
  449.                                 {
  450.                                          ReceiveByte<<=1;  
  451.                                        
  452.                                          BQ_SCL_L;
  453.                                          BQ_I2C_DELAY1();
  454.                                        
  455.                                          BQ_SCL_H;
  456.                                          BQ_I2C_DELAY1();
  457.                                        
  458.                                          if( BQ_SDA_READ)  ReceiveByte|=0x01;
  459.                                        
  460.                                 }
  461.                                 
  462.      BQ_SCL_L;
  463.                                 
  464.     return ReceiveByte;               
  465. }



  466. //         写入1字节数据   待写入数据    待写入地址      器件类型(BQ27200)     
  467. extern u8 BQ_I2C_WriteByte(u8 SendByte, u8 WriteAddress, u16 RrgAddress)
  468. {  
  469.                 u32 j,ft=2;

  470.           BQ_I2C_START();
  471.                 //if(!BQ_I2C_START()) return 0;

  472.                 //BQ_I2C_SendByte( WriteAddress&0xFE);//写器件地址
  473.     BQ_I2C_SendByte( WriteAddress);//写器件地址          AB
  474.           BQ_I2C_WaitAck();
  475. //                if(!BQ_I2C_WaitAck())    //等应答  为0时返回  即器件没有应答
  476. //        {  BQ_I2C_STOP();
  477. //                                   return 0;  
  478. //                                }
  479.                                           
  480.                 BQ_I2C_SendByte((u8)((RrgAddress>>8)&0XFF));   //设置寄存器地址                                       
  481.           BQ_I2C_WaitAck();
  482. //                if(!BQ_I2C_WaitAck())    //等应答  为0时返回  即器件没有应答
  483. //        {  BQ_I2C_STOP();
  484. //                                   return 0;  
  485. //                                }
  486.                                 
  487.                 BQ_I2C_SendByte((u8)(RrgAddress&0XFF));   //设置寄存器地址      
  488.           BQ_I2C_WaitAck();
  489. //                if(!BQ_I2C_WaitAck())    //等应答  为0时返回  即器件没有应答
  490. //        {  BQ_I2C_STOP();
  491. //                                   return 0;  
  492. //                                }                        
  493.                                 
  494.                 BQ_I2C_SendByte(SendByte);          //写数据
  495.           BQ_I2C_WaitAck();
  496. //                if(!BQ_I2C_WaitAck())    //等应答  为0时返回  即器件没有应答
  497. //        {  BQ_I2C_STOP();
  498. //                                   return 0;  
  499. ……………………

  500. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
bq27750.7z (1.09 MB, 下载次数: 41)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表