Teensy 3.1: Problem using I2C on pins 29 & 30

Status
Not open for further replies.

maxbot

Active member
Hello guys,
I need you help. I am using the i2c_t3 library on the Teensy 3.1 to talk to my MLX90614 temperature sensor.
On the normal I2C pins (18 & 19), it does work without any problem. But as those are needed for the UTFT library, I was forced to switched to 29 & 30.
SDA is connected to 30, SCL to 29.
However, the sensor gives me no output on those two. What I did on software side is to change the pins inside the constructor from "I2C_PINS_18_19" to "I2C_PINS_29_30"
and replace "Wire" with "Wire1". Here is the code (which worked fine with pins 18 and 19):

Code:
#include "MLX90614.h"

void MLX90614::initialise() {
	Wire1.begin(I2C_MASTER, 0x00, I2C_PINS_29_30, I2C_PULLUP_INT, I2C_RATE_100);
	delay(5);
	temperature = 0;
	ambient = 0;
}

void MLX90614::measure(int TaTo) {
	int rawData = getRawData(TaTo);
	double tempData = (rawData * 0.02) - 0.01;
	tempData -= 273.15;
	if (TaTo)
		ambient = (float) tempData;
	else
		temperature = (float) tempData;
}

int MLX90614::getRawData(int TaTo) {
	// Store the two relevant bytes of data for temperature
	byte dataLow = 0x00;
	byte dataHigh = 0x00;
	Wire1.beginTransmission(0x5A);
	if (TaTo)
		Wire1.send(0x06); //measure ambient temp
	else
		Wire1.send(0x07); // measure objec temp
	Wire1.endTransmission(I2C_NOSTOP);
	Wire1.requestFrom(0x5A, 2);
	dataLow = Wire1.read();
	dataHigh = Wire1.read();
	Wire1.endTransmission();
	int tempData = (((dataHigh & 0x007F) << 8) + dataLow);
	return tempData;
}

float MLX90614::getAmbient() {
	measure(1);
	return ambient;
}

float MLX90614::getTemperature() {
	measure(0);
	return temperature;
}

Have I missed something ? Maybe I must change some port registers to activate I2C on 29 & 30 ?
Thanks a lot for your help :)
 
In theory (since I haven't tried it with these pins) you can do the same kind of thing to reassign these pins as was done for Serial2 pins 26 and 31 in your other post.
In this case we want to reassign pins 29 and 30 to the I2C function which is ALT2. This info is in the table on page 64 of http://cache.freescale.com/files/32bit/doc/data_sheet/K20P64M72SF1.pdf
Code:
  // reassign pins 29 and 30 to use the ALT2 configuration
  // which makes them  I2C pins - I2C1_SCL (pin29) and I2C1_SDA (pin30)
  CORE_PIN29_CONFIG = PORT_PCR_MUX(2);
  CORE_PIN30_CONFIG = PORT_PCR_MUX(2);
This code should also be in setup().

I hope this is right :)
Pete
 
Hi, I'm also trying to get readings from the MLX90614 temperature sensor using pins 29 and 30. Would you be willing to share the code that you eventually used to get this to work?

Cheers,

Evan
 
Status
Not open for further replies.
Back
Top