原创 BQ3060读写通信

2010-9-16 12:57 4256 2 2 分类: MCU/ 嵌入式

以下是针对TI的BQ208X,20ZXX,BQ3060等GasGauge读取程序,SMBUS通讯方式,单片机采用Microchip的PIC16F877:
//----------------------------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;                    //啟動
    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=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;            //發送數據
}
    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=SSPBUF;              //讀出數據
    ACKDT=0;
    ACKEN=1;
    }
    ACKDT=1;
    ACKEN=1;
    PEN=1;                       //產生停止條件
    while(SSPIF==0);
    SSPIF=0;
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
×
广告
关闭 站长推荐上一条 /4 下一条