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感应红、绿、蓝数据了。未知我的程序错在哪里。请老师指点,不胜感谢!
已經解決。这个IC在操作寄存器时需要在寄存器的最高位添加COMMAND,比如命令字是0x80,則操作0x01寄存器时为0x81。所以上面的#define REG_ID 0x12 改为#define REG_ID 0x82即可。 COMMAND咋填的啊 shyjdn 发表于 2012-2-28 19:59 static/image/common/back.gif
已經解決。这个IC在操作寄存器时需要在寄存器的最高位添加COMMAND,比如命令字是0x80,則操作0x01寄存器时为 ...
那是不是你操作REG_ID 0x12 的命令字是0x70?
0x70+0x12=0x82 ?.... 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]