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