Adafruit’s Feather RP2040 SCORPIO has many pins, ports and features. This page takes you on a tour of the board!
- USB C connector - This is used for power and data. Connect to your computer via a USB C cable to update firmware and edit code.
- LiPoly Battery connector - This 2-pin JST PH connector allows you to plug in lithium-polymer batteries to power the Feather. The Feather is also capable of charging batteries plugged into this port via USB.
- GND - This is the common ground for all power and logic.
- BAT - This is the positive voltage to/from the 2-pin JST jack for the optional LiPoly battery.
- USB - This is the positive voltage to/from the USB C jack, if USB is connected.
- EN - This is the 3.3V regulator's enable pin. This has a pull-up resistor so the board defaults to “on.” Connecting this to ground (typically through a toggle switch) powers off most of the board (battery charging continues to function).
- 3.3V - These pins are the output from the 3.3V regulator, which can supply up to 500mA.
I2C and SPI on RP2040
The RP2040 is capable of handling I2C, SPI and UART (serial) on many pins. However, there are really only two peripherals each of I2C, SPI and UART: I2C0 and I2C1, SPI0 and SPI1, and UART0 and UART1. So while many pins are capable of I2C, SPI and UART, you can only do two at a time, and only on separate peripherals, 0 and 1. I2C, SPI and UART peripherals are included and numbered below.
PWM on RP2040
The RP2040 supports PWM on all pins. However, it is not capable of PWM on all pins at the same time. There are 8 PWM “slices” (0 through 7), each with two outputs, A and B. Each pin on the Feather is assigned a PWM slice and output. For example, A0 is PWM5 A, which means it is first output of the sixth slice. With careful planning you can have up to 16 PWM instances on the Feather RP2040. The important thing to know is that you cannot use the same slice and output more than once at the same time. So, if you have a PWM object on pin A0, you cannot also put a PWM object on D10, because they are both PWM5 A. The PWM slices and outputs are indicated below.
Analog Pins
The RP2040 has four ADC inputs. These pins are the only pins capable of handling analog input, though they all can also do digital input or output.
- A0/GP26 - This pin is ADC0. It is also SPI1 SCK, I2C1 SDA and PWM5 A.
- A1/GP27 - This pin is ADC1. It is also SPI1 MOSI, I2C1 SCL and PWM5 B.
- A2/GP28 - This pin is ADC2. It is also SPI1 MISO, I2C1 SDA and PWM6 A.
- A3/GP29 - This pin is ADC3. It is also SPI1 CS, I2C0 SCL and PWM6 B.
Digital Pins
These are the digital I/O pins along the two longer edges of the board; the “Feather header” pins. They all have multiple capabilities.
- D24/GP24 - Digital I/O pin 24. It is also UART1 TX, I2C0 SDA, and PWM4 A.
- D25/GP25 - Digital I/O pin 25. It is also UART1 RX, I2C0 SCL, and PWM4 B.
- SCK/GP14 - The main SPI1 SCK. It is also I2C1 SDA and PWM7 A.
- MO/GP15 - The main SPI1 MOSI. It is also I2C1 SCL and PWM7 B.
- MI/GP08 - The main SPI1 MISO. It is also UART1 TX, I2C0 SDA and PWM4 A.
- RX/GP01 - The main UART0 RX pin. It is also I2C0 SCL, SPI0 CS and PWM0 B.
- TX/GP00 - The main UART0 TX pin. It is also I2C0 SDA, SPI0 MISO and PWM0 A.
- D4/GP04 - Digital I/O pin 4. It is also SPI0 MISO, I2C0 SDA and PWM2 A — but these special peripheral functions should be avoided on this pin as it’s also used for controlling the onboard NeoPixel!
- D13/GP13 - Digital I/O pin 13. It is also SPI1 CS, UART0 RX, I2C0 SCL and PWM6 B.
- D12/GP12 - Digital I/O pin 12. It is also SPI1 MISO, UART0 TX, I2C0 SDA and PWM6 A.
- D11/GP11 - Digital I/O pin 11. It is also SPI1 MOSI, I2C1 SCL and PWM5 B.
- D10/GP10 - Digital I/O pin 10. It is also SPI1 SCK, I2C1 SDA and PWM5 A.
- D9/GP09 - Digital I/O pin 9. It is also SPI1 CS, UART1 RX, I2C0 SCL and PWM4 B.
- D6/GP06 - Digital I/O pin 6. It is also SPI0 SCK, I2C1 SDA and PWM3 A.
- D5/GP05 - Digital I/O pin 5. It is also SPI0 CS, I2C0 SCL and PWM2 B.
- SCL/GP03 - The main I2C1 clock pin. It is also SPI0 MOSI, I2C1 SCL and PWM1 B.
- SDA/GP02 - The main I2C1 data pin. It is also SPI0 SCK, I2C1 SDA and PWM1 A.
SCORPIO Header
This special 8x2 board-end header warrants its own in-depth page later. But in brief: the 8 “outer” pins are all grounds, the 8 “inner” are:
- NEOPIXEL0/GP16 - Digital I/O pin 16. Also SPI0 MISO, UART0 TX, I2C0 SDA and PWM0 A.
- NEOPIXEL1/GP17 - Digital I/O pin 17. Also SPI0 CS, UART0 RX, I2C0 SCL and PWM0 B.
- NEOPIXEL2/GP18 - Digital I/O pin 18. Also SPI0 SCK, I2C1 SDA and PWM1 A.
- NEOPIXEL3/GP19 - Digital I/O pin 19. Also SPI0 MOSI, I2C1 SCL and PWM1 B.
- NEOPIXEL4/GP20 - Digital I/O pin 20. Also SPI0 MISO, UART1 TX, I2C0 SDA and PWM2 A.
- NEOPIXEL5/GP21 - Digital I/O pin 21. Also SPI0 CS, UART1 RX, I2C0 SCL and PWM2 B.
- NEOPIXEL6/GP22 - Digital I/O pin 22. Also SPI0 SCK, I2C1 SDA and PWM3 A.
- NEOPIXEL7/GP23 - Digital I/O pin 23. Also SPI0 MOSI, I2C1 SCL and PWM3 B.
Some configurable pads are present to select logic voltage and direction on these pins, explained on the 8X I/O Header page.
Pin Numbering
Starting with a clean slate for SCORPIO allowed fixing a minor annoyance compared to prior Feathers: on all of the normal Feather pins along the longer edges of the board, the silkscreen labels, CircuitPython pin names and Arduino digital pin numbers are now synchronized. CircuitPython’s pin D4 is Arduino’s pin 4 is “4” printed on the board. This should simplify translating code for this board between the two languages, plus the RP2040 SDK.
The pins along SCORPIO’s short edge are an exception. These are labeled 0–7 on the board, named NEOPIXEL0–NEOPIXEL7 in CircuitPython, and are digital pins 16–23 in Arduino.
CircuitPython code written for the original non-SCORPIO Feather RP2040 should carry over to SCORPIO without changes. Non-SCORPIO Feather RP2040 Arduino code may need changes if it uses digitalRead() or digitalWrite() on pins 6–8 (now 4–6 on SCORPIO) or any special peripherals (I2C, PWM, etc.) on these pins or the SCK/MO/MI pins.
CircuitPython I2C, SPI and UART
Note that in CircuitPython, there is a board object each for I2C, SPI and UART that use the pins labeled on the Feather. You can use these objects to initialise these peripherals in your code.
-
board.STEMMA_I2C()
uses SCL/SDA -
board.SPI()
uses SCK/MO/MI -
board.UART()
uses RX/TX
GPIO Pins by Pin Functionality
Primary pin functions marked on the Feather RP2040 SCORPIO silk are bold.
I2C Pins
- I2C0 SCL: A3, D25, RX, D13, D9, D5, NEOPIXEL1/D17, NEOPIXEL5/D21
- I2C0 SDA: A2, D24, MISO, TX, D12, NEOPIXEL0/D16, NEOPIXEL4/D20
- I2C1 SCL: SCL, A1, MOSI, D11, NEOPIXEL3/D19, NEOPIXEL7/D23
- I2C1 SDA: SDA, A0, SCK, D10, D6, NEOPIXEL2/D18, NEOPIXEL6/D22
SPI Pins
- SPI0 SCK: D6, NEOPIXEL2/D18, NEOPIXEL6/D22
- SPI0 MOSI: SCL, NEOPIXEL3/D19, NEOPIXEL7/D23
- SPI0 MISO: TX, D4, NEOPIXEL0/D16, NEOPIXEL4/D20
- SPI0 CS: RX
- SPI1 SCK: SCK, A0, D10
- SPI1 MOSI: MO, A1, D11
- SPI1 MISO: MI, A2, D24, D12
- SPI1 CS: A3, D25, D13, D9
UART Pins
- UART0 TX: T (TX), A2, D12, NEOPIXEL0/D16
- UART0 RX: R (RX), A3, D13, NEOPIXEL1/D17
- UART1 TX: D24, MISO, D4, NEOPIXEL4/D20
- UART1 RX: D25, D9, D5, NEOPIXEL5/D21
PWM Pins
- PWM0 A: TX, NEOPIXEL0/D16
- PWM0 B: RX, NEOPIXEL1/D17
- PWM1 A: SDA, NEOPIXEL2/D18
- PWM1 B: SCL, NEOPIXEL3/D19
- PWM2 A: D4, NEOPIXEL4/D20
- PWM2 B: D5, NEOPIXEL5/D21
- PWM3 A: D6, NEOPIXEL6/D22
- PWM3 B: NEOPIXEL7/D23
- PWM4 A: D24, MISO
- PWM4 B: D25, D9
- PWM5 A: A0, D10
- PWM5 B: A1, D11
- PWM6 A: A2, D12
- PWM6 B: A3, D13
- PWM7 A: SCK
- PWM7 B: MOSI
The square towards the middle is the RP2040 microcontroller, the "brains" of the Feather RP2040 SCORPIO board.
The square near the BOOT button is the QSPI Flash. It is connected to 6 dedicated pins that are not brought out on the GPIO pads. This way you don't have to worry about the SPI flash colliding with other devices on the main SPI connection. Plus, QSPI is at least an order of magnitude faster than plain SPI flash.
The Feather RP2040 SCORPIO has two buttons.
The BOOT button is used to enter the bootloader to install/update CircuitPython, and sometimes before uploading Arduino code. To enter the bootloader, press and hold BOOT and then power up the board (either by plugging it into USB or pressing RESET). Other times, when code is running on the board, BOOT (aka digital pin 7 in Arduino) can be used as an input if you don’t want to wire up a button on another pin.
The RESET button restarts the board and helps enter the bootloader. You can click it to reset the board without unplugging the USB cable or battery.
The RST pin is can be used to reset the board. Momentarily tie to ground manually to reset the board.
Above the pin labels for MO and MI is the status NeoPixel LED. In CircuitPython, the NeoPixel is board.NEOPIXEL
and the library for it is here and in the bundle. In Arduino it’s digital pin 4. The NeoPixel is powered by the 3.3V power supply but that hasn't shown to make a big difference in brightness or color. In CircuitPython, the LED is used to indicate the runtime status.
Below the USB C connector is the CHG LED. This indicates the charge status of a connected lipoly battery, if one is present and USB is connected. It is amber while charging, and green when fully charged. Note, it's normal for this LED to flicker when no battery is in place, that's the charge circuitry trying to detect whether a battery is there or not.
Above the USB C connector is the D13 LED. This little red LED is controllable in CircuitPython code using board.LED
, or digital pin 13 in Arduino. Also, this LED will pulse when the board is in bootloader mode.
The Feather RP2040 comes with a built in STEMMA QT connector! This means you can connect up all sorts of I2C sensors and breakouts, no soldering required! This connector uses the SCL and SDA pins for I2C, which ends up being the RP2040's I2C1 peripheral. In CircuitPython, you can use the STEMMA connector with board.SCL
and board.SDA
, or board.STEMMA_I2C()
. In Arduino it is Wire
(not Wire1).
On the back of the board are pads for the SWCLK and SWDIO pins. They provide access to the internal Serial Wire Debug multi-drop bus, which provides debug access to both processors, and can be used to download code.
The back side of the board has pads to access the BOOT switch line and the USB D+ and D- pins. This is all esoteric but perhaps somebody has a use.
Feather RP2040 SCORPIO has only two mounting holes, at the USB end of the board. Adafruit Feather boards normally have four holes at the corners, but two were sacrificed here to accommodate the board-end SCORPIO header while maintaining standard Feather dimensions.
Text editor powered by tinymce.