GY-63_MS5611/libraries/MCP23S08
2023-08-21 14:31:38 +02:00
..
.github 0.2.0 MCP23S08 2023-08-21 14:31:38 +02:00
documents 0.1.0 MCP23S08 2022-01-10 12:52:28 +01:00
examples 0.2.0 MCP23S08 2023-08-21 14:31:38 +02:00
test 0.1.3 MCP23S08 2023-02-04 16:07:28 +01:00
.arduino-ci.yml 0.1.2 MCP23S08 2022-11-17 13:36:23 +01:00
CHANGELOG.md 0.2.0 MCP23S08 2023-08-21 14:31:38 +02:00
keywords.txt 0.2.0 MCP23S08 2023-08-21 14:31:38 +02:00
library.json 0.2.0 MCP23S08 2023-08-21 14:31:38 +02:00
library.properties 0.2.0 MCP23S08 2023-08-21 14:31:38 +02:00
LICENSE 0.1.3 MCP23S08 2023-02-04 16:07:28 +01:00
MCP23S08_registers.h 0.2.0 MCP23S08 2023-08-21 14:31:38 +02:00
MCP23S08.cpp 0.2.0 MCP23S08 2023-08-21 14:31:38 +02:00
MCP23S08.h 0.2.0 MCP23S08 2023-08-21 14:31:38 +02:00
README.md 0.2.0 MCP23S08 2023-08-21 14:31:38 +02:00

Arduino CI Arduino-lint JSON check License: MIT GitHub release

MCP23S08

Arduino library for MCP23S08 8 channel SPI port expander.

Description

This experimental library gives easy control over the 8 pins of a (SPI) MCP23S08 chip.

This IC is strongly related to the MCP23017 I2C port expander - https://github.com/RobTillaart/MCP23017_RT Programming Interface is kept the same as much as possible.

Since 0.1.1 the digitalWrite(pin, value) is optimized. If a pin is not changed it will not be written again to save time.

16 bit port expanders

8 bit port expanders

Interface

#include "MCP23S08.h"

Constructor

  • MCP23S08(uint8_t select, uint8_t dataIn, uint8_t dataOut, uint8_t clock, uint8_t address = 0x00) constructor SOFTWARE SPI.
  • MCP23S08(uint8_t select, SPIClass* spi) constructor HARDWARE SPI with explicit SPI interface selected.
  • MCP23S08(uint8_t select, uint8_t address = 0x00, SPIClass* spi = &SPI) constructor HARDWARE SPI with optional address pins and SPI interface.
  • bool begin() returns true if successful.
  • bool isConnected() returns true if connected, false otherwise. (dummy for compatibility reasons)
  • uint8_t getAddress() returns the address set in the constructor. Default = 0, range = 0..3.

The two hardware constructors allow to call 4 different constructors.

- MCP23S08(10);            //  select pin only
- MCP23S08(10, 7);         //  select pin + address pins
- MCP23S08(10, 7, &SPI2);  //  select pin + address pins + SPI port
- MCP23S08(10, &SPI2);     //  select pin + SPI port

Sharing SELECT lines

(verified in MCP23S17 issue 19)
Technically two chips could use the same SELECT pin and a different address. Since 0.2.0 the constructors allow to setup such a configuration. The added value is that one can use up to 4 devices (= 32 IO lines) with only four lines (MISO, MOSI, CLOCK, SELECT).

I assume that this configuration is less used and IMHO not recommended. NB it is more difficult to detect which device is selected when debugging.

To use the hardware addresses the Hardware Address ENable register must be set. See datasheet 1.6.6 ADDRESSING SPI DEVICES, need to set IOCON.HAEN.

The library supports two ways:

MCP.enableControlRegister(MCP23S08_IOCR_HAEN);  //  or 0x08
or
MCP.enableHardwareAddress();  //  0.2.0 version and up

See also IO Control Register section below.

Single pin interface

mode: 0 = OUTPUT, 1 = INPUT, 1 = INPUT_PULLUP (==INPUT)

  • bool pinMode(uint8_t pin, uint8_t mode) pin = 0..7. Returns true if successful.
  • bool digitalWrite(uint8_t pin, uint8_t value) pin = 0..7, value = LOW(0) HIGH (!0). Returns true if successful.
  • uint8_t digitalRead(uint8_t pin) pin = 0..7, returns LOW or HIGH, might set the lastError();
  • bool setPolarity(uint8_t pin, bool reversed) pin = 0..7, set reversed flag. Returns true if successful.
  • bool getPolarity(uint8_t pin, bool &reversed) pin = 0..7, reads reversed flag. Returns true if successful.
  • bool setPullup(uint8_t pin, bool pullup) pin = 0..7, set pull-up flag. Returns true if successful.
  • bool getPullup(uint8_t pin, bool &pullup) pin = 0..7, reads pull-up flag. Returns true if successful.

8 pins interface

  • bool pinMode8(uint8_t value) value = 0..255. Returns true if successful.
  • bool write8(uint8_t value) value = 0..255. Returns true if successful.
  • uint8_t read8() reads 8 pins into one byte.
  • bool setPolarity8(uint8_t mask) sets polarity for 8 channels at once. Returns true if successful.
  • bool getPolarity8(uint8_t &mask) reads polarity of 8 channels at once. Returns true if successful.
  • bool setPullup8(uint8_t mask) sets pull-up for 8 channels at once. Returns true if successful.
  • bool getPullup8(uint8_t &mask) reads pull-up for 8 channels at once. Returns true if successful.

Other

  • void setSPIspeed(uint32_t speed) set hardware speed (8Mb default).
  • uint32_t getSPIspeed() returns set speed.

Debugging

  • bool usesHWSPI() returns true = hardware SPI, false = software SPI.
  • int lastError() idem.

ControlRegister

Since 0.2.0

  • void enableControlRegister(uint8_t mask) set IOCR bit fields
  • void disableControlRegister(uint8_t mask) clear IOCR bit fields
  • void enableHardwareAddress() specific for HAEN field.
  • void disableHardwareAddress() specific for HAEN field.

ESP32

Since 0.2.0

  • void selectHSPI() idem
  • void selectVSPI() idem
  • bool usesHSPI() idem
  • bool usesVSPI() idem
  • void setGPIOpins(uint8_t clk, uint8_t miso, uint8_t mosi, uint8_t select) overrule the ESP32s default hardware pins.

Error codes

If one of the above functions return false, there might be an error.

  • int lastError() Above functions set an error flag that can be read with this function.
    Reading it will reset the flag to MCP23S08_OK.
Name Value description
MCP23S08_OK 0x00 No error
MCP23S08_PIN_ERROR 0x81
MCP23S08_SPI_ERROR 0x82
MCP23S08_VALUE_ERROR 0x83
MCP23S08_PORT_ERROR 0x84
MCP23S08_REGISTER_ERROR 0xFF low level.

Operation

See examples.

Future

Must

  • keep documentation in sync with MCP23S17

Should

  • keep functional in sync with MCP23017_RT and MCP23S17

Could

  • ESP32 example code

Wont