极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17675|回复: 4

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

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

#define IC_address  0x29
#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感应红、绿、蓝数据了。未知我的程序错在哪里。请老师指点,不胜感谢!



回复

使用道具 举报

 楼主| 发表于 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咋填的啊   
回复 支持 反对

使用道具 举报

发表于 2012-7-29 10:54:48 | 显示全部楼层
shyjdn 发表于 2012-2-28 19:59
已經解決。这个IC在操作寄存器时需要在寄存器的最高位添加COMMAND,比如命令字是0x80,則操作0x01寄存器时为 ...

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

0x70+0x12=0x82   ?....
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-16 11:03:27 | 显示全部楼层
highplay86 发表于 2012-7-29 10:54
那是不是你操作REG_ID 0x12 的命令字是0x70?

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

不好意思,很长时间没有上来了,今天才发现有人回复。是我的笔误。比如命令字是0x80,則操作0x01寄存器时为0x81。而上面的#define REG_ID 0x12 改为#define REG_ID 0x92即可。谢谢指出!
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 23:58 , Processed in 0.043498 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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