给BQ40Z60上电(VCC=25V,ACP=25V),然后用MCU通过模拟SMBUS读取DF数据。
unsigned int DF[2]={0x00,0x40};//BQ40Z60DF读取那要求先发送低位再发送高位
unsigned int Read_Data[32];//存储读取到的数据
void SMBUS_Send_Byte(uint8_t txd)
{
uint8_t t;
SMBD_OUT();
SMBC_0();//拉低时钟开始数据传输
for(t=0;t<8;t++)
{
//SMBUS_SDA=(txd&0x80)>>7;
if((txd&0x80)>>7)
SMBD_1();
else
SMBD_0();
txd<<=1;
delay_us(2);
SMBC_1();
delay_us(6);
SMBC_0();
delay_us(6);
}
}
uint16_t SMBUS_Read_Byte(unsigned char ack)
{
uint16_t i,receive=0;
SMBD_IN();//SDA设置为输入
for(i=0;i<8;i++ )
{
SMBC_0();
delay_us(6);
SMBC_1();
receive<<=1;
if(READ_SDA)receive++;
delay_us(6);
}
if (!ack)
SMBUS_NAck();//发送nACK
else
SMBUS_Ack(); //发送ACK
return receive;
}
uint8_t SMBUS_Wait_Ack(void)
{
uint8_t ucErrTime=0;
SMBD_IN(); //SDA设置为输入
SMBD_1();delay_us(1);
SMBC_1();delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
SMbus_Stop();
return 1;
}
}
SMBC_0();//时钟输出0
return 0;
}
/*Address:从器件地址,command:指令,RData:读取数据存储的数组,TData:发送数据块,N:需要发送的块的数量*/
void Block_Read(uint8_t Address,uint8_t Command,uint8_t RData[32],uint8_t TData[32],uint8_t N)
{
uint8_t i;
SMbus_Start();//开始
SMBUS_Send_Byte(Address&0xFE);
while(SMBUS_Wait_Ack());
SMBUS_Send_Byte(Command);
while(SMBUS_Wait_Ack());
SMBUS_Send_Byte(N);
for(i=0;i<N;i++)
{
SMBUS_Send_Byte(TData[i]);
while(SMBUS_Wait_Ack());
}
SMbus_Start();//开始
SMBUS_Send_Byte(Address|0x01);
while(SMBUS_Wait_Ack());
Byet_Count=SMBUS_Read_Byte(0);
for(i=0;i<Byet_Count;i++)
{
RData[i]=SMBUS_Read_Byte(0);
}
SMbus_Stop();//停止
}
void main()
{
Block_Read(0x14,0x44,Read_Data,DF,2);
}
运行之后一直卡在等待ACK应答处。从器件地址根据SMBUS1998年版参考手册上的,Smart Battery Selector/Smart Battery System Manager=0x14和40Z60参考手册上的smart-charger device address(0x12),host address(0x14)。两个地址都试过都是卡在wait ACK处。求看看是程序不对还是地址没找对。


