Skip to content

Commit c3a3526

Browse files
Fix SPI 16-bit transfers (#1882)
Fixes #1879 Fixes #1874
1 parent 280fc43 commit c3a3526

File tree

2 files changed

+6
-5
lines changed

2 files changed

+6
-5
lines changed

libraries/SPI/keywords.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ beginTransaction KEYWORD2
1818
endTransaction KEYWORD2
1919
SPISettings KEYWORD2
2020
transfer KEYWORD2
21+
transfer16 KEYWORD2
2122
setBitOrder KEYWORD2
2223
setDataMode KEYWORD2
2324
setClockDivider KEYWORD2

libraries/SPI/src/SPI.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ byte SPIClassRP2040::transfer(uint8_t data) {
111111
}
112112
data = (_spis.getBitOrder() == MSBFIRST) ? data : reverseByte(data);
113113
DEBUGSPI("SPI::transfer(%02x), cpol=%d, cpha=%d\n", data, cpol(), cpha());
114+
hw_write_masked(&spi_get_hw(_spi)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); // Fast set to 8-bits
114115
spi_write_read_blocking(_spi, &data, &ret, 1);
115116
ret = (_spis.getBitOrder() == MSBFIRST) ? ret : reverseByte(ret);
116117
DEBUGSPI("SPI: read back %02x\n", ret);
@@ -124,11 +125,8 @@ uint16_t SPIClassRP2040::transfer16(uint16_t data) {
124125
}
125126
data = (_spis.getBitOrder() == MSBFIRST) ? data : reverse16Bit(data);
126127
DEBUGSPI("SPI::transfer16(%04x), cpol=%d, cpha=%d\n", data, cpol(), cpha());
127-
uint8_t d[2];
128-
d[0] = (data >> 8) & 0xff;
129-
d[1] = data & 0xff;
130-
spi_write_read_blocking(_spi, d, d, 2);
131-
ret = ((d[0] << 8) | (d[1] & 0xff)) & 0xffff;
128+
hw_write_masked(&spi_get_hw(_spi)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); // Fast set to 16-bits
129+
spi_write16_read16_blocking(_spi, &data, &ret, 1);
132130
ret = (_spis.getBitOrder() == MSBFIRST) ? ret : reverse16Bit(ret);
133131
DEBUGSPI("SPI: read back %02x\n", ret);
134132
return ret;
@@ -149,6 +147,8 @@ void SPIClassRP2040::transfer(const void *txbuf, void *rxbuf, size_t count) {
149147
return;
150148
}
151149

150+
hw_write_masked(&spi_get_hw(_spi)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); // Fast set to 8-bits
151+
152152
DEBUGSPI("SPI::transfer(%p, %p, %d)\n", txbuf, rxbuf, count);
153153
const uint8_t *txbuff = reinterpret_cast<const uint8_t *>(txbuf);
154154
uint8_t *rxbuff = reinterpret_cast<uint8_t *>(rxbuf);

0 commit comments

Comments
 (0)