123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- /* this works with volt meter (MCP23S17 on 3.3v does not output enough power for LEDs)
- LED lights w/o resistor, not light with 56 ohm resistor
- blink LED on MCP23S17 port A pin
- from Example 41.1 - Microchip MCP23017 with Arduino
- http://tronixstuff.com/tutorials > chapter 41
- http://tronixstuff.com/2011/08/26/tutorial-maximising-your-arduinos-io-ports/
- John Boxall | CC by-sa-nc
- from http://69.5.26.215/forum/?id=10945&page=3 #35
- modified to test MCP23S17 (SPI) using syntax from
- http://arduino.stackexchange.com/questions/16348/how-do-you-use-spi-on-an-arduino
- >
-
- SPISettings from http://arduino.stackexchange.com/questions/14191/mcp23s17-programming-iodirx-register-works-in-loop-but-not-in-setup
- */
- #include <SPI.h>
-
- const uint8_t ADDR = 0x20; //MCP23S17 address, all ADDR pins are grounded
- const uint8_t OPCODE_WRITE = (ADDR << 1); //MCP23S17 opcode write has LSB clear
-
- const uint8_t IODIRA = 0x00; //LEDs are on port A
- const uint8_t GPIOA = 0x12;
-
- uint8_t LED_state = 0; //bit wise
-
- void IOEWrite(const uint8_t registerAddr, const uint8_t data)
- {
- SPI.beginTransaction(SPISettings (SPI_CLOCK_DIV8, MSBFIRST, SPI_MODE0)); //slower clock
- digitalWrite(SS, LOW); //enable Slave Select
- SPI.transfer(OPCODE_WRITE); //write command
- SPI.transfer(registerAddr); //register address to write data to
- SPI.transfer(data); //data
- digitalWrite(SS, HIGH); //disable Slave Select
- SPI.endTransaction(); //release the SPI bus
- }
-
- void setup()
- {
- Serial.begin(9600);
-
- pinMode(SS, OUTPUT); //configure controller's Slave Select pin to output
- digitalWrite(SS, HIGH); //disable Slave Select
- SPI.begin();
-
- IOEWrite(IODIRA, 0x00); //configure IODIRA register to output
- }
-
- void loop()
- {
- IOEWrite(GPIOA, LED_state); //set all GPIOA pins
-
- delay(2000);
- //Serial.println(LED_state, BIN); //prints alternating 0 and 11111111
- LED_state = ~LED_state; //toggle LED on/off
- }
|