urdxg 发表于 2017-6-15 18:54:13

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

我用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);
}

}

Ansifa 发表于 2017-6-15 20:51:46

试试:
Wire.beginTransmission(0x4A);//地址+写入,高电平 1001 011x;低电平 1001 010x(前7位地址,最后一位是R/W)

urdxg 发表于 2017-6-15 21:23:14

Ansifa 发表于 2017-6-15 20:51
试试:
Wire.beginTransmission(0x4A);//地址+写入,高电平 1001 011x;低电平 1001 010x(前7位地址,最 ...

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

Ansifa 发表于 2017-6-15 21:28:01

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

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

urdxg 发表于 2017-6-16 08:28:23

那这是arduino编程方式上的不同吗?如果是其他单片机,像stm是不是要加上后面一位读写的?
页: [1]
查看完整版本: Arduino 用IIC读取传感器MAX44009失败,无法发送地址