Giter VIP home page Giter VIP logo

tca9555's Introduction

Arduino CI Arduino-lint JSON check GitHub issues

License: MIT GitHub release PlatformIO Registry

TCA9555

Arduino library for TCA9555 16 channel I2C port expander.

Description

This library gives easy control over the 16 pins of a TCA9555 chip.

The pins can be used for INPUT (default) and OUTPUT, and allow to set polarity.

The pins can be set per single pin, or with a mask to set either 8 or 16 pins in one call. Note that for the 16 bit interface settings are not perfectly simultaneous as the 16 bit interface does in fact 2 calls to the 8 bit interface.

TCA9535

From datasheet:

The TCA9535 is identical to the TCA9555, except that the TCA9535 does not include the internal I/O pull-up resistor, which requires pull-ups and pull-downs on unused I/O pins when configured as an input and not driven. This reduces power consumption when the I/O is held low.

There is a TCA9535 class which is a (convenience) wrapper around the TCA9555 class. This allows one to create TCA9535 objects.

0.3.0 Breaking change

The version 0.3.0 has breaking changes in the interface. The rationale is that the programming environment of the Arduino ESP32 S3 board uses a remapping by means of the include file io_pin_remap.h. This file remaps the pins of several core Arduino functions. The remapping is implemented by #define macros and these implement "hard" text replacements without considering context. The effect is that methods from this class (and several others) which have the same name as those Arduino core functions will be remapped into something not working.

The following library functions have been renamed:

old name new name notes
analogRead() read()
analogWrite() write()
pinMode() pinMode1()
digitalRead() read1()
digitalWrite() write1()

0.2.0 Breaking change

Version 0.2.0 introduced a breaking change. You cannot set the pins in begin() any more. This reduces the dependency of processor dependent Wire implementations. The user has to call Wire.begin() and can optionally set the Wire pins before calling begin().

Related

16 bit port expanders

8 bit port expanders

Hardware

I2C addresses

The addresses for the TCA9555 and TCA9535 are 0x20..0x27. These are to be set with pin A0, A1, A2.

Both the TCA9555 and TCA9535 support up to 400 kHz I2C.

I2C multiplexing

Sometimes you need to control more devices than possible with the default address range the device provides. This is possible with an I2C multiplexer e.g. TCA9548 which creates up to eight channels (think of it as I2C subnets) which can use the complete address range of the device.

Drawback of using a multiplexer is that it takes more administration in your code e.g. which device is on which channel. This will slow down the access, which must be taken into account when deciding which devices are on which channel. Also note that switching between channels will slow down other devices too if they are behind the multiplexer.

INT

The interrupt pin is not supported by the library. Needs investigation (+ examples).

Interface

Check the datasheet for details

#include "TCA9555.h"

Constructor

  • TCA9555(uint8_t address, TwoWire *wire = &Wire) constructor, with default Wire interface. Can be overruled with Wire0..WireN.
  • TCA9535(uint8_t address, TwoWire *wire = &Wire) idem.
  • uint8_t getType() returns 35 or 55 depending on type.
  • bool begin() initializes library. Returns true if device can be seen on I2C bus, false otherwise.
  • bool isConnected() returns true if device can be seen on I2C bus, false otherwise.
  • uint8_t getAddress() returns set address, (debugging).

1 pin interface

  • bool pinMode1(uint8_t pin, uint8_t mode) idem.
  • bool write1(uint8_t pin, uint8_t value) pin = 0..15, value = LOW(0) HIGH (!0), returns true if successful.
  • uint8_t read1(uint8_t pin) pin = 0..15, returns the value of the pin HIGH or LOW.
  • bool setPolarity(uint8_t pin, uint8_t value) inverts polarity of an INPUT pin.
  • uint8_t getPolarity(uint8_t pin) returns 1 if a pin is inverted.

8 pin interface

port = 0..1
mask = 0..255

  • bool pinMode8(uint8_t port, uint8_t mask) set the mode of eight pins in one call.
  • bool write8(uint8_t port, uint8_t mask) returns true if successful. Especially useful if one needs to trigger multiple pins at the exact same time.
  • uint8_t read8(uint8_t port) returns a bit pattern for pins 0..7 or pins 8..15.
  • bool setPolarity8(uint8_t port, uint8_t mask) inverts polarity of the 8 INPUT pins in one action.
  • uint8_t getPolarity(uint8_t port) returns a mask with a 1 for every INPUT pin that is inverted.

16 pin interface

Be aware that the 16 pins interface does two calls to the 8 pins interface. So it is impossible to switch pins from the 2 groups of 8 at exactly the same time without additional hardware.

  • bool pinMode16(uint16_t mask) set the mode of sixteen pins in one call.
  • bool write16(uint16_t mask) mask = 0x0000 .. 0xFFFF, returns true if successful.
  • uint16_t read16() Returns a bit pattern for pins 0..15.
  • bool setPolarity16(uint16_t mask) inverts polarity of the 8 INPUT pins in one action. Returns true upon success.
  • uint16_t getPolarity() returns a mask of 16 bits with a 1 for every INPUT pin that is inverted.

Error codes

  • int lastError() Above functions set an error flag that can be read with this function. Reading it will reset the flag to TCA9555_OK.
Description Value
TCA9555_OK 0x00
TCA9555_PIN_ERROR 0x81
TCA9555_I2C_ERROR 0x82
TCA9555_VALUE_ERROR 0x83
TCA9555_PORT_ERROR 0x84
TCA9555_INVALID_READ -100

Future

Must

  • update documentation
  • buy TCA9555 / TCA9535
  • test all functionality
    • library is written without hardware

Should

  • investigate INT = interrupt pin
  • investigate map INPUT_PULLUP on INPUT (pinMode ?)
  • investigate internal pull up etc.
  • investigate TCA9535 differences
    • pull up resistors
    • elaborate derived class
  • setPolarity() ==> setPolarity1() ? get idem.
    • uniformity

Could

  • rethink class hierarchy
    • TCA9535 has less functions so should be base class
  • add performance example for I2C.
  • investigate optimizing the "16 pins" interface.
    • read /write multiple bytes in one call, is it supported?

Wont (unless)

  • add TCA9535 error codes
    • better reuse them? ==> TCA95X5 codes

Support

If you appreciate my libraries, you can support the development and maintenance. Improve the quality of the libraries by providing issues and Pull Requests, or donate through PayPal or GitHub sponsors.

Thank you,

tca9555's People

Contributors

robtillaart avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

tca9555's Issues

TCA9535 is inaccesible

hi o/
it seems like the header isw missing the public: declration for the 35 constructor.

[Suggestion] add pin names to header

the datasheet names the Pins from P00 to P17 it would be cool to have a maping in the haver file so these names can be used with the digitalWrite call (P07=7 ; P10 = 8 and so on)

no pinMode() in TCA95x5_digitalWrite.ino

Hey @RobTillaart
thank you for this lib, it just helped me a lot getting started. But it gave me also a hard time running as I tried to output data but seems like there is no pinMode() in the digitalWrite examples. Is this really correct?

Just a small question

Hi.
Do you have any function in the library to see if the I2C bus is busy?
And if so, how do I use it???

Documentation

Library
https://github.com/NorthernWidget-Skunkworks/TCA9555

Datasheet
https://www.ti.com/lit/ds/symlink/tca9555.pdf

I use Port 0 as input and that seems to work (have not tried this as output).
Port 1 is an output port in my case and this is not working. (not tried as input)

What I can find out they are sending 16 bit to the chip at the same time.
Do the chip handle that?
Don't know that the specification say.
Maybe need to to it in two 8 bit sendings.
I'm not an expert in this by I would like to learn.

Do you have any cource on how to write a library for I2C?
I would like yo do this my self.
How do you start and what shall I think about?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.