I2CScanner

I2C bus scanner

I needed a way of checking the address of a device on the I2C bus, so I decided to come up with a simple prog to scan the I2C bus and to display the address on a serial monitor.

The subroutine will only display the address of the device and not the read address as this was pointed out to me by forum member Jerry, and wasn't needed as usually the read address is the address +1.

Also the prog will scan the bus for all the connected devices, and will show the results on the serial monitor, so it is very handy.

Device = 18F2550
Clock = 20        

// import libraries...   
Include "usart.bas"
Include "convert.bas"
Include "I2C.bas"

Dim nDevices As Byte

Sub ScanForDevices()
   Dim addrs, error As Byte

   nDevices = 0 ' reset 

   For addrs = 0 To 126 Step 2
      I2C.Start()
      I2C.WriteByte(addrs)
      I2C.Stop()

      If (I2C.NotAcknowledged = true) Then
      	error = 1    ' no device
      Else
      	error = 0    ' device detected
      EndIf 

      If error = 0 Then   ' no error we have found a device.
         USART.Write("$", HexToStr(addrs), 13, 10)
         Inc(nDevices)    ' found a device so add number of device.
      End If

      ' add a little delay betweens transactions for some slow slave devices
      DelayUS(100)
   Next

   USART.Write(DecToStr(nDevices), " I2C device(s) found", 13, 10)
End Sub

// init I2C... 
   I2C.Initialize(I2C_100_KHZ)

// start serial...
   USART.SetBaudrate(br19200)
   USART.Write("I2C Scanner", 13, 10)
   USART.Write("By Gavin Wiggett (Bitfogav)", 13, 10)

// main prog loop...
While true 
   USART.Write("Scanning for Devices..", 13, 10)
   ScanForDevices()
   DelayMS(5000)  ' 5sec delay between bus reads. 
Wend

Note: This sample code doesn't include setting IO pins when using I2C, some devices default there IO pins to analog. check out this topic post https://www.sfcompiler.co.uk/phpBB3/viewtopic.php?f=4&t=2154