极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 30602|回复: 6

关于I2C中Wire.beginTransmission(address)的地址问题

[复制链接]
发表于 2014-5-18 16:52:00 | 显示全部楼层 |阅读模式
我现在要用UNO作为master向我的从设备写入数据,从设备中某个变量的内存地址是一个16位的地址,但是Wire.beginTransmission(address)中要求地址是8位的,请问如何解决啊?有人遇到过这个问题吗?
回复

使用道具 举报

发表于 2014-5-18 22:17:37 | 显示全部楼层
你是否弄錯了什麼?  
Wire.beginTransmission 要提供的是設備的 i2c address, 應該是只有 8 bit 的.
就算是用 16/32 bit 變數去儲存, 也不可能是大於 255 的.  
你把 那個 16 bit 的地址直接當 8 bit 用就可以了. 如果它的值大於 255, 本身就已經有問題了.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-19 09:16:13 | 显示全部楼层
Super169 发表于 2014-5-18 22:17
你是否弄錯了什麼?  
Wire.beginTransmission 要提供的是設備的 i2c address, 應該是只有 8 bit 的.
就算 ...

我试试在我slave用一个地址map模式看看,16位的是slave芯片的内存地址。比如0x9030之类的
回复 支持 反对

使用道具 举报

发表于 2014-5-19 11:35:21 | 显示全部楼层
tudou_nangua 发表于 2014-5-19 09:16
我试试在我slave用一个地址map模式看看,16位的是slave芯片的内存地址。比如0x9030之类的

你指slave芯片的内存地址, 是否指要讀取的地址 (例如 記憶體 at24c256), 而不是 i2c 地址?

Wire.beginTransmission 只是用來打開通訊之門, 由於可以有多個設備共用線路, 那個地址只是設備的 ID.
如果你要讀取芯片內存地址, 應該是先用 Wire.beginTransmission 打開通訊, 再用 Wire.send(MSB), Wire.send(LSB) 將 16 bit 的地址分成兩個  8bit 資料 送出去.

以下是一個簡單的例子:

  1. byte rdata;
  2. Wire.beginTransmission(deviceaddress);
  3. Wire.send((int)(eeaddress >> 8));   // MSB
  4. Wire.send((int)(eeaddress & 0xFF)); // LSB
  5. Wire.endTransmission();
  6. Wire.requestFrom(deviceaddress,1);
  7. if (Wire.available()) rdata = Wire.receive();
复制代码


其中, deviceaddress 是 8 bit 的 設備地址, 而 eeaddress 是 16bit 的芯片內存地址.
回复 支持 反对

使用道具 举报

发表于 2014-5-19 12:07:02 | 显示全部楼层
IIC通讯是先写再读方式,主机向从机(设备)发送请求,这个时候使用的一定是8位的地址(7位设备地址+最低位的读写位)!+一个控制寄存器地址(8位的).所以你看起来好象是16位地址.......

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-19 21:02:31 | 显示全部楼层
谢谢!已成功
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-5-19 21:03:57 | 显示全部楼层
Super169 发表于 2014-5-19 11:35
你指slave芯片的内存地址, 是否指要讀取的地址 (例如 記憶體 at24c256), 而不是 i2c 地址?

Wire.begin ...

正解!
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 19:43 , Processed in 0.037279 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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