STM32 MCU与SMBus通信,有如下问题求助:
1)MCU发送了0x16地址之后,能够发现有两个ACK。
2)接着MCU发送Command "0x44 0x35 0x00"之后一直都没有收到ACK。
具体参见附件图片。(因只示波器只有一条线,只能提供数据线的波形)。请帮忙看下是什么原因导致78350一直没有回复ACK。
Hugo Zhang:
先要确认一下BQ78350是否正常工作。可以用EV2400和bqStudio跟它通讯,看能不能正常通讯。
David Rich:
回复 Hugo Zhang:
多谢回复。
我们检测了78350输入的电压,是满足高于3.2V的。发送第一个0x16命令能看到响应。
如果没有使用EV2400和bqStudio如何判断78350的工作状态?
Hugo Zhang:
回复 David Rich:
因为你读的0x44是一个特殊的command(ManufacturerBlockAccess())。你可以试一下读0x09 Voltage()。
David Rich:
回复 Hugo Zhang:
我们尝试过多个命令了,包括09这个,情况一样。master端发送了字节之后没有收到ack,是否和78350端的stretch有关系?
Hugo Zhang:
回复 David Rich:
下面是单节电量计的I2C读取方式,BQ78350的SMBus也是类似的,可以参考一下。
Yuanmou He:
发送命令后要注意延时。第一次地址位立即接受应答。后面命令位延时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 { }//校验失败舍弃数据}
David Rich:
回复 Yuanmou He:
非常感谢再次回复。
今天通过EV2300对接调测78350,正常。
切换到STM32F407之后问题依然是发帖携带图片的情况。不知道为何在发送0x16之后会出现两个ACK。不知道之前是否有人出现过类似问题。
Hugo Zhang:
回复 David Rich:
你看看这个页面里的链接有没有帮助吧
http://www.ti.com/tool/bq27xxxsw-linux