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

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;
    }
}