以下是针对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;
}
文章评论(0条评论)
登录后参与讨论