shyjdn 发表于 2012-2-19 17:28:10

arduino I2C 读取寄存器中数据读出来的总是寄存器地址,未知错在哪里,请指教!

我最近做了一个I2C接口的测试,需要读取IC寄存区的数据。这个IC是红、绿、蓝颜色传感器。当光照到某物体时的光折光射到这个IC上的光电二极管时,通过感应、放大ADC转换,会有相应的数据保存到红、绿、蓝寄存器中,我需要读取其中的数据。
但是我读的总是寄存器的地址码,而不是数据。例如:
IC的设备地址是0x29; 其中一个寄存器的地址是0x12,按照说明书这个寄存器的内容根据IC的型号而定,内容应该是0x18。
可是我始终读不出这个数据来。请各位老师指导,谢谢!
比如我的程序为:(不相干的代码已经省略)
#include <Wire.h>

#define IC_address0x29
#define REG_ID 0x12

void setup()   
{
   Wire.begin();      
Serial.begin(9600);
}

void loop() {
int id_val=0;
id_val = read_register(REG_ID);
Serial.println(id_val,HEX);
delay(1000);
}

int read_register(unsigned char r){
   unsigned char v;
   Wire.beginTransmission(IC_address);
   Wire.send(r);
   Wire.endTransmission();
   delay(5);

Wire.requestFrom(IC_address,1);
while(Wire.available()>0) {
   v = Wire.receive();
   return v ;      
}
}
測試結果是“12”,如果我換一个寄存器地址,比如0x01的寄存器,则测试结果为“1”。这样始终读取的是我要读取的寄存器的地址,而不是寄存器的内容。更无法测试到IC感应红、绿、蓝数据了。未知我的程序错在哪里。请老师指点,不胜感谢!



shyjdn 发表于 2012-2-28 19:59:35

已經解決。这个IC在操作寄存器时需要在寄存器的最高位添加COMMAND,比如命令字是0x80,則操作0x01寄存器时为0x81。所以上面的#define REG_ID 0x12 改为#define REG_ID 0x82即可。

小黑 发表于 2012-7-28 01:58:47

COMMAND咋填的啊   

highplay86 发表于 2012-7-29 10:54:48

shyjdn 发表于 2012-2-28 19:59 static/image/common/back.gif
已經解決。这个IC在操作寄存器时需要在寄存器的最高位添加COMMAND,比如命令字是0x80,則操作0x01寄存器时为 ...

那是不是你操作REG_ID 0x12 的命令字是0x70?

0x70+0x12=0x82   ?....

shyjdn 发表于 2012-10-16 11:03:27

highplay86 发表于 2012-7-29 10:54 static/image/common/back.gif
那是不是你操作REG_ID 0x12 的命令字是0x70?

0x70+0x12=0x82   ?....

不好意思,很长时间没有上来了,今天才发现有人回复。是我的笔误。比如命令字是0x80,則操作0x01寄存器时为0x81。而上面的#define REG_ID 0x12 改为#define REG_ID 0x92即可。谢谢指出!
页: [1]
查看完整版本: arduino I2C 读取寄存器中数据读出来的总是寄存器地址,未知错在哪里,请指教!