Связь датчика давления 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 с тем же протоколом связи.


person 8bit_Biker    schedule 15.11.2012    source источник


Ответы (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.

person nox771    schedule 15.11.2012