TI中文支持网
TI专业的中文技术问题搜集分享网站

BQ40Z50-R2: BQ40Z50-R2 SMBus通信读不到数据问题

Part Number:BQ40Z50-R2Other Parts Discussed in Thread:BQ40Z50, EV2400

SMBus通信采用IO推挽输出模拟时序方式进行设计,但出现同样的两块板子一块读的很稳定一块完全不能读,但采用IT的通信盒都可以读取。数据读取过程的ACK都有回复,但是最后的数据都读到0,CRC校验不过,是不是时序有问题?希望大家帮忙看看

void SMB_Start(void)
{ SMB_SDA_OUT();
SMB_SDA = 1; SMB_SCL = 1; delay_us(20); SMB_SDA = 0;
delay_us(20);
SMB_SCL = 0;
}

/**
@breif SMB 停止信号
*/
void SMB_Stop(void)
{ SMB_SDA_OUT();
SMB_SCL = 0;
SMB_SDA = 0; delay_us(20); SMB_SDA = 1;
delay_us(5); SMB_SCL = 1;
delay_us(20);}

/**
@breif SMB接收应答
*/
int SMB_Wait_Ack(void)
{ uint16_t u16tmptime = 0;
SMB_SDA = 1;
SMB_SCL = 0; SMB_SDA_IN();
delay_us(35);
SMB_SCL = 1;
delay_us(5);
while(SMB_READ_SDA) // 0应答位 {
u16tmptime ++;
if(u16tmptime > 2500)
{
SMB_Stop();
printf("SMB SDA low timeout \r\n");
return -1;
}
} delay_us(10);
return 0;
}

/**
@breif SMB发送应答
*/
void SMB_ACK(uint8_t ack)
{ SMB_SDA_OUT();
SMB_SCL = 0;
if(ack) // 应答
{
SMB_SDA = 0;
} else {
SMB_SDA = 1;
}
delay_us(25);
SMB_SCL = 0;
delay_us(7); SMB_SCL = 1;
delay_us(25); SMB_SCL = 0; delay_us(10);}

/**
@breif 写字节数据
*/
void SMB_HostWriteByte(uint8_t dat)
{
uint8_t i = 0;
delay_us(5); SMB_SCL = 0;
SMB_SDA_OUT();

for(i=0;i<8;i++)
{ if(dat & 0x80)
{
SMB_SDA = 1;
} else
{
SMB_SDA = 0;
}
dat <<= 1;
delay_us(25);
SMB_SCL = 1;
delay_us(25);
SMB_SCL = 0;
delay_us(5);
}
}

/**
@breif 读字节数据
*/
uint8_t SMB_HostReadByte(uint8_t u8ack)
{
unsigned char i=0,dat = 0;
SMB_SDA_IN(); SMB_SCL = 0;
delay_us(50);
for(i=0;i<8;i++)
{
SMB_SCL = 0;
delay_us(20);
dat <<= 1; SMB_SCL = 1;
delay_us(20);
if(SMB_READ_SDA == 1)
dat |= 0x01;
SMB_SCL = 0;
delay_us(5); } if(u8ack)
SMB_ACK(1);
else
SMB_ACK(0);
return dat;}

/**
@breif 完整读一个字节数据
*/
uint8_t SMB_HostRead(uint8_t u8SMB_Address ,uint8_t u8regAddr)
{
uint8_t temp = 0;
int itimeout = 0;
delay_ms(10);
SMB_Start();
SMB_HostWriteByte(u8SMB_Address);
itimeout = SMB_Wait_Ack();
if(itimeout == -1)
{
printf("SMB read time out");
return 0;
}
SMB_HostWriteByte(u8regAddr);
itimeout = SMB_Wait_Ack();
if(itimeout == -1)
{
printf("SMB read time out"); return 0;
}
SMB_Start();
SMB_HostWriteByte(u8SMB_Address + 1);
itimeout = SMB_Wait_Ack();
if(itimeout == -1)
{
printf("SMB read time out"); return 0;
}

temp = SMB_HostReadByte(0);

SMB_Stop();
return temp;

}

Cherry Zhou:

您好我们已收到您的问题并升级到英文论坛,如有答复将尽快回复您。谢谢!

,

Cherry Zhou:

JQ C 说:但采用IT的通信盒都可以读取。

您好,请问您说的IT的通信盒是?

此外请注意,SMBus 通信旨在与上拉电阻器配合使用。 请您检查推挽式 IOS 的连接方式。

,

JQ C:

Hi 周工您好,TI通信盒的型号是EV2400。后续第二天在无对设备进行任何改变的情况下,莫名就可以通信了,能够使用模拟SMB读取数据。这个问题是否和BQ40Z50需要某些配置有关? 再次描述问题,您帮忙分析一下。 采用TI通信盒EV2400对 两块相同的板子进行通信,均可成功读取和设置数据,拆除通信盒后,采用单片机与BQ40Z50通信,一块板子可以,一块板子不行,代码如上所示,不行的板子隔天又可进行通信,单片机和电量计都在板子上。 电量计之间是否存在差异?因为之前出现过问题:同份代码同个时序同一块板子,单片机读数据正常,但接入TI盒EV2400调试之后,拆除EV2400后,板子自己工作,单片机读到的数据出现大量错误和丢包的现象,需要略微改变代码时序才可读取正常数据。

,

Cherry Zhou:

您好,感谢您提供的信息。

请确保您这边支持实现时钟拉伸。 另一个问题可能是存在多个主机,这需要arbitration支持。 如果单片机是第一台主机,将另一台主机连接到 SMBus 是有可能导致冲突的,这两台主机必须正确处理才能实现正确通信。

赞(0)
未经允许不得转载:TI中文支持网 » BQ40Z50-R2: BQ40Z50-R2 SMBus通信读不到数据问题
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1