关于wire.write新手求助
这是读取MPU6050数据的一个函数,我们begintransmission时传入的是MPU6050的who_am_i的地址,需要读取的是start处的MPU数据,start是诸如MGT之类的寄存器地址。但wire.write的三种用法(write(val)write(str)write(data,length))中并没有write(address),这种用法啊,那么问题来了,如果从机不止一个可写地址,那执行write时数据该写入哪里呢?
其实大概猜到了以下代码的意思,就是不确定,希望大神能不吝赐教。
int MPU6050_read(int start, uint8_t *buffer, int size)//size 为请求的数据的字节数,start为一个整型数
{
int i, n, error;
Wire.beginTransmission(MPU6050_I2C_ADDRESS);
n = Wire.write(start);//n为写入的字节数
if (n != 1)
return (-10);
n = Wire.endTransmission(false);
if (n != 0)
return (n);
Wire.requestFrom(MPU6050_I2C_ADDRESS, size, true);
i = 0;
while(Wire.available() && i<size)
{
buffer=Wire.read();
}
if ( i != size)
return (-11);
return (0); // 执行到此处说明没有问题,返回0
} 本帖最后由 mc.six 于 2015-4-23 19:46 编辑
建议看mpu6050的资料。我在另外一个传感器上是begintransmission后,第一个wire.write(Val),例如wire.write(0x21),就是往指定0x21为要写的地址,随后的wire.write(Val)都是写数据。然后 Wire.endTransmission(); 然后再begin,write地址,write数据,再end,我是折么理解的,也是这么用的。 9250的写方法 每个缩写的含义 Wire.begin();Wire.beginTransmission(模块地址);Wire.write(寄存器地址);Wire.write(数据1);Wire.write(数据2);Wire.endTransmission();delay(500);
假设模块地址0x50:
例如往寄存器地址0x00写数据:Wire.begin();Wire.beginTransmission(0x50);Wire.write(0x00);Wire.write(0x05);Wire.write(0x43);Wire.endTransmission();delay(500);
例如往寄存器地址0x03写数据:Wire.begin();Wire.beginTransmission(0x50);Wire.write(0x03);Wire.write(0x13);Wire.write(0x21);Wire.endTransmission();delay(500);
以下假设你的 Slave 的 IIC 地址是 0x58
(1)Wire.beginTransmission( 0x58 );
这句意思是说"准备"送数据去给 地址是 0x58 的那个 Slave!
(2)接着的 Wite.write( ... ); 事实上只是在 Master(主)这边的内存 Queue 起来
(3)注意,
Wire.write( char 或 int 或 long);
这句一定只送出 一个 byte,即使是 int 或 long , 都只送出最右边的 byte;
严格说是只拿一个 byte 放在 Master 某内存准备送出
(我意思就是还没真的送出)
(4)Wire.endTransmission( );
这句是说,
现在开始把刚从Wire.beginTransmission( 0x58 );一直到
这句Wire.endTransmission( );之间所有用 Wire.write( ..) 而 Queue 在
内存的全部真正的开始传送去给地址是 0x58 的那个 Slave!
(5)以上这些数据送去给 Slave 之后,
Slave 收到要如何解读完全是 Slave 的责任与权利,
在 Master 这边完全管不到, 所以你必须看 Slave 的手册!
(6)Wire.requestFrom(0x58, size, true);
这句是要求地址是 0x58 的立即传送 size 个 byte 过来
且这句会卡住不会立即回来,
必须等到已经有 size 个 byte 到达 Wire 的缓存区, 或是 timeout,
这句才会结束(就是说这句是会 Blocked 的函数!)
(7)所以等到从 Wire.requestFrom(...) 回来之后,
你必须根据 Wire.available( ) 来收取数据
(8)Summary 以上动作:
以上(1)到(5)先送命令去给 Slave, 让 Slave 有所准备,
以上(6)通知 Slave 可以开始传送数据 size 个 byte 过来给 Master
以上(7)Master 收取已经到达Master的Wire的缓存区内存的数据
注意, 这时并没有在跟 Slave 沟通,
因为 Wire.requestFrom(..) 这函数要收完数据才会结束并返回,
所以这时数据都已经在缓存区(最多 32 bytes)
tsaiwn 发表于 2015-4-24 12:30 static/image/common/back.gif
以下假设你的 Slave 的 IIC 地址是 0x58
(1)Wire.beginTransmission( 0x58 );
这句意思是说"准备"送数据 ...
非常感谢,说得很透彻:loveliness:易懂,,,拜谢了 mc.six 发表于 2015-4-23 19:45 static/image/common/back.gif
建议看mpu6050的资料。我在另外一个传感器上是begintransmission后,第一个wire.write(Val),例如wire.write ...
恩,我也是这样想的,,只是手上能看到的语法对于wire.write只有基础的三种用法 mc.six 发表于 2015-4-24 08:11 static/image/common/back.gif
Wire.begin();Wire.beginTransmission(模块地址);Wire.write(寄存器地址);Wire.write(数据1);Wire.write(数 ...
恩,就是这样了
页:
[1]