2022-08-29 09:17:44 -04:00
|
|
|
|
|
|
|
[![Arduino CI](https://github.com/RobTillaart/I2C_SCANNER/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
|
|
|
|
[![Arduino-lint](https://github.com/RobTillaart/I2C_SCANNER/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/I2C_SCANNER/actions/workflows/arduino-lint.yml)
|
|
|
|
[![JSON check](https://github.com/RobTillaart/I2C_SCANNER/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/I2C_SCANNER/actions/workflows/jsoncheck.yml)
|
|
|
|
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/I2C_SCANNER/blob/master/LICENSE)
|
|
|
|
[![GitHub release](https://img.shields.io/github/release/RobTillaart/I2C_SCANNER.svg?maxAge=3600)](https://github.com/RobTillaart/I2C_SCANNER/releases)
|
|
|
|
|
|
|
|
|
|
|
|
# I2C_SCANNER
|
|
|
|
|
|
|
|
Arduino class to implement an I2C scanner.
|
|
|
|
|
|
|
|
|
|
|
|
## Description
|
|
|
|
|
|
|
|
I2C_SCANNER is a class to build an I2C scanner, either minimal or more complex.
|
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
The class provides different functions to analyse the connectivity of devices
|
|
|
|
on the I2C bus. There are functions to adjust the frequency and functions to
|
|
|
|
select the bus in case of multiple I2C ports.
|
|
|
|
|
|
|
|
Furthermore there are different functions to scan the I2C port,
|
|
|
|
see the section scanning below.
|
|
|
|
|
|
|
|
If there is missing functionality, please file an issue.
|
2022-08-29 09:17:44 -04:00
|
|
|
|
|
|
|
|
|
|
|
## Interface
|
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
### Constructor
|
|
|
|
- **I2C_SCANNER(TwoWire \*wire = &Wire)** Constructor with the default Wire I2C bus.
|
|
|
|
- **bool begin()** To start the Wire library.
|
|
|
|
- **bool begin(int sda, int scl)** idem for ESP32 et al.
|
2022-08-29 09:17:44 -04:00
|
|
|
|
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
### Configuration
|
2022-08-29 09:17:44 -04:00
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
- **bool setClock(uint32_t clockFrequency = 100000UL)** sets the speed of the I2C bus.
|
2022-08-31 05:08:07 -04:00
|
|
|
Returns true.
|
|
|
|
- **uint32_t getClock()** supported by some platforms, including ESP32.
|
2022-08-30 06:39:55 -04:00
|
|
|
- **uint8_t getWireCount()** returns the number of Wire ports (hardware I2C).
|
|
|
|
- **bool setWire(TwoWire \*wire = &Wire)** set a Wire port by 'name' e.g. Wire1.
|
|
|
|
- **bool setWire(uint8_t n)** sets the Wire port by number.
|
|
|
|
- **TwoWire \* getWire()** returns the Wire object set.
|
2022-08-29 09:17:44 -04:00
|
|
|
|
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
### Scanning
|
2022-08-29 09:17:44 -04:00
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
- **bool ping(uint8_t address)** Tries to make contact with I2C address.
|
|
|
|
Returns true on success.
|
|
|
|
- **int diag(uint8_t address)** Tries to make contact with I2C address.
|
|
|
|
Returns Wire status code 0 == OK, others might depend on platform used.
|
|
|
|
- **int32_t pingTime(uint8_t address)** Tries to make contact with I2C address.
|
|
|
|
Returns time used in micros. Returns minus time (<0) if failed to contact.
|
|
|
|
- **uint8_t count(uint8_t start = 0, uint8_t end = 127)** pings address range.
|
|
|
|
Includes start and end address too. Returns the number of addresses found.
|
2022-08-29 09:17:44 -04:00
|
|
|
|
|
|
|
|
2022-08-31 05:08:07 -04:00
|
|
|
### Reset
|
|
|
|
|
|
|
|
(needs testing)
|
|
|
|
|
|
|
|
- **int softwareReset(uint8_t method = 0)** sends a I2C SWRST command over the configured I2C bus.
|
|
|
|
This will cause all devices that support this command to do a "power on" reset.
|
|
|
|
The code implements two methods,
|
|
|
|
- 0 = NXP spec (default)
|
|
|
|
- 1 = from PCA9634 issue.
|
|
|
|
|
|
|
|
The **softwareReset()** function should return 0 for success.
|
|
|
|
The value -999 indicates invalid method selected.
|
|
|
|
Other are I2C specific error codes.
|
|
|
|
|
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
## Operation
|
|
|
|
|
|
|
|
See examples.
|
2022-08-29 09:17:44 -04:00
|
|
|
|
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
## Future ideas
|
|
|
|
|
2022-08-29 09:17:44 -04:00
|
|
|
#### Should
|
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
- add examples.
|
2022-08-31 05:08:07 -04:00
|
|
|
- documentation.
|
|
|
|
- add **setWireTimeOut(uint32_t timeout, bool reset_with_timeout = true)**
|
|
|
|
- portable? clear? reset?
|
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
|
|
|
|
#### Could
|
|
|
|
|
2022-08-31 05:08:07 -04:00
|
|
|
- add **bool hardwareReset()**
|
2022-08-30 06:39:55 -04:00
|
|
|
- keep data HIGH for X clock pulses - google this.
|
2022-08-31 05:08:07 -04:00
|
|
|
- (needs investigation)
|
|
|
|
- implement **getClock()** for AVR based platforms
|
|
|
|
- reverse calculate TWBR and prescaler.
|
|
|
|
- (needs investigation)
|
|
|
|
|
2022-08-30 06:39:55 -04:00
|
|
|
|
|
|
|
|
|
|
|
#### Won't
|
|
|
|
|
|
|
|
- device analysis
|
|
|
|
- add **bool send(address, uint8_t \*buffer, uint8_t length)**
|
|
|
|
- add **bool receive(address, uint8_t \*buffer, uint8_t length)**
|
|
|
|
- add iterator
|
2022-08-31 05:08:07 -04:00
|
|
|
- **uint8_t first(uint8_t start = 0)** returns address or 255
|
|
|
|
- **uint8_t next()** returns address or 255.
|
|
|
|
- **uint8_t \_devices[16]** cache hits ?
|
|
|
|
- No
|
|
|
|
- implement a SW_I2C
|
|
|
|
- No, user may use a SW_I2C that derives from TwoWire.
|