标签: GasGauge,BQ2084,BQ20Z75,BQ3060,BQ20Z45读写 
BQ3060读写通信
以下是针对TIBQ208X,20ZXX,BQ3060GasGauge读取程序,SMBUS通讯方式,单片机采用MicrochipPIC16F877:
//----------------------------SBS read word---------------------------------------//
unsigned short read_word(unsigned char address)
{
      unsigned short dat1=0;
      unsigned short dat2=0;
      unsigned short dat=0;
    SEN=1;                      //啟動
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0x16;                //I2C寫控制位元組
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=address;              //寫入I2C單元位址
    while(SSPIF==0);
    SSPIF=0;
    RSEN=1;                      //重啟動
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0x17;                //I2C讀控制位元組
    while(SSPIF==0);
    SSPIF=0;
    RCEN=1;                      //允許接受
    while(SSPIF==0);
    SSPIF=0;
    dat1=SSPBUF;                //讀出數據
ACKDT=0;                        //產生應答信號
ACKEN=1;
    while(SSPIF==0);
    SSPIF=0;
    RCEN=1;                      //允許接收
      while(SSPIF==0);
    SSPIF=0;
    dat2=SSPBUF;                //讀出數據
ACKDT=1;                        //產生非應答信號
ACKEN=1;
    PEN=1;                      //產生停止件
    while(SSPIF==0);
    SSPIF=0;
    dat=dat2<<8|dat1;            //合併高低字節
return (dat);
}
//----------------------------SBS write word---------------------------------------//
void write_word(unsigned char address,int hbyte,int lbyte)
{
    SEN=1;                      //啟動
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0x16;                //I2C寫控制位元組
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=address;            //寫入I2C單元位址
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=lbyte;              //Lbyte發送
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=hbyte;              //Hyte發送
    while(SSPIF==0);
    SSPIF=0;
    PEN=1;                      //產生停止件
    while(SSPIF==0);
    SSPIF=0;
}

//----------------------------SBS write Integer---------------------------------------//
void write_Integer(unsigned char CMD,int address)
{
    unsigned char lbyte,hbyte;
    lbyte=address&0X00FF;
    hbyte=(address&0XFF00)>>8;
    SEN=1;                    //啟動
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0x16;              //I2C寫控制位元組
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=CMD;              //寫入I2C單元位址
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=lbyte;            //Lbyte發送
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=hbyte;            //Hyte發送
    while(SSPIF==0);
    SSPIF=0;
    PEN=1;                    //產生停止件
    while(SSPIF==0);
    SSPIF=0;
}
//----------------------------SBS write CMD---------------------------------------//
void write_CMD(int CMD)
{
    SEN=1;                    //啟動 3060 ti
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0x16;              //I2C寫控制位元組
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=CMD;              //寫入I2C單元位址
    while(SSPIF==0);
    SSPIF=0;
    PEN=1;                    //產生停止件
    while(SSPIF==0);
    SSPIF=0;
}
//----------------------------DataFlash read---------------------------------------//
DF_read(int subclassid)
{
  int i;
  write_word(0X77,0X00,subclassid);  //0X77 SMB CMD
    SEN=1;                            //啟動
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0x16;                      //I2C寫控制位元組
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0X78;                      //SMB CMD 0x78 receiving 32 bytes of data
    while(SSPIF==0);
    SSPIF=0;
    RSEN=1;                          //重新啟動
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0x17;                    //I2C讀控制位元組
for(i=0;i<33;i++)
    {
    while(SSPIF==0);
    SSPIF=0;
    RCEN=1;                          //允許接受
    while(SSPIF==0);
    SSPIF=0;
    data[i]=SSPBUF;                //讀出數據
    ACKDT=0;
    ACKEN=1;
    }
    ACKDT=1;
    ACKEN=1;
    PEN=1;                        //產生停止件
    while(SSPIF==0);
    SSPIF=0;
}
//----------------------------Dataflash write---------------------------------------//
void DF_write(int subclassid,int offset)
  {
    int i;
    DF_read(subclassid);        //預讀
    write_word(0X77,0X00,subclassid);  //0X77 SMB CMD
    data[1]=0X10;
    data[2]=0X95;
    SEN=1;                      //啟動
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0x16;                //I2C寫控制位元組
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0X78;              //寫入I2C單元位址
for(i=0;i<=data[0];i++)
{
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=data[i];            //發送數據
}
    while(SSPIF==0);
    SSPIF=0;
    PEN=1;                    //產生停止件
    while(SSPIF==0);
    SSPIF=0;
  }
//----------------------------DFI read---------------------------------------//
void DFI_read()
{
  int i;
  write_word(0X09,0X40,0X40);
    SEN=1;                        //啟動
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0x16;                  //I2C寫控制位元組
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0X0C;                //SMB CMD 0x0C
    while(SSPIF==0);
    SSPIF=0;
    RSEN=1;                      //重新啟動
    while(SSPIF==0);
    SSPIF=0;
    SSPBUF=0x17;                //I2C讀控制位元組
for(i=0;i<33;i++)
    {
    while(SSPIF==0);
    SSPIF=0;
    RCEN=1;                      //允許接受
    while(SSPIF==0);
    SSPIF=0;
    data[i]=SSPBUF;              //讀出數據
    ACKDT=0;
    ACKEN=1;
    }
    ACKDT=1;
    ACKEN=1;
    PEN=1;                      //產生停止件
    while(SSPIF==0);
    SSPIF=0;
}