Baseline for testing
Diff: mcp23s08.h
- Revision:
- 0:b6d729ae4f27
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mcp23s08.h Thu Jul 25 00:43:08 2019 +0000 @@ -0,0 +1,123 @@ +/* + ___ _ _ _ __ ___ ___ | |_ ___ _ _ +/ __|| | | || '_ ` _ \ / _ \ | __|/ _ \ | | | | +\__ \| |_| || | | | | || (_) || |_| (_) || |_| | +|___/ \__,_||_| |_| |_| \___/ \__|\___/ \__, | + |___/ + + gpio_expander - An attemp to create a fast and universal library for drive many GPIO chips + +model: company: pins: protocol: Special Features: +--------------------------------------------------------------------------------------------------------------------- +mcp23s08 Microchip 8 SPI INT/HAEN +--------------------------------------------------------------------------------------------------------------------- +Version history: +0.5b1: first release, just coded and never tested +0.5b2: fixed 2wire version, added portPullup, tested output mode (ok) +0.5b3: added some drivers +0.5b4: ability to include library inside other libraries. +0.5b7: Changed functionalities of some function. +0.6b1: Changed gpioRegisterRead to gpioRegisterReadByte. Added gpioRegisterReadWord (for some GPIO) +0.6b3: Added basic support for SPI transactions, small optimizations. +0.8b3: Added 2 more commands and 2 gpio chip. +0.8b4: Support for SPI Transaction post setup +--------------------------------------------------------------------------------------------------------------------- + Copyright (c) 2013-2014, s.u.m.o.t.o.y [sumotoy(at)gmail.com] +--------------------------------------------------------------------------------------------------------------------- + gpio_expander Library is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + gpio_expander Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with Foobar. If not, see <http://www.gnu.org/licenses/>. + + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Version:0.8b3: Added 2 more commands and 2 gpio chip. + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +*/ + +/* ------------------------------ MCP23S08 WIRING ------------------------------------ +This chip has a very useful feature called HAEN that allow you to share the same CS pin trough +4 different addresses. Of course chip has to be Microchip and should be assigned to different addresses! +Basic Address: 001000 A1 A0 (from 0x20 to 0x23) +A1,A0 tied to ground = 0x20 + __ __ + -> sck [| U |] ++++ + -> mosi [| |] IO-7 + <- miso [| |] IO-6 + A1 [| |] IO-5 + A0 [| |] IO-4 + rst (con.+) [| |] IO-3 + cs [| |] IO-2 + int [| |] IO-1 + GND [|_____|] IO-0 +*/ +#ifndef _MCP23S08_H_ +#define _MCP23S08_H_ + +#include <inttypes.h> + +class mcp23s08 : public SPI +{ + +public: + mcp23s08(PinName mosi, PinName miso, PinName clk, PinName cs_pin,const uint8_t haenAdrs); + void postSetup(const uint8_t haenAdrs);//used with other libraries only + virtual void begin(bool protocolInitOverride=false); //protocolInitOverride=true will not init the SPI + + + void gpioPinMode(uint8_t mode); //set all pins to INPUT or OUTPUT + void gpioPinMode(uint8_t pin, bool mode); //set a unique pin as IN(1) or OUT (0) + void gpioPort(uint8_t value); //write data to all pins + //void gpioPort(uint8_t lowByte, uint8_t highByte); //same as abowe but uses 2 separate bytes (not applicable to this chip) + uint8_t readGpioPort(); //read the state of the pins (all) + uint8_t readGpioPortFast(); + + void gpioDigitalWrite(uint8_t pin, bool value); //write data to one pin + void gpioDigitalWriteFast(uint8_t pin, bool value); + int gpioDigitalRead(uint8_t pin); //read data from one pin + uint8_t gpioRegisterReadByte(uint8_t reg); //read a uint8_t from chip register + int gpioDigitalReadFast(uint8_t pin); + void gpioRegisterWriteByte(uint8_t reg,uint8_t data); //write a chip register + void portPullup(uint8_t data); // true=pullup, false=pulldown all pins + void gpioPortUpdate(); + // direct access commands + uint8_t readAddress(uint8_t addr); + + void setSPIspeed(uint32_t spispeed);//for SPI transactions + + //------------------------- REGISTERS + uint8_t IOCON; + uint8_t IODIR; + uint8_t GPPU; + uint8_t GPIO; + uint8_t GPINTEN; + uint8_t IPOL; + uint8_t DEFVAL; + uint8_t INTF; + uint8_t INTCAP; + uint8_t OLAT; + uint8_t INTCON; + +private: + DigitalOut cs; + + uint8_t _cs; + uint8_t _adrs; + + uint32_t _spiTransactionsSpeed;//for SPI transactions + + uint8_t _useHaen; + uint8_t _readCmd; + uint8_t _writeCmd; + void startSend(bool mode); + void endSend(); + uint8_t _gpioDirection; + uint8_t _gpioState; + void writeByte(uint8_t addr, uint8_t data); +}; +#endif \ No newline at end of file