极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13852|回复: 4

Arduino 用IIC读取传感器MAX44009失败,无法发送地址

[复制链接]
发表于 2017-6-15 18:54:13 | 显示全部楼层 |阅读模式
我用uno和mega2560(相互能进行IIC通信)都测试了以下代码,传感器是MAX44009(opt3001也测过),读写时地址如下:A0引脚我接了板子上的GND,所以写入地址是0x94.

但是程序运行后:程序内容主要是收到电脑端任一字符就开始一次传感器数据采集。
我发送一个字符后读取传感器,总是返回2,即在地址发送时接收到NACK信号,一直这样,困扰我两天了,求大神指教!

MAX44009手册:http://www.doc88.com/p-697588302188.html

程序:
#include<Wire.h>
void setup() {
  // put your setup code here, to run once:
  Wire.begin();
  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
  unsigned int error=0, luxData, msb=0, lsb=0,m=0, n=0;

  if( Serial.available() )
  {           
    luxData = Serial.read();    //随意接受一个字符,开始读取传感器
    Wire.beginTransmission(0x94);  //地址+写入,高电平 1001 011x;低电平 1001 010x
    m = Wire.write(0x02);              //配置器地址:02h
    n = Wire.write(0x42);               //                     
    error = Wire.endTransmission();   //判断通信时哪里出错
    delay(200);  
    if (error != 0)
      {
        Serial.println(error);
      }
    else
      {
        Wire.beginTransmission(0x95);    //地址+读取
        Wire.write(0x03);               //寄存器地址
        Wire.endTransmission(false);
        Wire.requestFrom(0x94, 1);      
        msb = Wire.read();

        Wire.beginTransmission(0x95);      //读取
        Wire.write(0x04);                   /低位寄存器地址
        Wire.endTransmission(false);
        Wire.requestFrom(0x94, 1);
        lsb = Wire.read();

      }

    msb = (msb >>4 ) & 0x0f;
    lsb= ((msb << 4) & 0xf0) | lsb;
    Serial.println(msb);
    Serial.println(lsb);
  }

}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2017-6-15 20:51:46 | 显示全部楼层
试试:
Wire.beginTransmission(0x4A);  //地址+写入,高电平 1001 011x;低电平 1001 010x(前7位地址,最后一位是R/W)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-15 21:23:14 | 显示全部楼层
Ansifa 发表于 2017-6-15 20:51
试试:
Wire.beginTransmission(0x4A);  //地址+写入,高电平 1001 011x;低电平 1001 010x(前7位地址,最 ...

谢谢!我也在git上找到一个例程,就像你说的,只取前7位。但是我有点想不通,最后一位不设置的话那arduino能自己判断是要读还是写吗?
回复 支持 反对

使用道具 举报

发表于 2017-6-15 21:28:01 | 显示全部楼层
urdxg 发表于 2017-6-15 21:23
谢谢!我也在git上找到一个例程,就像你说的,只取前7位。但是我有点想不通,最后一位不设置的话那arduin ...

IIC通用协议就是这样定义的,前面七位地址,在最后一位R就1,W就0,Arduino一般自动处理。读写肯定是知道的啊,write的时候肯定是写咯,read读。。。。beginTransmission只是把前七位记下来了,并不是执行完就忘掉的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-16 08:28:23 | 显示全部楼层
那这是arduino编程方式上的不同吗?如果是其他单片机,像stm是不是要加上后面一位读写的?
回复 支持 反对

使用道具 举报

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

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

Archiver|联系我们|极客工坊

GMT+8, 2024-3-28 19:16 , Processed in 0.044032 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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