以下假设你的 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)
|