BQ27X00是一种常用的GasGauge IC,在各种数码产品中被广泛应用,TI也提供了相应的开发工具供生产使用。但是对生产的灵活性要求我们要自己动手去开发符合要求的测试器,下面将对BQ27X00系列的通讯方式做简单介绍。
首先BQ27000采用的是单线HDQ通讯方式,BQ27200采用的是I2C通讯方式,相信大家对这两种通讯方式都比较了解。
下面给出两种IC的通讯代码,MCU采用Microchip的PIC16F877A。
BQ27200:
/************************************************************************************/
/* 程式名:BQ27200讀寫代碼 */
/* */
/* 晶振: 4M CPU型號: PIC16F877A */
/* */
/* 作者: Randy 日期: 2010-09-10 */
/* */
/************************************************************************************/
#include <pic.h>
__CONFIG(0x3732);
//晶片配置字,看門狗關,上電延時開,掉電檢測關,低壓編程關,加密,4M晶體HS振盪
//--------------------------延時函數------------------------------------------//
void delay(unsigned int k)
{
unsigned int t;
for(;k!=0;k--)
for(t=110;t!=0;t--);
}
//-----------------------I2C初始化函數----------------------------------------//
void I2C_init(void)
{
SPBRG=0X19; //設置串列傳輸速率為9600BPS
TXSTA=0X24; //使能串口發送,選擇高速串列傳輸速率
RCSTA=0X90; //使能串口工作2,連續接收
SSPCON=0X08;
TRISC3=1; //set to input
TRISC4=1; //set to input
SSPSTAT=0X80;
SSPADD=0X09;
SSPCON2=0X00;
SSPIF=0;
SSPEN=1;
}
//-----------------------I2C寫資料函數----------------------------------------//
void I2C_write_byte(unsigned char address, unsigned char data)
{
RSEN=1; //啟動
while(SSPIF==0); SSPIF=0;
SSPBUF=0xaa; //I2C寫控制位元組
while(SSPIF==0); SSPIF=0;
SSPBUF=address; //寫入I2C單元位址
while(SSPIF==0); SSPIF=0;
SSPBUF=data; //寫入資料
while(SSPIF==0); SSPIF=0;
PEN=1; //產生停止條件
while(SSPIF==0); SSPIF=0;
delay(5); //延時5MS
}
//-----------------------I2C讀數據函數----------------------------------------//
unsigned char I2C_read_byte(unsigned char address)
{
unsigned char dat=0;
SEN=1; //啟動
while(SSPIF==0);SSPIF=0;
SSPBUF=0xaa; //I2C寫控制位元組
while(SSPIF==0);SSPIF=0;
SSPBUF=address; //寫入I2C單元位址
while(SSPIF==0);SSPIF=0;
RSEN=1; //重啟動
while(SSPIF==0);SSPIF=0;
SSPBUF=0xab; //I2C讀控制位元組
while(SSPIF==0);SSPIF=0;
RCEN=1; //允許接收
while(SSPIF==0);SSPIF=0;
dat=SSPBUF; //讀出數據
ACKDT=1; //產生非應答信號
ACKEN=1;
PEN=1; //產生停止條件
while(SSPIF==0);SSPIF=0;
return(dat);
}
//-----------------------------I2C_EEPROM寫入---------------------------------//
void I2C_EE_write(unsigned char address,unsigned char data)
{
I2C_write_byte(0X6E,0XDD); //Host enable EEPROM programming mode,write data 0XDD to address 0X6E
I2C_write_byte(address,data); //Host writes data to addresses 0X76~0X7F
I2C_read_byte(address); //Host reads data address
delay(250); //21V pause applied to PROG pin for 50ms
I2C_write_byte(0X6E,0X00); //end, write data 0X00 to address 0X6E
}
//----------------------------主函數------------------------------------------//
void main(void)
{
I2C_init();
TXREG=I2C_read_byte(0X76);
//I2C_write_byte(0X01,0X56);
I2C_EE_write(0X76,0X50);
TXREG=I2C_read_byte(0X76);
delay(1);
while(1);
}
用户1485860 2014-11-27 21:47