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);
}
}
试试:
Wire.beginTransmission(0x4A);//地址+写入,高电平 1001 011x;低电平 1001 010x(前7位地址,最后一位是R/W) Ansifa 发表于 2017-6-15 20:51
试试:
Wire.beginTransmission(0x4A);//地址+写入,高电平 1001 011x;低电平 1001 010x(前7位地址,最 ...
谢谢!我也在git上找到一个例程,就像你说的,只取前7位。但是我有点想不通,最后一位不设置的话那arduino能自己判断是要读还是写吗? urdxg 发表于 2017-6-15 21:23
谢谢!我也在git上找到一个例程,就像你说的,只取前7位。但是我有点想不通,最后一位不设置的话那arduin ...
IIC通用协议就是这样定义的,前面七位地址,在最后一位R就1,W就0,Arduino一般自动处理。读写肯定是知道的啊,write的时候肯定是写咯,read读。。。。beginTransmission只是把前七位记下来了,并不是执行完就忘掉的 那这是arduino编程方式上的不同吗?如果是其他单片机,像stm是不是要加上后面一位读写的?
页:
[1]