For a recent project the 16bit IO Expander, MCP23S17, from Microchip was enlisted for low voltage input scanning.
Searching online, at the time of writing this blog, there were no projects using this part with sample code.
Below is the header file that may be of use.
Microchip IO Expander QFN Package |
Downloads
mcp23s17.h |
Code
/******************************
* mcp23s17.h
******************************/
#ifndef mcp23s17_h
#define mcp23s17_h
typedef unsigned char uint8;
#define MCP_READ 0x41 /* Read */
#define MCP_WRITE 0x40 /* Write */
#define Mode_8Bit 1 /* Addressing 8/16bit */
#define Mode_16bit 0
#ifdef Mode_16Bit
/******************************
* Control register for BANK=0
******************************/
#define IODIRA 0x00 /* Data Direction Register for PORTA */
#define IODIRB 0x01 /* Data Direction Register for PORTB */
#define IPOLA 0x02 /* Input Polarity Register for PORTA */
#define IPOLB 0x03 /* Input Polarity Register for PORTB */
#define GPINTENA 0x04 /* Interrupt-on-change enable Register for PORTA */
#define GPINTENB 0x05 /* Interrupt-on-change enable Register for PORTB */
#define DEFVALA 0x06 /* Default Value Register for PORTA */
#define DEFVALB 0x07 /* Default Value Register for PORTB */
#define INTCONA 0x08 /* Interrupt-on-change control Register for PORTA */
#define INTCONB 0x09 /* Interrupt-on-change control Register for PORTB */
#define IOCON 0x0A /* Configuration register for device */
#define GPPUA 0x0C /* 100kOhm pullup resistor register for PORTA (sets pin to input when set) */
#define GPPUB 0x0D /* 100kOhm pullup resistor register for PORTB (sets pin to input when set) */
#define INTFA 0x0E /* Interrupt flag Register for PORTA */
#define INTFB 0x0F /* Interrupt flag Register for PORTB */
#define INTCAPA 0x10 /* Interrupt captured value Register for PORTA */
#define INTCAPB 0x11 /* Interrupt captured value Register for PORTB */
#define GPIOA 0x12 /* General purpose I/O Register for PORTA */
#define GPIOB 0x13 /* General purpose I/O Register for PORTB */
#define OLATA 0x14 /* Output latch Register for PORTA */
#define OLATB 0x15 /* Output latch Register for PORTB */
#endif
#ifdef Mode_8Bit
/******************************
* Control register for BANK=1
******************************/
#define IODIRA 0x00 /* Data Direction Register for PORTA */
#define IPOLA 0x01 /* Input Polarity Register for PORTA */
#define GPINTENA 0x02 /* Interrupt-on-change enable Register for PORTA */
#define DEFVALA 0x03 /* Default Value Register for PORTA */
#define INTCONA 0x04 /* Interrupt-on-change control Register for PORTA */
#define IOCONA 0x05 /* Configuration register for device */
#define GPPUA 0x06 /* 100kOhm pullup resistor register for PORTA (sets pin to input when set) */
#define INTFA 0x07 /* Interrupt flag Register for PORTA */
#define INTCAPA 0x08 /* Interrupt captured value Register for PORTA */
#define GPIOA 0x09 /* General purpose I/O Register for PORTA */
#define OLATA 0x0A /* Output latch Register for PORTA */
#define IODIRB 0x10 /* Data Direction Register for PORTB */
#define IPOLB 0x11 /* Input Polarity Register for PORTB */
#define GPINTENB 0x12 /* Interrupt-on-change enable Register for PORTB */
#define DEFVALB 0x13 /* Default Value Register for PORTB */
#define INTCONB 0x14 /* Interrupt-on-change control Register for PORTB */
#define IOCONB 0x15 /* Configuration register for device */
#define GPPUB 0x16 /* 100kOhm pullup resistor register for PORTB (sets pin to input when set) */
#define INTFB 0x17 /* Interrupt flag Register for PORTB */
#define INTCAPB 0x18 /* Interrupt captured value Register for PORTB */
#define GPIOB 0x19 /* General purpose I/O Register for PORTB */
#define OLATB 0x1A /* Output latch Register for PORTB */
#endif
/* Config bits - IOCON */
#define BANK 0x80
#define MIRROR 0x40
#define SEQOP 0x20
#define DISSLW 0x10
#define HAEN 0x08
#define ODR 0x04
#define INTPOL 0x02
/******************************
* Prototypes
******************************/
void MCP23S17_init();
void MCP23S17_write(uint8 address, uint8 value);
uint8 MCP23S17_read(uint8 address);
uint8 MCP23S17_verify(uint8 address, uint8 verify_data);
#endif
/* END */
Change Summary
Version 1.00 (10 February 2017)
- Created register mapping for MCP23S17, 8 and 16 bit modes
No comments:
Post a Comment