极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14340|回复: 8

关于wire.write新手求助

[复制链接]
发表于 2015-4-23 15:11:10 | 显示全部楼层 |阅读模式
这是读取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[i++]=Wire.read();
        }
        if ( i != size)
                return (-11);
        return (0); // 执行到此处说明没有问题,返回0
}
回复

使用道具 举报

发表于 2015-4-23 19:45:36 | 显示全部楼层
本帖最后由 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,我是折么理解的,也是这么用的。
回复 支持 反对

使用道具 举报

发表于 2015-4-23 20:03:38 | 显示全部楼层
9250的写方法

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-4-23 20:04:43 | 显示全部楼层
每个缩写的含义

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2015-4-24 08:11:23 | 显示全部楼层
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);
回复 支持 反对

使用道具 举报

发表于 2015-4-24 12:30:49 | 显示全部楼层
以下假设你的 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)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-29 14:46:04 | 显示全部楼层
tsaiwn 发表于 2015-4-24 12:30
以下假设你的 Slave 的 IIC 地址是 0x58
(1)Wire.beginTransmission( 0x58 );
  这句意思是说"准备"送数据 ...

非常感谢,说得很透彻易懂,,,拜谢了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-29 14:50:40 | 显示全部楼层
mc.six 发表于 2015-4-23 19:45
建议看mpu6050的资料。我在另外一个传感器上是begintransmission后,第一个wire.write(Val),例如wire.write ...

恩,我也是这样想的,,只是手上能看到的语法对于wire.write只有基础的三种用法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-29 14:52:47 | 显示全部楼层
mc.six 发表于 2015-4-24 08:11
Wire.begin();Wire.beginTransmission(模块地址);Wire.write(寄存器地址);Wire.write(数据1);Wire.write(数 ...

恩,就是这样了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-17 00:39 , Processed in 0.056635 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表