| sshahryiar 
 
 
 Joined: 05 May 2010
 Posts: 94
 Location: Dhaka, Bangladesh
 
 
			        
 
 | 
			
				| MCP23S17 16 Bit SPI IO Expander Driver |  
				|  Posted: Wed Oct 02, 2013 10:13 am |   |  
				| 
 |  
				| MCP23S17.h 
  	  | Code: |  	  | #use SPI (MASTER, DO = PIN_B1, DI = PIN_B3, CLK = PIN_B0, BITS = 8, Mode = 0)
 
 
 #define IO_DEVICE_ADDRESS_WRITE   0x40
 #define IO_DEVICE_ADDRESS_READ    0x41
 
 #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
 
 #define CS           pin_B2
 
 
 void setup_MCP23S17();
 void MCP23S17_write(unsigned char address, unsigned char value);
 unsigned char MCP23S17_read(unsigned char address);
 
 | 
 
 MCP23S17.c
 
 
  	  | Code: |  	  | #include "MCP23S17.h"
 
 
 void setup_MCP23S17()
 {
 MCP23S17_write(IOCON, 0x18);
 MCP23S17_write(IODIRA, 0x00);
 MCP23S17_write(IODIRB, 0xFF);
 MCP23S17_write(GPPUA, 0x00);
 MCP23S17_write(GPPUB, 0xFF);
 MCP23S17_write(IPOLA, 0xFF);
 MCP23S17_write(IPOLB, 0x00);
 }
 
 
 void MCP23S17_write(unsigned char address, unsigned char value)
 {
 output_low(CS);
 spi_xfer(IO_DEVICE_ADDRESS_WRITE);
 spi_xfer(address);
 spi_xfer(value);
 output_high(CS);
 }
 
 
 unsigned char MCP23S17_read(unsigned char address)
 {
 unsigned char received_data = 0;
 output_low(CS);
 spi_xfer(IO_DEVICE_ADDRESS_READ);
 spi_xfer(address);
 received_data = spi_xfer(0);
 output_high(CS);
 return received_data;
 }
 
 | 
 
 Example
 
  	  | Code: |  	  | #include <10F200.h>
 #fuses PROTECT, NOWDT, NOMCLR
 #use delay (clock = 4MHz)
 
 #include "MCP23S17.c"
 
 void setup();
 
 
 void main()
 {
 unsigned char in = 0;
 setup();
 
 while(TRUE)
 {
 in = MCP23S17_read(GPIOB);
 MCP23S17_write(OLATA, in);
 }
 }
 
 
 void setup()
 {
 setup_MCP23S17();
 }
 
 
 | 
 _________________
 https://www.facebook.com/MicroArena
 
 SShahryiar
 |  |