标签: GasGauge,BQ2084,BQ20Z75,BQ3060,BQ20Z45读写
BQ3060读写通信
以下是针对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[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;
}