/* Code to test MCP23S08 SPI B-bit I/O expander See: Current features: * Read input pins * Set output pins * Write output pins * Gratuitous LED fiddling * Terrible hacked-together code */ // Define SPI-related pins #define PIN_DATA_OUT 11 // MOSI (Master Out / Slave In) #define PIN_DATA_IN 12 // MISO (Master In / Slave Out) #define PIN_SPI_CLOCK 13 // SCK (Serial Clock) #define PIN_SLAVE_SELECT 10 // SS (Slave Select) byte deviceOpcodeRead = 0; byte deviceOpcodeWrite = 0; // TODO: handle this better? byte pinState = B00000000; unsigned long clk = 0; void setup () { Serial.begin(9600); Serial.println("Setup enter..."); Serial.print("SPCR: "); Serial.println(SPCR, BIN); // Configure SPI // Configure I/O pins pinMode(PIN_DATA_OUT, OUTPUT); pinMode(PIN_DATA_IN, INPUT); pinMode(PIN_SPI_CLOCK, OUTPUT); pinMode(PIN_SLAVE_SELECT, OUTPUT); digitalWrite(PIN_SLAVE_SELECT, HIGH); // Disable slave // Configure SPI Control Register (SPCR) (All values initially 0) // Bit Description // 7 SPI Interrupt Enable -- disable (SPIE --> 0) // 6 SPI Enable -- enable (SPE --> 1) // 5 Data Order -- MSB 1st (DORD --> 0) (Slave specific) // 4 Master/Slave Select -- master (MSTR --> 1) // 3 Clock Polarity -- (CPOL --> 0) (Slave specific) ("Mode") // 2 Clock Phase -- (CPHA --> 0) (Slave specific) // 1 SPI Clock Rate Select 1 -- } (SPR1 --> 0) // 0 SPI Clock Rate Select 0 -- } fOSC/4 (SPR0 --> 0) ("Fastest" but see SPI2X in SPSR) SPCR = (1< 750)) { // pinState = B00000000; pinState = (pinState >> 1) & B11110000; setRegister(deviceOpcodeWrite, REG_GPIO, pinState); clk = millis() - 500; } // Serial.println(getRegister(deviceOpcodeRead, REG_GPIO), BIN); buttonState = (getRegister(deviceOpcodeRead, REG_GPIO) & B00000001); // Serial.println(buttonState, BIN); //if (buttonState && !pinState) { // TODO: mask off pin(s) we're interested in & do better. if (buttonState) { // pinState = B10000000; // pinState = B11110000; // Note: You need to set as outputs remember! if (!(pinState & B10000000)) { // Compare to top-most output bit pinState = (pinState << 1) | B00010000; // Add bottom-most output bit } setRegister(deviceOpcodeWrite, REG_GPIO, pinState); delay(75); clk = millis(); } /* else if (!buttonState && pinState) { pinState = B00000000; setRegister(deviceOpcodeWrite, REG_GPIO, pinState); } */ delay(50); }