Skip to content

Commit 860b43b

Browse files
authored
Two board variant definitions and a high speed SPI transfer function (#172)
1 parent 35260c1 commit 860b43b

File tree

6 files changed

+728
-8
lines changed

6 files changed

+728
-8
lines changed

boards.txt

Lines changed: 584 additions & 0 deletions
Large diffs are not rendered by default.

libraries/SPI/SPI.cpp

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,29 @@ SPIClassRP2040::SPIClassRP2040(spi_inst_t *spi, pin_size_t rx, pin_size_t cs, pi
3535

3636
inline spi_cpol_t SPIClassRP2040::cpol() {
3737
switch (_spis.getDataMode()) {
38-
case SPI_MODE0: return SPI_CPOL_0;
39-
case SPI_MODE1: return SPI_CPOL_0;
40-
case SPI_MODE2: return SPI_CPOL_1;
41-
case SPI_MODE3: return SPI_CPOL_1;
38+
case SPI_MODE0:
39+
return SPI_CPOL_0;
40+
case SPI_MODE1:
41+
return SPI_CPOL_0;
42+
case SPI_MODE2:
43+
return SPI_CPOL_1;
44+
case SPI_MODE3:
45+
return SPI_CPOL_1;
4246
}
4347
// Error
4448
return SPI_CPOL_0;
4549
}
4650

4751
inline spi_cpha_t SPIClassRP2040::cpha() {
4852
switch (_spis.getDataMode()) {
49-
case SPI_MODE0: return SPI_CPHA_0;
50-
case SPI_MODE1: return SPI_CPHA_1;
51-
case SPI_MODE2: return SPI_CPHA_0;
52-
case SPI_MODE3: return SPI_CPHA_1;
53+
case SPI_MODE0:
54+
return SPI_CPHA_0;
55+
case SPI_MODE1:
56+
return SPI_CPHA_1;
57+
case SPI_MODE2:
58+
return SPI_CPHA_0;
59+
case SPI_MODE3:
60+
return SPI_CPHA_1;
5361
}
5462
// Error
5563
return SPI_CPHA_0;
@@ -124,6 +132,42 @@ void SPIClassRP2040::transfer(void *buf, size_t count) {
124132
DEBUGSPI("SPI::transfer completed\n");
125133
}
126134

135+
void SPIClassRP2040::transfer(void *txbuf, void *rxbuf, size_t count) {
136+
if (!_initted) {
137+
return;
138+
}
139+
140+
DEBUGSPI("SPI::transfer(%p, %p, %d)\n", txbuf, rxbuf, count);
141+
uint8_t *txbuff = reinterpret_cast<uint8_t *>(txbuf);
142+
uint8_t *rxbuff = reinterpret_cast<uint8_t *>(rxbuf);
143+
144+
// MSB version is easy!
145+
if (_spis.getBitOrder() == MSBFIRST) {
146+
spi_set_format(_spi, 8, cpol(), cpha(), SPI_MSB_FIRST);
147+
148+
if (rxbuf == NULL) { // transmit only!
149+
spi_write_blocking(_spi, txbuff, count);
150+
return;
151+
}
152+
if (txbuf == NULL) { // receive only!
153+
spi_read_blocking(_spi, 0xFF, rxbuff, count);
154+
return;
155+
}
156+
// transmit and receive!
157+
spi_write_read_blocking(_spi, txbuff, rxbuff, count);
158+
return;
159+
}
160+
161+
// If its LSB this isn't nearly as fun, we'll just let transfer(x) do it :(
162+
for (size_t i = 0; i < count; i++) {
163+
*rxbuff = transfer(*txbuff);
164+
*rxbuff = (_spis.getBitOrder() == MSBFIRST) ? *rxbuff : reverseByte(*rxbuff);
165+
txbuff++;
166+
rxbuff++;
167+
}
168+
DEBUGSPI("SPI::transfer completed\n");
169+
}
170+
127171
void SPIClassRP2040::beginTransaction(SPISettings settings) {
128172
DEBUGSPI("SPI::beginTransaction(clk=%d, bo=%s\n", _spis.getClockFreq(), (_spis.getBitOrder() == MSBFIRST) ? "MSB" : "LSB");
129173
_spis = settings;

libraries/SPI/SPI.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ class SPIClassRP2040 : public arduino::HardwareSPI {
3535
// Sends buffer in 8 bit chunks. Overwrites buffer with read data
3636
void transfer(void *buf, size_t count) override;
3737

38+
// Sends one buffer and receives into another, much faster! can set rx or txbuf to NULL
39+
void transfer(void *txbuf, void *rxbuf, size_t count);
40+
3841
// Call before/after every complete transaction
3942
void beginTransaction(SPISettings settings) override;
4043
void endTransaction(void) override;

tools/makeboards.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,5 +123,7 @@ def MakeBoard(name, vendor_name, product_name, vid, pid, boarddefine, flashsizem
123123
MakeBoard("adafruit_feather", "Adafruit", "Feather RP2040", "0x239a", "0x80f1", "ADAFRUIT_FEATHER_RP2040", 8, "boot2_w25x10cl_4_padded_checksum")
124124
MakeBoard("adafruit_itsybitsy", "Adafruit", "ItsyBitsy RP2040", "0x239a", "0x80fd", "ADAFRUIT_ITSYBITSY_RP2040", 8, "boot2_w25q080_2_padded_checksum")
125125
MakeBoard("adafruit_qtpy", "Adafruit", "QT Py RP2040", "0x239a", "0x80f7", "ADAFRUIT_QTPY_RP2040", 8, "boot2_generic_03h_4_padded_checksum")
126+
MakeBoard("adafruit_stemmafriend", "Adafruit", "STEMMA Friend RP2040", "0x239a", "0x80e3", "ADAFRUIT_STEMMAFRIEND_RP2040", 8, "boot2_w25q080_2_padded_checksum")
127+
MakeBoard("adafruit_trinkeyrp2040qt", "Adafruit", "Trinkey RP2040 QT", "0x239a", "0x8109", "ADAFRUIT_TRINKEYQT_RP2040", 8, "boot2_w25q080_2_padded_checksum")
126128
MakeBoard("generic", "Generic", "RP2040", "0x2e8a", "0xf00a", "GENERIC_RP2040", 16, "boot2_generic_03h_4_padded_checksum")
127129

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#pragma once
2+
3+
// Pin definitions taken from:
4+
// https://learn.adafruit.com/assets/100337
5+
6+
// LEDs not pinned out
7+
#define PIN_LED (12u) // backlight, weird but why not?
8+
9+
#define PIN_NEOPIXEL (17u)
10+
#define NUM_NEOPIXEL (1u)
11+
#define PIN_SWITCH (11u)
12+
13+
// Serial
14+
#define PIN_SERIAL1_TX (26u) // shared on grove/jst 2mm
15+
#define PIN_SERIAL1_RX (27u) // shared on grove/jst 2mm
16+
17+
// Not pinned out
18+
#define PIN_SERIAL2_TX (20u) // shared on JST SH
19+
#define PIN_SERIAL2_RX (21u)
20+
21+
// SPI
22+
#define PIN_SPI0_MISO (4u) // unconnected
23+
#define PIN_SPI0_MOSI (7u) // TFT data
24+
#define PIN_SPI0_SCK (2u) // TFT clock
25+
#define PIN_SPI0_SS (1u) // TFT CS
26+
27+
// Not pinned out
28+
#define PIN_SPI1_MISO (31u)
29+
#define PIN_SPI1_MOSI (31u)
30+
#define PIN_SPI1_SCK (31u)
31+
#define PIN_SPI1_SS (31u)
32+
33+
// Wire connected to STEMMA QT
34+
#define PIN_WIRE0_SDA (20u)
35+
#define PIN_WIRE0_SCL (21u)
36+
37+
// Wire1 is connected to Stemma JST/grove connector
38+
#define PIN_WIRE1_SDA (26u)
39+
#define PIN_WIRE1_SCL (27u)
40+
41+
#define SERIAL_HOWMANY (2u)
42+
#define SPI_HOWMANY (1u)
43+
#define WIRE_HOWMANY (2u)
44+
45+
#include "../generic/common.h"
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#pragma once
2+
3+
// LEDs not pinned out
4+
#define PIN_LED (31u)
5+
6+
#define PIN_NEOPIXEL (27u)
7+
#define NUM_NEOPIXEL (1u)
8+
#define PIN_SWITCH (12u)
9+
10+
// Serial, shared on QT pin
11+
#define PIN_SERIAL1_TX (16u)
12+
#define PIN_SERIAL1_RX (17u)
13+
14+
// Not pinned out
15+
#define PIN_SERIAL2_TX (31u)
16+
#define PIN_SERIAL2_RX (31u)
17+
18+
// SPI Not pinned out
19+
#define PIN_SPI0_MISO (31u)
20+
#define PIN_SPI0_MOSI (31u)
21+
#define PIN_SPI0_SCK (31u)
22+
#define PIN_SPI0_SS (31u)
23+
24+
// Not pinned out
25+
#define PIN_SPI1_MISO (31u)
26+
#define PIN_SPI1_MOSI (31u)
27+
#define PIN_SPI1_SCK (31u)
28+
#define PIN_SPI1_SS (31u)
29+
30+
// Wire
31+
#define PIN_WIRE0_SDA (16u)
32+
#define PIN_WIRE0_SCL (17u)
33+
34+
// Wire1 Not pinned out
35+
#define PIN_WIRE1_SDA (31u)
36+
#define PIN_WIRE1_SCL (31u)
37+
38+
#define SERIAL_HOWMANY (1u)
39+
#define SPI_HOWMANY (0u)
40+
#define WIRE_HOWMANY (1u)
41+
42+
#include "../generic/common.h"

0 commit comments

Comments
 (0)