Датчик давления Freescale MPL3115A2 I2C, связь с Arduino
У кого-нибудь есть опыт работы с датчиком давления MPL3115A2 Freescale I2C? Мне нужно использовать его в проекте, касающемся Arduino UNO r3, но я не могу правильно установить связь между ними. Вот мой код:
#include <Wire.h>
void setup(){
Serial.begin(9600);
/*Start communication */
Wire.begin();
// Put sensor as in Standby mode
Wire.beginTransmission((byte)0x60); //0x60 is sensor address
Wire.write((byte)0x26); //ctrl_reg
Wire.write((byte)0x00); //reset_reg
Wire.endTransmission();
delay(10);
// start sensor as Barometer Active
Wire.beginTransmission((byte)0x60);
Wire.write((byte)0x26); //ctrl_reg
Wire.write((byte)0x01); //start sensor as barometer
Wire.endTransmission();
delay(10);
}
void getdata(byte *a, byte *b, byte *c){
Wire.beginTransmission(0x60);
Wire.write((byte)0x01); // Data_PMSB_reg address
Wire.endTransmission(); //Stop transmission
Wire.requestFrom(0x60, 3); // "please send me the contents of your first three registers"
while(Wire.available()==0);
*a = Wire.read(); // first received byte stored here
*b = Wire.read(); // second received byte stored here
*c = Wire.read(); // third received byte stored here
}
void loop(){
byte aa,bb,cc;
getdata(&aa,&bb,&cc);
Serial.println(aa,HEX); //print aa for example
Serial.println(bb,HEX); //print bb for example
Serial.println(cc,HEX); //print cc for example
delay(5000);
}
Данные, которые я получаю: 05FB9 (например). Когда я изменяю адрес регистра (см. Wire.write((byte)0x01); // Data_PMSB_reg address
), Я ожидаю, что данные изменятся, но это не так! Можете ли вы объяснить это мне? Вы можете найти документацию и таблицы данных на веб-сайте NXP.
Я не могу правильно понять, как они общаются друг с другом. Я получил связь между Arduino и некоторыми другими датчиками I2C с тем же протоколом связи без каких-либо проблем.
1 ответ
Скорее всего, ваша проблема связана с тем, что часть Freescale требует повторного запуска I2C для чтения. Исходная двухпроводная библиотека Arduino (библиотека TWI, используемая в Wire) не поддерживала Repeated-Start.
Я знаю это, потому что мне пришлось переписать TWI для одного из моих проектов для поддержки Repeated-Start (с прерываниями, как Master, так и Slave). К сожалению, я никогда не удосужился загрузить свой код, но кто-то еще сделал по сути то же самое здесь (по крайней мере для Master, который вам нужен): http://dsscircuits.com/articles/arduino-i2c-master-library.html
Потеряйте библиотеку Wire и используйте вместо этого их библиотеку I2C.