#!/usr/bin/env python
#
# ======================================================================
# i2cmdetect.py
#
# Program to detect I2C slaves that are attached directly to bus 0 or 1
# but also checks for slaves attached to a multiplexer (PCA 9516).
# CH1 = GPIO4, CH2 = GPIO17, CH3 = GPIO27, CH4 = GPIO22
#
# (C) tightDev.net 2014
# ======================================================================
#
import sys
import time
import os
import smbus
# Import GPIO module
try:
import RPi.GPIO as GPIO
except RuntimeError:
print("33[91mError importing RPi.GPIO!33[0m")
print("This is probably because you need superuser privileges. "
"You can achieve this by using 'sudo' to run this script.")
except:
print("33[91mError importing RPi.GPIO!33[0m")
print("Unexpected error: ", sys.exc_info()[0])
#end try
# Initialize GPIO
CH1 = 4
CH2 = 17
CH3 = 27
CH4 = 22
GPIO.setmode(GPIO.BCM) # use chip numbers
GPIO.setwarnings(False) # suppress already in use warnings
GPIO.setup(CH1, GPIO.OUT) # CH1 enable
GPIO.setup(CH2, GPIO.OUT) # CH2 enable
GPIO.setup(CH3, GPIO.OUT) # CH3 enable
GPIO.setup(CH4, GPIO.OUT) # CH4 enable
# Scanning routine
def PerformScan(I2C):
Found = False
for i in range(0x03, 0x78):
try:
I2C.write_quick(i)
print("33[92m Device found at " + hex(i).upper().replace("X", "x") + "33[0m")
Found = True
except:
pass
#end try
#next
if Found == False:
print(" no device found.")
#end if
#end def
# Loop through busses
for Bus in range(0,2):
try:
# Open I2C Bus
I2C = smbus.SMBus(Bus)
# Loop through multiplexer
for i in range(0, 5):
if i == 0: # direct bus scan
GPIO.output(CH1, False)
GPIO.output(CH2, False)
GPIO.output(CH3, False)
GPIO.output(CH4, False)
print("Scanning bus " + str(Bus) + " directly...")
PerformScan(I2C)
elif i == 1: # scan bus on channel 1
GPIO.output(CH1, True)
GPIO.output(CH2, False)
GPIO.output(CH3, False)
GPIO.output(CH4, False)
print("Scanning bus " + str(Bus) + " channel " + str(i) + "...")
PerformScan(I2C)
elif i == 2: # scan bus on channel 2
GPIO.output(CH1, False)
GPIO.output(CH2, True)
GPIO.output(CH3, False)
GPIO.output(CH4, False)
print("Scanning bus " + str(Bus) + " channel " + str(i) + "...")
PerformScan(I2C)
elif i == 3: # scan bus on channel 3
GPIO.output(CH1, False)
GPIO.output(CH2, False)
GPIO.output(CH3, True)
GPIO.output(CH4, False)
print("Scanning bus " + str(Bus) + " channel " + str(i) + "...")
PerformScan(I2C)
elif i == 4: # scan bus on channel 4
GPIO.output(CH1, False)
GPIO.output(CH2, False)
GPIO.output(CH3, False)
GPIO.output(CH4, True)
print("Scanning bus " + str(Bus) + " channel " + str(i) + "...")
PerformScan(I2C)
#end if
#next
except:
print("33[91mCan't access bus " + str(Bus) + "!33[0m")
#end try
#next
print("Done.")