Jackson White

Scanning all GPIOs for CS pins

#include <SPI.h>

// Define SPI bus (adjust to match your sensor's bus)
#define SPI_PORT SPI3  // Change to SPI1, SPI2, SPI4 if needed

// Define all GPIOs to test as CS (excluding SPI pins and essential comms)
uint8_t possibleCS[] = {
    PA0, PA1, PA2, PA3, PA8, PA9, PA10, PA15,
    PB0, PB1, PB2, PB3, PB4, PB5, PB6, PB7, PB8, PB9, PB10, PB11, PB12, PB13, PB14, PB15,
    PC0, PC1, PC4, PC5, PC7, PC8, PC9, PC10, PC11, PC12, PC15,
    PD2, PD4, PD5, PD6, PD7, PD8, PD9, PD10, PD11, PD12, PD13,
    PE0, PE1, PE2, PE3, PE4, PE5, PE6, PE7, PE8, PE11, PE12, PE13, PE14, PE15
};  
uint8_t numPins = sizeof(possibleCS) / sizeof(possibleCS[0]);

uint8_t testCS(uint8_t csPin) {
    pinMode(csPin, OUTPUT);
    digitalWrite(csPin, HIGH);

    digitalWrite(csPin, LOW);  // Activate CS
    delay(10);

    uint8_t result = 0xFF;  // Default invalid response
    SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));

    SPI.transfer(0x00);  // Dummy command, replace if you know a register
    result = SPI.transfer(0x00);  // Read response

    SPI.endTransaction();
    digitalWrite(csPin, HIGH);  // Deactivate CS
    delay(10);

    return result;
}

void setup() {
    Serial.begin(115200);
    SPI.begin();

    Serial.println("Scanning all GPIOs for potential CS...");

    for (uint8_t i = 0; i < numPins; i++) {
        uint8_t pin = possibleCS[i];
        uint8_t response = testCS(pin);

        Serial.print("Pin ");
        Serial.print(pin);
        Serial.print(": Response = 0x");
        Serial.println(response, HEX);

        if (response != 0xFF) {  // Valid response suggests a connected sensor
            Serial.print("Possible CS found on pin: ");
            Serial.println(pin);
        }
    }
}

void loop() {}