tudou_nangua 发表于 2014-5-18 16:52:00

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

我现在要用UNO作为master向我的从设备写入数据,从设备中某个变量的内存地址是一个16位的地址,但是Wire.beginTransmission(address)中要求地址是8位的,请问如何解决啊?有人遇到过这个问题吗?:dizzy:

Super169 发表于 2014-5-18 22:17:37

你是否弄錯了什麼?
Wire.beginTransmission 要提供的是設備的 i2c address, 應該是只有 8 bit 的.
就算是用 16/32 bit 變數去儲存, 也不可能是大於 255 的.
你把 那個 16 bit 的地址直接當 8 bit 用就可以了. 如果它的值大於 255, 本身就已經有問題了.

tudou_nangua 发表于 2014-5-19 09:16:13

Super169 发表于 2014-5-18 22:17 static/image/common/back.gif
你是否弄錯了什麼?
Wire.beginTransmission 要提供的是設備的 i2c address, 應該是只有 8 bit 的.
就算 ...

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

Super169 发表于 2014-5-19 11:35:21

tudou_nangua 发表于 2014-5-19 09:16 static/image/common/back.gif
我试试在我slave用一个地址map模式看看,16位的是slave芯片的内存地址。比如0x9030之类的

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

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

以下是一個簡單的例子:

byte rdata;
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8));   // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.receive();

其中, deviceaddress 是 8 bit 的 設備地址, 而 eeaddress 是 16bit 的芯片內存地址.

拾瑞 发表于 2014-5-19 12:07:02

IIC通讯是先写再读方式,主机向从机(设备)发送请求,这个时候使用的一定是8位的地址(7位设备地址+最低位的读写位)!+一个控制寄存器地址(8位的).所以你看起来好象是16位地址.......

tudou_nangua 发表于 2014-5-19 21:02:31

谢谢!已成功

tudou_nangua 发表于 2014-5-19 21:03:57

Super169 发表于 2014-5-19 11:35 static/image/common/back.gif
你指slave芯片的内存地址, 是否指要讀取的地址 (例如 記憶體 at24c256), 而不是 i2c 地址?

Wire.begin ...

正解!:lol
页: [1]
查看完整版本: 关于I2C中Wire.beginTransmission(address)的地址问题