原创 BQ27000&BQ27200的读写

2010-9-16 08:20 3725 4 5 分类: MCU/ 嵌入式

        BQ27X00是一种常用的GasGauge IC,在各种数码产品中被广泛应用,TI也提供了相应的开发工具供生产使用。但是对生产的灵活性要求我们要自己动手去开发符合要求的测试器,下面将对BQ27X00系列的通讯方式做简单介绍。


        首先BQ27000采用的是单线HDQ通讯方式,BQ27200采用的是I2C通讯方式,相信大家对这两种通讯方式都比较了解。


        下面给出两种IC的通讯代码,MCU采用Microchip的PIC16F877A。


BQ27200:


/************************************************************************************/
/*     程式名:BQ27200讀寫代碼                                                      */
/*                                                                                  */
/*     晶振:  4M                                            CPU型號: PIC16F877A   */
/*                                                                                  */
/*     作者: Randy                                               日期:    2010-09-10   */
/*                                                                                  */
/************************************************************************************/
#include <pic.h>
__CONFIG(0x3732);       
//晶片配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關,加密,4M晶體HS振盪
//--------------------------延時函數------------------------------------------//
void delay(unsigned int k)
{
  unsigned int t;
  for(;k!=0;k--)
  for(t=110;t!=0;t--);
}
//-----------------------I2C初始化函數----------------------------------------//
void I2C_init(void)
{
    SPBRG=0X19;                     //設置串列傳輸速率為9600BPS
    TXSTA=0X24;                     //使能串口發送,選擇高速串列傳輸速率
    RCSTA=0X90;                     //使能串口工作2,連續接收


    SSPCON=0X08;
    TRISC3=1;                      //set to input
    TRISC4=1;                      //set to input
    SSPSTAT=0X80;
    SSPADD=0X09;
    SSPCON2=0X00;
    SSPIF=0;
    SSPEN=1;
 }
//-----------------------I2C寫資料函數----------------------------------------//
void I2C_write_byte(unsigned char address, unsigned char data)
{
    RSEN=1;                           //啟動
    while(SSPIF==0); SSPIF=0;


    SSPBUF=0xaa;                     //I2C寫控制位元組
    while(SSPIF==0); SSPIF=0;


    SSPBUF=address;                  //寫入I2C單元位址
    while(SSPIF==0); SSPIF=0;


    SSPBUF=data;                     //寫入資料
    while(SSPIF==0); SSPIF=0;


    PEN=1;                           //產生停止條件
    while(SSPIF==0); SSPIF=0;


    delay(5);                        //延時5MS
}


//-----------------------I2C讀數據函數----------------------------------------//
unsigned char I2C_read_byte(unsigned char address)
{
    unsigned char dat=0;


    SEN=1;                           //啟動
    while(SSPIF==0);SSPIF=0;


    SSPBUF=0xaa;                     //I2C寫控制位元組
    while(SSPIF==0);SSPIF=0;


    SSPBUF=address;                  //寫入I2C單元位址
    while(SSPIF==0);SSPIF=0;


    RSEN=1;                          //重啟動
    while(SSPIF==0);SSPIF=0;


    SSPBUF=0xab;                     //I2C讀控制位元組
    while(SSPIF==0);SSPIF=0;


    RCEN=1;                          //允許接收
    while(SSPIF==0);SSPIF=0;


    dat=SSPBUF;                      //讀出數據


    ACKDT=1;                         //產生非應答信號
    ACKEN=1;


    PEN=1;                           //產生停止條件
    while(SSPIF==0);SSPIF=0;


    return(dat);
}
//-----------------------------I2C_EEPROM寫入---------------------------------//
void I2C_EE_write(unsigned char address,unsigned char data)
 {
   I2C_write_byte(0X6E,0XDD);     //Host enable EEPROM programming mode,write data 0XDD to address 0X6E
   I2C_write_byte(address,data);  //Host writes data to addresses 0X76~0X7F
   I2C_read_byte(address);        //Host reads data address
   delay(250);                     //21V pause applied to PROG pin for 50ms
   I2C_write_byte(0X6E,0X00);     //end, write data 0X00 to address 0X6E
 }
//----------------------------主函數------------------------------------------//
void main(void)

I2C_init();
TXREG=I2C_read_byte(0X76);
//I2C_write_byte(0X01,0X56);
I2C_EE_write(0X76,0X50);
TXREG=I2C_read_byte(0X76);
delay(1);
while(1);
}


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1485860 2014-11-27 21:47

进来看看哦。
相关推荐阅读
用户1442089 2010-09-27 22:26
16位高精度D/A转换器LTC1595与单片机通信
/************************************************************************************//*     程式名:LTC...
用户1442089 2010-09-17 13:03
24位高精度A/D转换器LTC2400读写应用
24bit高精度A/D转换器通信代码,MCU采用PIC16F877,读到的AD值传送到超级终端显示:/*************************************************...
用户1442089 2010-09-16 12:57
BQ3060读写通信
以下是针对TI的BQ208X,20ZXX,BQ3060等GasGauge读取程序,SMBUS通讯方式,单片机采用Microchip的PIC16F877://----------------------...
用户1442089 2010-09-16 08:31
SMBUS与I2C比较
 ...
用户1442089 2010-09-16 08:26
SMBUS通信详解
 ...
我要评论
1
4
关闭 站长推荐上一条 /3 下一条