微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI电源管理交流 > bq3060 i2c 读取错误

bq3060 i2c 读取错误

时间:10-02 整理:3721RD 点击:

新年好!最近用bq3060调试,快要发货了,但是bq3060调试不通,请帮忙看看。

读取的值都不正常,比如:cat sys/class/power_supply/bq3060-battery/voltage_now , 读取的值为-6

打印的log是 [ 45.170688] bq3060-battery 0-0016: error reading voltage

对应的代码是:

static int bq3060_battery_voltage(struct bq3060_device_info *di)
{
int ret;
u8 buf[2];
int volt = 0;


ret = bq3060_read(di->client,BQ3060_REG_VOLT,buf,2);
if (ret<0) {
dev_err(di->dev, "error reading voltage\n");
return ret;
}

volt = get_unaligned_le16(buf);
volt = volt;
DBG("Enter:%s %d--volt = %d\n",__FUNCTION__,__LINE__,volt);
return volt;
}


读取的函数为:bq3060_read()

static int bq3060_read(struct i2c_client *client, u8 reg, u8 buf[], unsigned len)
{
struct i2c_adapter *adap=client->adapter;
struct i2c_msg msgs[2];
int ret;
char reg_buf = reg;

msgs[0].addr = client->addr; // slave addr
msgs[0].flags = client->flags;
msgs[0].len = 1; // command code is 8bit
msgs[0].buf = &reg_buf; // command code
msgs[0].scl_rate = bq3060_SPEED;

msgs[1].addr = client->addr;
msgs[1].flags = client->flags | I2C_M_RD;
msgs[1].len = len;
msgs[1].buf = (char *)buf;
msgs[1].scl_rate = bq3060_SPEED;

ret = i2c_transfer(adap, msgs, 2);

return (ret == 2)? len : ret;
}


硬件平台是s5pv210, 其支持smbus. 单独用EV2300测试过,可以通过。
sda, scl, gnd 分别接到了主控器的i2c0上。
完整的驱动代码见附件,请帮忙看看,多谢!

项目紧急,求支援!

附件描述:每次读取的返回值都是-6 ,不管是通过i2c还是i2c_smbus_read_word_data 的方式。

你好,这种问题如果光看代码,有时候效率会很低,甚至找不到问题根源。

教你一个比较有效一些的办法:‘

你说用EV2300可以读出来,证明你的硬件等没有什么问题,主要在软件上。那么你用EV2300只读取一个数,如你的电池电压,然后用示波器把i2c的波形抓取下来。你再抓一下自己软件编写的的i2c波形,同样读取这个电压,看看两者有什么区别,很快就能定位到问题。比如你的ACK信号有没有?发送地址对不对?发送命令时序对不对等。

恩,我通过这种方法解决了读取不到数据的问题,但是接着出现了新的问题。

读取电压和温度等数据,这些数据和EV2300是一样的,但是读取capcity的数据时,这个数据相差很大;然后我换了个平台,用stm32来读取,跟我的平台读取出的是一样的,跟EV2300还是有差别。

你好,能交流一下吗?qq:302998391 我现在还读不了数据,已经检查几天了,不知道是哪的问题,大四学生党一枚

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top