Hi,
I'm trying to use the Teensy 3.6 to read an array of sensors using the i2c_t3 library. In i2c_t3.h there are alternative I2C pins defined for the teensy 3.6, such as I2C_PINS_16_17.
I've set the pins of Wire3 to these however I get nothing when trying to read from them. Are the pins of Wire3 fixed at 56 and 57? I'm trying to avoid using these due to their awkward positioning on the back of the board.
Below is the I2C Scanner I'm using to test the sensors. Any help would be greatly appreciated.
Regards,
Max
I'm trying to use the Teensy 3.6 to read an array of sensors using the i2c_t3 library. In i2c_t3.h there are alternative I2C pins defined for the teensy 3.6, such as I2C_PINS_16_17.
I've set the pins of Wire3 to these however I get nothing when trying to read from them. Are the pins of Wire3 fixed at 56 and 57? I'm trying to avoid using these due to their awkward positioning on the back of the board.
Below is the I2C Scanner I'm using to test the sensors. Any help would be greatly appreciated.
Regards,
Max
Code:
// -------------------------------------------------------------------------------------------
// I2C Advanced Bus Scanner
// -------------------------------------------------------------------------------------------
//
// This creates an I2C master device which will scan the address space and report all
// devices which ACK. It does not attempt to transfer data, it only reports which devices
// ACK their address.
//
// This version will sweep all existing I2C buses (eg. Wire, Wire1, Wire2, Wire3).
//
// Pull the control pin low to initiate the scan. Result will output to Serial.
//
// This example code is in the public domain.
// -------------------------------------------------------------------------------------------
#include <i2c_t3.h>
// -------------------------------------------------------------------------------------------
// Defines - modify as needed for sweep range and bus pin config
//
#define TARGET_START 0x01
#define TARGET_END 0x7F
#define WIRE_PINS I2C_PINS_18_19
#if defined(__MKL26Z64__) // LC
#define WIRE1_PINS I2C_PINS_22_23
#endif
#if defined(__MK20DX256__) // 3.1-3.2
#define WIRE1_PINS I2C_PINS_29_30
#endif
#if defined(__MK64FX512__) || defined(__MK66FX1M0__) // 3.5/3.6
#define WIRE1_PINS I2C_PINS_37_38
#define WIRE2_PINS I2C_PINS_3_4
#endif
#if defined(__MK66FX1M0__) // 3.6
#define WIRE3_PINS I2C_PINS_16_17
#endif
// -------------------------------------------------------------------------------------------
// Function prototypes
void scan_bus(i2c_t3& Wire, uint8_t all);
void print_bus_status(i2c_t3& Wire);
void print_scan_status(struct i2cStruct* i2c, uint8_t target, uint8_t& found, uint8_t all);
// -------------------------------------------------------------------------------------------
void setup()
{
//Configure MUX enable pins (Enable is Low)
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
pinMode(8,OUTPUT);
//Enable All MUX Chips
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);
digitalWrite(8,LOW);
//Config MUX Select Lines
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
//***************************************************************
//Select MUX Lines
digitalWrite(10, HIGH);
digitalWrite(11, LOW);
pinMode(LED_BUILTIN,OUTPUT); // LED
pinMode(12,INPUT_PULLUP); // pull pin 12 low to show ACK only results
pinMode(24,INPUT_PULLUP); // pull pin 13 low for a more verbose result (shows both ACK and NACK)
// Setup for Master mode, all buses, external pullups, 400kHz, 10ms default timeout
//
Wire.begin(I2C_MASTER, 0x00, WIRE_PINS, I2C_PULLUP_EXT, 400000);
Wire.setDefaultTimeout(10000); // 10ms
#if I2C_BUS_NUM >= 2
Wire1.begin(I2C_MASTER, 0x00, WIRE1_PINS, I2C_PULLUP_EXT, 400000);
Wire1.setDefaultTimeout(10000); // 10ms
#endif
#if I2C_BUS_NUM >= 3
Wire2.begin(I2C_MASTER, 0x00, WIRE2_PINS, I2C_PULLUP_EXT, 400000);
Wire2.setDefaultTimeout(10000); // 10ms
#endif
#if I2C_BUS_NUM >= 4
Wire3.begin(I2C_MASTER, 0x00, WIRE3_PINS, I2C_PULLUP_EXT, 400000);
Wire3.setDefaultTimeout(10000); // 10ms
#endif
Serial.begin(115200);
}
// -------------------------------------------------------------------------------------------
void loop()
{
// Scan I2C addresses
//
// if(digitalRead(12) == LOW || digitalRead(24) == LOW)
{
uint8_t all = (digitalRead(24) == LOW);
Serial.print("---------------------------------------------------\n");
Serial.print("Bus Status Summary\n");
Serial.print("==================\n");
Serial.print(" Bus Mode SCL SDA Pullup Clock\n");
print_bus_status(Wire);
#if I2C_BUS_NUM >= 2
print_bus_status(Wire1);
#endif
#if I2C_BUS_NUM >= 3
print_bus_status(Wire2);
#endif
#if I2C_BUS_NUM >= 4
print_bus_status(Wire3);
#endif
scan_bus(Wire, all);
#if I2C_BUS_NUM >= 2
scan_bus(Wire1, all);
#endif
#if I2C_BUS_NUM >= 3
scan_bus(Wire2, all);
#endif
#if I2C_BUS_NUM >= 4
scan_bus(Wire3, all);
#endif
Serial.print("---------------------------------------------------\n\n\n");
delay(2000); // delay to space out tests
}
}
// -------------------------------------------------------------------------------------------
// scan bus
//
void scan_bus(i2c_t3& Wire, uint8_t all)
{
uint8_t target, found = 0;
Serial.print("---------------------------------------------------\n");
if(Wire.bus == 0)
Serial.print("Starting scan: Wire\n");
else
Serial.printf("Starting scan: Wire%d\n",Wire.bus);
digitalWrite(LED_BUILTIN,HIGH); // LED on
for(target = TARGET_START; target <= TARGET_END; target++) // sweep addr, skip general call
{
Wire.beginTransmission(target); // slave addr
Wire.endTransmission(); // no data, just addr
print_scan_status(Wire.i2c, target, found, all);
}
digitalWrite(LED_BUILTIN,LOW); // LED off
if(!found) Serial.print("No devices found.\n");
}
// -------------------------------------------------------------------------------------------
// print bus status
//
void print_bus_status(i2c_t3& Wire)
{
struct i2cStruct* i2c = Wire.i2c;
if(Wire.bus == 0)
Serial.print("Wire ");
else
Serial.printf("Wire%d ",Wire.bus);
switch(i2c->currentMode)
{
case I2C_MASTER: Serial.print("MASTER "); break;
case I2C_SLAVE: Serial.print(" SLAVE "); break;
}
Serial.printf(" %2d %2d ", Wire.i2c->currentSCL, Wire.i2c->currentSDA);
switch(i2c->currentPullup)
{
case I2C_PULLUP_EXT: Serial.print("External "); break;
case I2C_PULLUP_INT: Serial.print("Internal "); break;
}
Serial.printf("%d Hz\n",i2c->currentRate);
}
// -------------------------------------------------------------------------------------------
// print scan status
//
void print_scan_status(struct i2cStruct* i2c, uint8_t target, uint8_t& found, uint8_t all)
{
switch(i2c->currentStatus)
{
case I2C_WAITING: Serial.printf("Addr: 0x%02X ACK\n",target); found=1; break;
case I2C_ADDR_NAK: if(all) { Serial.printf("Addr: 0x%02X\n",target); } break;
case I2C_TIMEOUT: if(all) { Serial.printf("Addr: 0x%02X Timeout\n",target); } break;
default: break;
}
}