I2C地址引起的读写问题
从slave器件中读取8K(8192)字节数据,发送地址时是这样操作的:
memset(sa, 0, 32);
sa[0] = offset;
i2c_data.msgs[0].len = 1;
i2c_data.msgs[0].addr = slave_addr;
i2c_data.msgs[0].flags = 0; // 0: write 1:read
i2c_data.msgs[0].buf = sa;
读返回数据是这样操作的:
i2c_data.msgs[1].len = 8192;
i2c_data.msgs[1].addr = slave_addr;
i2c_data.msgs[1].flags = 1; // 0: write 1:read
i2c_data.msgs[1].buf = buff;
得不到正确结果,数据只在前256字节变化,但也不是slave中的数据。
根据I2C协议,从slave器件中读数据时,先要进行伪写发送读地址,第一字节是器件地址与读写标志位,接着的若干字节是器件内部偏移地址。当用 i2c_rdwr_ioctl_data
通过ioctl写入地址时,其中的 msg.len决定发送的偏移地址字节数,1字节偏移地址最大只能访问256字节数据,2字节64K,依次类推。
上面发送读地址时,只发送了1字节偏移,即只发送了低8位地址(8192=0x2000),高6位没发送,在接下来的读返回数据时,数据时读取长度超出了偏移地址最大值,发生卷绕,得不到正确结果。
当把地址高6 位也发送给slave时,读取数据正确。
所以读数据时要检查偏移地址,确保准确发送相应的偏移地址,才能正确读出数据。