关于I2C中Wire.beginTransmission(address)的地址问题
我现在要用UNO作为master向我的从设备写入数据,从设备中某个变量的内存地址是一个16位的地址,但是Wire.beginTransmission(address)中要求地址是8位的,请问如何解决啊?有人遇到过这个问题吗?:dizzy: 你是否弄錯了什麼?Wire.beginTransmission 要提供的是設備的 i2c address, 應該是只有 8 bit 的.
就算是用 16/32 bit 變數去儲存, 也不可能是大於 255 的.
你把 那個 16 bit 的地址直接當 8 bit 用就可以了. 如果它的值大於 255, 本身就已經有問題了.
Super169 发表于 2014-5-18 22:17 static/image/common/back.gif
你是否弄錯了什麼?
Wire.beginTransmission 要提供的是設備的 i2c address, 應該是只有 8 bit 的.
就算 ...
我试试在我slave用一个地址map模式看看,16位的是slave芯片的内存地址。比如0x9030之类的 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 的芯片內存地址.
IIC通讯是先写再读方式,主机向从机(设备)发送请求,这个时候使用的一定是8位的地址(7位设备地址+最低位的读写位)!+一个控制寄存器地址(8位的).所以你看起来好象是16位地址.......
谢谢!已成功 Super169 发表于 2014-5-19 11:35 static/image/common/back.gif
你指slave芯片的内存地址, 是否指要讀取的地址 (例如 記憶體 at24c256), 而不是 i2c 地址?
Wire.begin ...
正解!:lol
页:
[1]