Go Down

Topic: Due i2c Serial conflict (Read 361 times) previous topic - next topic

rstuart

I have another board sending 3-byte packets of data to the Due Serial1 port at about 100 packets/second.  I also am reading an IMU via i2c at about 200/sec.  This always crashes after a few seconds.  The crashes only occur when data is being received on the serial port.  I have similar results on the Serial2 port.  Here is a code snippit that give this result:
Code: [Select]


#include <Wire.h>
#include <LSM6.h>

#define ADDRESS 0b1101011
#define OUTX_L_G 0x22
#define OUTX_L_XL 0x28

 
LSM6 lsm6;
int z = 0;

void setup() {
  Serial1.begin(115200);    // UP Board
  Serial.begin(115200);
 
  pinMode(13,OUTPUT);  // Status LED, also blue LED
  Wire.begin();
  if (!lsm6.init())   Serial.println("IMU initialize failed!");

  lsm6.enableDefault();
  lsm6.writeReg(LSM6::INT1_CTRL, 0X02); // Accel data ready on INT1
  lsm6.writeReg(LSM6::INT2_CTRL, 0X01); // Gyro data ready on INT2
  lsm6.writeReg(LSM6::CTRL2_G, 0X5C);   // Gyro 2000fs, 208hz
  lsm6.writeReg(LSM6::CTRL1_XL, 0X50);  // Accel 2g, 208hz

} // end setup()


void loop() { //Main Loop
  static unsigned int tRead = 0;
  while(true) {
   
    while (Serial1.available()) {
      byte b = Serial1.read();
      Serial.print(b); Serial.print(" ");
      if (b == 0) Serial.println();
     }
     
      unsigned int  t = micros();
      if (t > tRead) {
        tRead = t + 5000;
        readGyro();
        readAcc();
        Serial.println(z);
     }
  }

} // End loop(). 



void readGyro(void)
{
  Wire.beginTransmission(ADDRESS);
  Wire.write(OUTX_L_G);
  Wire.endTransmission();
  Wire.requestFrom(ADDRESS, (uint8_t)6);
  while (Wire.available() < 6) ;
  uint8_t xlg = Wire.read();
  uint8_t xhg = Wire.read();
  uint8_t ylg = Wire.read();
  uint8_t yhg = Wire.read();
  uint8_t zlg = Wire.read();
  uint8_t zhg = Wire.read();

  // combine high and low bytes
  z = (int16_t)(zhg << 8 | zlg);
}


void readAcc(void)
{
  Wire.beginTransmission(ADDRESS);
  Wire.write(OUTX_L_XL);
  Wire.endTransmission();
  Wire.requestFrom(ADDRESS, (uint8_t)6);

  while (Wire.available() < 6) ;
 
  uint8_t xla = Wire.read();
  uint8_t xha = Wire.read();
  uint8_t yla = Wire.read();
  uint8_t yha = Wire.read();
  uint8_t zla = Wire.read();
  uint8_t zha = Wire.read();
}



the output looks like this:
Code: [Select]

151 48 0
151 48 0
151 48 0
-18
151 48 0
151 48 0
-20
151 48 0
151 48 0
151 48 0
-20
151 48 0
151 48 0
-18
151 48 0
151 48 0
151 48 0
-19
151 48 0
151 48 0
-21
151 48 0
151 48 0
151 48 0



Any ideas?  It sure feels like a library bug to me.  Should I file a bug report?

bos1714

Hello there!

Have you tried getting each library to work independently? That would be the best way to identify if there is a clash between the two.
Time line? Time isn't made out of lines. It is made out of circles. That is why clocks are round.

rstuart

Yes.  Both libraries work just fine by themselves.  I have recently discovered a previous post, I2C interference by serial communication, that may be relevant.  I will pursue that and post an update.

mdbirley

Hi
I have a gps connected to the serial2 port on a Due and an I2C LCD from Robotshop that is supposed to work with the Due. The GPS data crashes and LCD hangs after a short period 5 to 20 seconds. I saw a solution on a 2015 post suggesting 330 ohm resisters in series on the I2C inputs. Can anyone confirm that this will work
Thanks

ard_newbie


I can't confirm that this will work, but adding a resistor in serie will not harm the uc but will smooth the signal in order to reduce EMI spikes on the bus.

mdbirley

Thanks for your response. I will try it out
regards

Go Up