求高手解答!mtk82平台I2C读写错误!
I2C0上挂载多个从设备。目前有一个从设备读写错误。用示波器量后发现是noack错误。
noack错误目前想到的和尝试的方法:
1、slave addr错误,从i2c波形来看,addr是正确的。如下图对应 datasheet write addr 0x88

2、i2c的速率,降到100[size=13.63636302947998px]kbit/s也还是不行。(朋友提供的办法,原来是用默认的400)
各位还有什么办法。求解!
另外补充一下i2c的读写函数:
static int uc_i2c_rxdata(char *rxdata, int length, u8 cmd)
{
int ret;
u8 read_cmd[1] = {cmd};
struct i2c_msg msgs[] = {
/*{
.addr = this_client->addr,
.flags = 0,
.len = 1,
.buf = read_cmd,
},*/
{
.addr = this_client->addr,
.flags = I2C_M_RD,
.len = length,
.buf = rxdata,
},
};
//printk("IIC addr = %x\n",this_client->addr);
ret = i2c_transfer(this_client->adapter, msgs, 1);
if (ret < 0)
printk("msg %s i2c read error: %d\n", __func__, ret);
return ret;
}
static int uc_i2c_wxdata(char *txdata, int length)
{
int ret;
struct i2c_msg msg[] = {
{
.addr = this_client->addr,
.flags = 0,
.len = length,
.buf = txdata,
},
};
ret = i2c_transfer(this_client->adapter, msg, 1);
if (ret < 0)
printk("%s i2c write error: %d\n", __func__, ret);
return ret;
}
这两个函数应该没什么问题,很通用。贴出来,以免犯低级错误。
再者,82平台好像也没有72 89平台的一次传输8个字节的限制。
可以将别的料去掉,看看这独立一个行不行?
有可能是IIC上有器件没供电,拉死了。
解决了吗,我和你一样,也碰到这个问题
解决了。忘了回复,其实很简单,主要在于没有根本的理解。
从图像中就可以看出我上面的波形是有问题的。有个元器件个规格用错了,修改后是正常的方波。
