LTC4316 - Single I2C/SMBus Address Translator

Features

  • Allows Multiple Slaves with the Same Address to Coexist on the Same Bus
  • Resistor Configurable Address Translation
  • No Software Programming Required
  • Compatible with SMBus, I2C and I2C Fast Mode
  • Pass-Through Mode Allows General Call Addressing
  • ±4kV HBM ESD Ruggedness
  • Level Translation for 2.5V, 3.3V and 5V Buses
  • Stuck Bus Timeout
  • Prevents SDA and SCL Corruption During Live Board Insertion and Removal
  • Support Bus Hot Swap™
  • 10-Lead MSOP and DFN 3mm × 3mm Packages

Typical Application

LTC4316 Typical Application
LTC4316 Typical Application

Description

The LTC®4316 enables the hardwired address of one or more I2C or SMBus slave devices to be translated to a different address. This allows slaves with the same hardwired address to coexist on the same bus. Only discrete resistors are needed to select the new address and no software programming is required. Up to 127 different address translations are available.

The LTC4316 incorporates a pass-through mode which disables the address translation and allows general call addressing by the master. The LTC4316 is designed to automatically recover from abnormal bus conditions like bus stuck low or premature STOP bits.

PART NUMBER NUMBER OF INPUT CHANNELS NUMBER OF OUTPUT CHANNELS
LTC4316 1 1
LTC4317 1 2
LTC4318 2 2

Packaging

CAD Symbols and Footprints: The downloadable Zip file below contains the schematic symbol and PCB footprints.

For complete and up to date package information and drawings, please refer to our packaging page

Part Number Package Code Temp Package
Drawing
RoHS
LTC4316CDD#PBF 3x3 DFN-10 DD C 05-08-1699 Yes
LTC4316CDD#TRPBF 3x3 DFN-10 DD C 05-08-1699 Yes
LTC4316CMS#PBF MS-10 MS C 05-08-1661 Yes
LTC4316CMS#TRPBF MS-10 MS C 05-08-1661 Yes
LTC4316IDD#PBF 3x3 DFN-10 DD I 05-08-1699 Yes
LTC4316IDD#TRPBF 3x3 DFN-10 DD I 05-08-1699 Yes
LTC4316IMS#PBF MS-10 MS I 05-08-1661 Yes
LTC4316IMS#TRPBF MS-10 MS I 05-08-1661 Yes


LTC4316 Package Drawing
LTC4316 Package Drawing

Order Info

  • Part numbers ending in PBF are lead free. Solder plated terminal finish (SnPb) versions are non-standard and special terms and conditions and pricing applies if available. Please contact LTC marketing for information.
  • Part numbers containing TR or TRM are shipped in tape and reel or 500 unit mini tape and reel, respectively
  • Please refer to our general ordering information or the product datasheet for more details

Package Variations and Pricing

Part Number Package Temp Price
(1-99)
Price
(1k)*
RoHS
LTC4316CDD#PBF 3x3 DFN-10 C $2.07 $1.45 Yes
LTC4316CDD#TRPBF 3x3 DFN-10 C $2.13 $1.51 Yes
LTC4316CMS#PBF MS-10 C $2.07 $1.45 Yes
LTC4316CMS#TRPBF MS-10 C $2.13 $1.51 Yes
LTC4316IDD#PBF 3x3 DFN-10 I $2.38 $1.67 Yes
LTC4316IDD#TRPBF 3x3 DFN-10 I $2.44 $1.73 Yes
LTC4316IMS#PBF MS-10 I $2.38 $1.67 Yes
LTC4316IMS#TRPBF MS-10 I $2.44 $1.73 Yes
Buy NowRequest Samples
* The USA list pricing shown is for BUDGETARY USE ONLY, shown in United States dollars (FOB USA per unit for the stated volume), and is subject to change. International prices may differ due to local duties, taxes, fees and exchange rates. For volume-specific price or delivery quotes, please contact your local Linear Technology sales office or authorized distributor.

Demo Boards

Linear Technology offers many demo boards free of charge to qualified customers. Contact your local sales office or distributor to inquire about a demo board. Certain demo boards are also available for sale via credit card on this website. Demo boards are for evaluation purposes only. It remains the customer’s responsibility to verify proper and reliable operation in the actual end application.

Part Number Description Price Documentation
DC2217A LTC4316 Demo Board | Single I2C/SMBus Address Translator (req. DC590 or DC2026) $25.00
DC2591A LTC4316 Demo Board | EasySMU: I2C Address Translator and Simple Multichannel Source Measurement Unit (req. DC2026 and 12V power supply) $50.00
Buy Now

Companion Boards

Part Number Description Price Documentation
DC2026C Linduino One Isolated USB Demo Board: An Arduino- and QuikEval-Compatible Code Development Platform $75.00
DC590B Isolated USB Serial Controller for Linear Technology QuikEval-Compatible Demo Boards $50.00
Buy Now
Click here to view our complete list of demo boards

Applications

  • I2C, SMBus Address Expansion
  • Address Translation
  • Servers
  • Telecom

Product Notifications

Please login to your MyLinear account for notifications of datasheet updates, new document releases and LTspice model announcements for your favorite products. If you do not have a MyLinear account you may Sign Up Now.

Forgot your password? Click here.
Need help? Email mylinear@linear.com with questions and comments.

Design Tools

Linduino

Linduino is an Arduino compatible platform for developing and distributing firmware libraries and code for SPI and I²C-compatible integrated circuits. The Linduino One board interfaces to more than 300 QuikEval demonstration cards, supporting a variety of product types including analog-to-digital converters (ADCs)digital-to-analog converters (DACs)power monitors, and more. Firmware libraries for individual devices are written in C and designed to be portable to a wide variety of processors and microcontrollers. Each library has a demonstration program that can be uploaded to the Linduino One platform to allow the circuit and software to be quickly and easily verified.

Click here for more information on Linduino

Code

Linduino is Linear Technology's Arduino compatible system for developing and distributing firmware libraries and example code for Linear Technology’s integrated circuits. The code below can be downloaded or copied and pasted into your project. Please visit the Linduino Home Page for demo board, manual and setup information.

This part is Code Supported: There is example code available for this part. The code below may rely on other drivers available in the full library.

Download LTC4316 - DC2217A.ino

/*!
DC2217A
LTC4316: Single/Dual I2C SMBUS ADDRESS REMAPPER

@verbatim

LTC4316 Remapper Menu
    1. Scan Bus for Addresses
    2. Control On Board DACs

Control On Board DACs:
    1. Turn on Through DAC
    2. Turn on Remapped DAC
    3. Turn off Through DAC
    4. Turn off Remapped DAC

NOTES
 Setup:
 Set the terminal baud rate to 115200 and select the newline terminator.
 Requires a power supply.
 Refer to demo manual DC2217A.

USER INPUT DATA FORMAT:
 decimal : 1024
 hex     : 0x400
 octal   : 02000  (leading 0 "zero")
 binary  : B10000000000
 float   : 1024.0

@endverbatim

http://www.linear.com/product/LTC4316

http://www.linear.com/product/LTC4316#demoboards

REVISION HISTORY
$Revision: 4437 $
$Date: 2015-12-01 08:26:42 -0800 (Tue, 01 Dec 2015) $

Copyright (c) 2013, Linear Technology Corp.(LTC)
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this
   list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
   this list of conditions and the following disclaimer in the documentation
   and/or other materials provided with the distribution.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

The views and conclusions contained in the software and documentation are those
of the authors and should not be interpreted as representing official policies,
either expressed or implied, of Linear Technology Corp.

The Linear Technology Linduino is not affiliated with the official Arduino team.
However, the Linduino is only possible because of the Arduino team's commitment
to the open-source community.  Please, visit http://www.arduino.cc and
http://store.arduino.cc , and consider a purchase that will help fund their
ongoing work.
 */

//! @defgroup LTC4316 LTC4316: Single/Dual I2C SMBUS ADDRESS REMAPPER

/*! @file
    @ingroup LTC4316
    Library for LTC4316: Single/Dual I2C SMBUS ADDRESS REMAPPER
*/

#include <Arduino.h>
#include "LT_I2C.h"
#include "UserInterface.h"
#include "QuikEval_EEPROM.h"
#include "Linduino.h"
#include <Wire.h>
#include <stdint.h>



static int8_t demo_board_connected;        //!< Set to 1 if the board is connected

const char ack_error[] = "Error: No Acknowledge. Check I2C Address.";    //!< Error message

const int LTC4316_OFFSET = 0x78;               //!< Demoboard offset. Change to correct value if EXT offset if chosen.
const int LTC2631_GLOBAL_ADDRESS = 0x73;       //!< Global address of LTC2631 DAC
const int LTC2631_JP_ADDRESS_1 = 0x12;         //!< Jumper Setting 1 on Demoboard
const int LTC2631_JP_ADDRESS_2 = 0x11;         //!< Jumper Setting 2 on Demoboard
const int LTC2631_JP_ADDRESS_3 = 0x10;         //!< Jumper Setting 3 on Demoboard
const int EEPROM_ADDRESS = 0x50;               //!< EEPROM Address on Demoboard

//! Initialize Linduino
void setup()
{
  char demo_name[] = "DC2217A";      // Demo Board Name stored in QuikEval EEPROM
  quikeval_I2C_init();              //! Configure the EEPROM I2C port for 100kHz
  quikeval_I2C_connect();           //! Connects to main I2C port
  Serial.begin(115200);             //! Initialize the serial port to the PC
  print_title();                    //! Print Title
  demo_board_connected = 1;
  if (!demo_board_connected)
  {
    Serial.println(F("Demo board not detected, will attempt to proceed"));
    demo_board_connected = true;
  }
  if (demo_board_connected)
  {
    print_prompt();
  }
}

//! Repeats Linduino Loop
void loop()
{

  int8_t ack = 0;                                             //! I2C acknowledge indicator
  static uint8_t user_command;                                //! The user input command
  if (demo_board_connected)                                   //! Do nothing if the demo board is not connected
  {
    if (Serial.available())                                   //! Do nothing if serial is not available
    {
      user_command = read_int();                              //! Read user input command
      if (user_command != 'm')
        Serial.println(user_command);
      Serial.println();
      ack = 0;
      switch (user_command)                                    //! Check user input.
      {
        case 1:
          menu_1_scan_addresses();                              //!< Perform I2C Address Scan
          break;
        case 2:
          ack |= menu_2_DAC();                                  //!< Control on board DACs
          break;
        default:
          Serial.println("Incorrect Option");
      }

      if (ack != 0)
        Serial.println(ack_error);
      Serial.print(F("*************************"));
      print_prompt();
    }
  }
}



// Function Definitions
//! Print the title block
void print_title()
{
  Serial.println(F("\n*****************************************************************"));
  Serial.print(F("* DC2156 Demonstration Program                                  *\n"));
  Serial.print(F("*                                                               *\n"));
  Serial.print(F("* This program demonstrates the functionality of the LTC4316    *\n"));
  Serial.print(F("* which is a Single/Dual I2C SMBus Remappper. The program       *\n"));
  Serial.print(F("* scans the addresses present on the bus and controls the       *\n"));
  Serial.print(F("* onboard remapped DACs to light LEDs                           *\n"));
  Serial.print(F("*                                                               *\n"));
  Serial.print(F("*****************************************************************\n"));
}

//! Print the main menu prompt
void print_prompt()
{
  Serial.print(F("\n1- Scan Bus for Addresses\n"));
  Serial.print(F("2- Control On Board DACs\n"));
  Serial.print(F("\n"));
  Serial.print(F("Enter a command: "));
}

//! Scan I2C Bus for addresses
void menu_1_scan_addresses()
{

  int maxAddr = 127;                                    //! Max Number for possible 7-bit address values
  int addrCount = 0;                                    //! Initialization of address count.

  for (int addr = 0x00; addr <= maxAddr; addr++)        //! Scan possible address values till max address number
  {
    int8_t ret= 0 ;                                    //! Initialize return bit variable
    if (i2c_start()!=0)                                        //! I2C START
    {
      Serial.print(F("Bus is Busy. Aborting..."));             //! Stop and abort scanning if bus is busy.
      break;
    }

    ret |= i2c_write((addr<<1)|I2C_WRITE_BIT);        //! Write the I2C 7 bit address with W bit
    i2c_stop();                                       //! I2C STOP
    if (ret==0)                                       //! If acknolwege recieved on bus, print address
    {
      addrCount++;                                    //! Increment address count
      Serial.print(F("\n Address Found - #"));
      Serial.print(addrCount);                        //! Print address count
      Serial.print(F(": "));
      Serial.print(addr, HEX);                        //! Print address

      switch (addr)                                   //! Switch statement to identify factory set possible address values. Note: If external address has the same address as any of the jumper settings
        //! it might register as one of the switch statements
      {
        case EEPROM_ADDRESS:
          Serial.print(F(" - Onboard EEPROM Address."));
          break;
        case (LTC2631_GLOBAL_ADDRESS):
          Serial.print(F(" - Through Global Address of LTC2631"));
          break;
        case (LTC2631_GLOBAL_ADDRESS ^ LTC4316_OFFSET):
          Serial.print(F(" - Remapped Global Address of LTC2631"));
          break;
        case (LTC2631_JP_ADDRESS_1):
          Serial.print(F(" - Through Jumper Setting of Onboard LTC2631"));
          break;
        case (LTC2631_JP_ADDRESS_2):
          Serial.print(F(" - Through Jumper Setting of Onboard LTC2631"));
          break;
        case (LTC2631_JP_ADDRESS_3):
          Serial.print(F(" - Through Jumper Setting of Onboard LTC2631"));
          break;
        case (LTC2631_JP_ADDRESS_1 ^ LTC4316_OFFSET):
          Serial.print(F(" - Remapped Address of Onboard LTC2631 Based On Jumper Setting 12h"));
          break;
        case (LTC2631_JP_ADDRESS_2 ^ LTC4316_OFFSET):
          Serial.print(F(" - Remapped Address of Onboard LTC2631 Based On Jumper Setting 11h"));
          break;
        case (LTC2631_JP_ADDRESS_3 ^ LTC4316_OFFSET):
          Serial.print(F(" - Remapped Address of Onboard LTC2631 Based On Jumper Setting 11h"));
          break;
        default:
          Serial.print(F(" - Unknown Address Found. Possible external device connected and/or Non-Factory address selected."));
          break;
      }
      Serial.print("\n\n");
    }
  }

  if (addrCount == 0)
    Serial.println(F("Nothing Found on Bus"));
}

//! DAC Control Menu
uint8_t menu_2_DAC()
{
//! @return Returns the state of the acknowledge bit after the I2C address write. 0=acknowledge, 1=no acknowledge.

  int ack = 0;                                                    //! I2C acknowledge indicator
  static uint8_t user_command;                                    //! The user input command
  int maxAddr = 127;                                              //! Max Number for possible 7-bit address values
  int addrCount = 0;                                              //! Initialization of address count.
  uint8_t LTC2631_CMD_WRITE_UPDATE = 0x30;                        //! LTC2631 Write and Update Command Byte
  uint16_t LTC2631_FULLSCALE_OUTPUT = 0xFFC0;                     //! LTC2631 10 bit fullscale input value
  uint8_t through_address = 0;                                    //! Through address value
  uint8_t remapped_address = 0;                                   //! Remapped address value

  for (int addr = 0x00; addr <= maxAddr; addr++)
  {
    int8_t ret= 0 ;

    if (i2c_start()!=0)                                        //I2C START
    {
      Serial.print(F("Bus is Busy. Aborting..."));             //Stop and abort scanning if bus is busy.
      break;
    }

    ret |= i2c_write((addr<<1)|I2C_WRITE_BIT);        //Write the I2C 7 bit address with W bit
    i2c_stop();                                       //I2C STOP
    if (ret==0)                                       // Returns 1 if failed
    {
      switch (addr)                                   //Switch statement to assign addresses based on default demoboard configuration. External addresses are not supported and could cause conflict.
      {
        case LTC2631_JP_ADDRESS_1:
        case LTC2631_JP_ADDRESS_2:
        case LTC2631_JP_ADDRESS_3:
          through_address = addr;
          break;
        case LTC2631_JP_ADDRESS_1 ^ LTC4316_OFFSET:
        case LTC2631_JP_ADDRESS_2 ^ LTC4316_OFFSET:
        case LTC2631_JP_ADDRESS_3 ^ LTC4316_OFFSET:
          remapped_address = addr;
          break;
        case EEPROM_ADDRESS:
        case LTC2631_GLOBAL_ADDRESS:
        case LTC2631_GLOBAL_ADDRESS ^ LTC4316_OFFSET:
          break;
        default:
          Serial.print(F(" - Unknown Address Found. Possible external device connected and/or Non-Factory address selected."));
          break;
      }
      Serial.print("\n\n");
    }
  }

  do
  {
    Serial.print(F("*************************\n\n"));
    Serial.print(F("Turn on DACs\n"));
    Serial.print(F("1-Turn on Through DAC\n"));
    Serial.print(F("2-Turn on Remapped DAC\n"));
    Serial.print(F("3-Turn off Through DAC\n"));
    Serial.print(F("4-Turn off Through DAC\n"));
    Serial.print(F("m-Main Menu\n\n"));
    Serial.print(F("Enter a command: "));

    user_command = read_int();                              //! Read user input command
    if (user_command != 'm')
      Serial.println(user_command);
    if (user_command == 'm')
      Serial.println("m");
    Serial.println();
    ack = 0;
    switch (user_command)                                         //! Switch statement for DAC menu
    {
      case 1:
        ack |= i2c_write_word_data(through_address,LTC2631_CMD_WRITE_UPDATE, LTC2631_FULLSCALE_OUTPUT);       //! I2C write command to turn Through DAC on
        break;
      case 2:
        ack |= i2c_write_word_data(remapped_address,LTC2631_CMD_WRITE_UPDATE, LTC2631_FULLSCALE_OUTPUT);      //! I2C write command to turn Remapped DAC on
        break;
      case 3:
        ack |= i2c_write_word_data(through_address, LTC2631_CMD_WRITE_UPDATE, 0x0000);                        //! I2c write command to turn through DAC off
        break;
      case 4:
        ack |= i2c_write_word_data(remapped_address, LTC2631_CMD_WRITE_UPDATE, 0x0000);                        //! I2C write command to turn remapped DAC off
      default:
        if (user_command != 'm')
          Serial.println("Incorrect Option");
    }
  }
  while (!(user_command == 'm' || (ack)));
  if (ack != 0)
    Serial.println(ack_error);
  return ack;
}

Technical Support