STM32 与bq78350通过SMBus通信异常求助
STM32 MCU与SMBus通信,有如下问题求助:
1)MCU发送了0x16地址之后,能够发现有两个ACK。
2)接着MCU发送Command "0x44 0x35 0x00"之后一直都没有收到ACK。
具体参见附件图片。(因只示波器只有一条线,只能提供数据线的波形)。请帮忙看下是什么原因导致78350一直没有回复ACK。
先要确认一下BQ78350是否正常工作。可以用EV2400和bqStudio跟它通讯,看能不能正常通讯。
多谢回复。
我们检测了78350输入的电压,是满足高于3.2V的。发送第一个0x16命令能看到响应。
如果没有使用EV2400和bqStudio如何判断78350的工作状态?
因为你读的0x44是一个特殊的command(ManufacturerBlockAccess())。你可以试一下读0x09 Voltage()。
我们尝试过多个命令了,包括09这个,情况一样。master端发送了字节之后没有收到ack,是否和78350端的stretch有关系?
下面是单节电量计的I2C读取方式,BQ78350的SMBus也是类似的,可以参考一下。
发送命令后要注意延时。第一次地址位立即接受应答。后面命令位延时80us再延时。接受数据每一组间隔50us。有EV2400就可以用示波器抓时序来看
给你个程序参考
/**********************************
读取剩余电量
**********************************/
unsigned char RelativeState[3]={0x16,0x0D,0x17};
unsigned char CRC_Buff[5];
void RelativeStateOfCharge(void)
{
unsigned char CRC_Val;
SMbus_Start();//开始
SMBUS_Send_Byte(RelativeState[0]);
SMBUS_Wait_Ack();
SMBUS_Send_Byte(RelativeState[1]);
SMBD_Init(1);
SMBC=0;
SMBD=1;
Delay80us();
SMBUS_Wait_Ack();
SMbus_Start();//开始
SMBUS_Send_Byte(RelativeState[2]);
SMBUS_Wait_Ack();
SMBD_Init(1);
SMBC=0;
SMBD=1;
Delay45us();
Read_Data[0]=SMBUS_Read_Byte();//接受低位数据
SMBUS_Ack(); //发送ACK
SMBD_Init(1);
SMBC=0;
SMBD=1;
Delay50us();
Read_Data[1]=SMBUS_Read_Byte();//接受高位数据
SMBUS_Ack(); //发送ACK
SMBD_Init(1);
SMBC=0;
SMBD=1;
Delay50us();
Read_Data[2]=SMBUS_Read_Byte();//接受CRC
SMBUS_Ack();
SMBD_Init(1);
SMBC=0;
SMBD=0;
Delay50us();
SMbus_Stop();//停止
CRC_Buff[0]=RelativeState[0];
CRC_Buff[1]=RelativeState[1];
CRC_Buff[2]=RelativeState[2];
CRC_Buff[3]=Read_Data[0];
CRC_Buff[4]=Read_Data[1];
CRC_Val=CRC8(CRC_Buff,5);//CRC校验
if(CRC_Val==Read_Data[2])//校验成功
{
CRC_OK=1;
}
else
{
}//校验失败舍弃数据
}
非常感谢再次回复。
今天通过EV2300对接调测78350,正常。
切换到STM32F407之后问题依然是发帖携带图片的情况。不知道为何在发送0x16之后会出现两个ACK。不知道之前是否有人出现过类似问题。
你看看这个页面里的链接有没有帮助吧
http://www.ti.com/tool/bq27xxxsw-linux