I am trying to interface a mega with a due per I2C. I have done:
on mega I do:
#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;
}
on due:
#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);
}
}
without the i2c, both of the boards work fine. What am I doing wrong? is this just because I have no pull up resistors? and if yes, how should I add it/them?
EDIT: I have followed another path and used serial connection instead.
Firstly, try to put pull up resistor in any I2C connection, Secondly, you should note that Due runs at 3.3V and Mega runs at 5V. therefore, there should be a voltage level shifter (3.3V to 5V) between these two I2C devices.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.