标签: GasGauge,BQ2084,BQ20Z75,BQ3060,BQ20Z45读写
BQ3060读写通信
以下是针对TI的BQ208X,20ZXX,BQ3060等GasGauge读取程序,SMBUS通讯方式,单片机采用Microchip的PIC16F877:
//----------------------------SBS read word---------------------------------------//
//----------------------------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寫控制位元組
{
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; //讀出數據
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);
}
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);
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;
}
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;
{
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;
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;
}
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;
SSPBUF=0x16; //I2C寫控制位元組
while(SSPIF==0);
SSPIF=0;
SSPBUF=CMD; //寫入I2C單元位址
while(SSPIF==0);
SSPIF=0;
PEN=1; //產生停止件
while(SSPIF==0);
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
{
int i;
write_word(0X77,0X00,subclassid); //0X77 SMB CMD
SEN=1; //啟動
while(SSPIF==0);
SSPIF=0;
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;
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;
}
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++)
{
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;
}
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);
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;
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;
}
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;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论