I2C-соединение между arduino due и arduino mega 2560

Я пытаюсь связать мегапиксель через I2C. Я сделал:

  • земли общие.
  • SCL / SDA на мегах 2560 (не 20/21) подключаются к SCL1 / SDA1 в срок. SCL / SDA должного (20/21) подключены к imu bno055, который работает нормально.
  • подтягивающие резисторы не подключены.

на мега делаю:

#include <Time.h>
#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <EasyTransferI2C.h>

EasyTransferI2C ET_GPS_data; 
struct SEND_DATA_STRUCTURE{
  double GPS_la;
  double GPS_lo;
  double GPS_alt;
};

SEND_DATA_STRUCTURE GPS_data;
#define I2C_SLAVE_ADDRESS 9

SoftwareSerial mySerial(PIN_TX,PIN_RX);
DFRobot_SIM808 sim808(&mySerial);

double GPS_la = 0.0;
double GPS_lo = 0.0;
double GPS_alt = 0.0;
#define GPS_Sampling_Time_ms 20
unsigned long currentMillis_GPS = 0;
unsigned long previousMillis_GPS = 0;

void getGPS();

void setup() {
  mySerial.begin(9600);
  Wire.begin();

  // ******** Initialize sim808 module *************
  while(!sim808.init())
  {
     delay(1000);
  }
  delay(3000);

  if(sim808.attachGPS()){
     //Serial.println("Open the GPS power success");
  }else{
     //Serial.println("Open the GPS power failure");
  }
  ET_GPS_data.begin(details(GPS_data), &Wire);

}

void loop() {
  currentMillis_GPS = millis();
  if (currentMillis_GPS - previousMillis_GPS > GPS_Sampling_Time_ms) {
    getGPS();
    sim808.detachGPS();
    previousMillis_GPS = currentMillis_GPS;
    ET_GPS_data.sendData(I2C_SLAVE_ADDRESS);
  }
  GPS_data.GPS_la = GPS_la;
  GPS_data.GPS_lo = GPS_lo;
  GPS_data.GPS_alt = GPS_alt;
}

void getGPS(){ 
  while(!sim808.attachGPS()){}
  delay(80);
    
  while(!sim808.getGPS()){}
  GPS_la = sim808.GPSdata.lat;
  GPS_lo = sim808.GPSdata.lon;
  GPS_alt = sim808.GPSdata.altitude;
}

в срок:

#include <Arduino.h>
#include <Wire.h>
#include <EasyTransferI2C.h>
EasyTransferI2C ET_GPS_data; 
struct RECEIVE_DATA_STRUCTURE{
  double GPS_la;
  double GPS_lo;
  double GPS_alt;
};
RECEIVE_DATA_STRUCTURE GPS_data;
double GPS_la = 0.1;
double GPS_lo = 0.1;
double GPS_alt = 0.1;
#define GPS_Sampling_Time_ms 100
unsigned long currentMillis_GPS = 0;
unsigned long previousMillis_GPS = 0;

void setup() {
 Serial.begin(57600);
 Wire1.begin(I2C_SLAVE_ADDRESS);
 ET_GPS_data.begin(details(GPS_data), &Wire1);
 Wire1.onReceive(receive);
}

void loop() {
if(ET_GPS_data.receiveData()){
    GPS_la = GPS_data.GPS_la;
    GPS_lo = GPS_data.GPS_lo;
    GPS_alt = GPS_data.GPS_alt;
    Serial.println(GPS_alt);
  }
}

без i2c обе платы работают нормально. Что я делаю неправильно? это только потому, что у меня нет подтягивающих резисторов? и если да, как мне их добавить?

РЕДАКТИРОВАТЬ: я пошел по другому пути и вместо этого использовал последовательное соединение.


person Atta Oveisi    schedule 02.01.2021    source источник


Ответы (1)


Во-первых, попробуйте установить подтягивающий резистор в любое соединение I2C. Во-вторых, вы должны отметить, что Due работает при 3,3 В, а Mega - при 5 В. следовательно, между этими двумя устройствами I2C должен быть переключатель уровня напряжения (от 3,3 В до 5 В).

person Mansour Torabi    schedule 16.01.2021
comment
Конечно, я заметил, что последовательное соединение лучше соответствует моим требованиям, и перешел на него. - person Atta Oveisi; 18.01.2021
comment
@AttaOveisi Тем не менее, вам следует подумать о переключателе уровня, поскольку обе ваши платы работают при разных рабочих напряжениях. Вы можете навсегда повредить свой Due. - person Kani; 14.05.2021