Skip to content

Commit fccaf61

Browse files
authored
Merge pull request #146 from adafruit/spi_bitbang_mode3
Spi bitbang mode3
2 parents e75ac29 + bd4135b commit fccaf61

File tree

1 file changed

+54
-50
lines changed

1 file changed

+54
-50
lines changed

Adafruit_SPIDevice.cpp

Lines changed: 54 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,24 @@
22

33
// #define DEBUG_SERIAL Serial
44

5+
#ifdef BUSIO_USE_FAST_PINIO
6+
#define BUSIO_SET_CLOCK_LOW() (*clkPort = *clkPort & ~clkPinMask)
7+
#define BUSIO_SET_CLOCK_HIGH() (*clkPort = *clkPort | clkPinMask)
8+
#define BUSIO_READ_MISO() (*misoPort & misoPinMask)
9+
#define BUSIO_WRITE_MOSI(value) \
10+
do { \
11+
if (value) \
12+
*mosiPort = *mosiPort | mosiPinMask; \
13+
else \
14+
*mosiPort = *mosiPort & ~mosiPinMask; \
15+
} while (0)
16+
#else
17+
#define BUSIO_SET_CLOCK_LOW() digitalWrite(_sck, LOW)
18+
#define BUSIO_SET_CLOCK_HIGH() digitalWrite(_sck, HIGH)
19+
#define BUSIO_READ_MISO() digitalRead(_miso)
20+
#define BUSIO_WRITE_MOSI(value) digitalWrite(_mosi, value)
21+
#endif
22+
523
/*!
624
* @brief Create an SPI device with the given CS pin and settings
725
* @param cspin The arduino pin number to use for chip select
@@ -181,84 +199,70 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) {
181199
if (_dataMode == SPI_MODE0 || _dataMode == SPI_MODE2) {
182200
towrite = send & b;
183201
if ((_mosi != -1) && (lastmosi != towrite)) {
184-
#ifdef BUSIO_USE_FAST_PINIO
185-
if (towrite)
186-
*mosiPort = *mosiPort | mosiPinMask;
187-
else
188-
*mosiPort = *mosiPort & ~mosiPinMask;
189-
#else
190-
digitalWrite(_mosi, towrite);
191-
#endif
202+
BUSIO_WRITE_MOSI(towrite);
192203
lastmosi = towrite;
193204
}
194205

195-
#ifdef BUSIO_USE_FAST_PINIO
196-
*clkPort = *clkPort | clkPinMask; // Clock high
197-
#else
198-
digitalWrite(_sck, HIGH);
199-
#endif
206+
BUSIO_SET_CLOCK_HIGH();
200207

201208
if (bitdelay_us) {
202209
delayMicroseconds(bitdelay_us);
203210
}
204211

205212
if (_miso != -1) {
206-
#ifdef BUSIO_USE_FAST_PINIO
207-
if (*misoPort & misoPinMask) {
208-
#else
209-
if (digitalRead(_miso)) {
210-
#endif
213+
if (BUSIO_READ_MISO())
214+
reply |= b;
215+
}
216+
217+
BUSIO_SET_CLOCK_LOW();
218+
219+
} else if (_dataMode == SPI_MODE3) {
220+
221+
if (_mosi != -1) { // transmit on falling edge
222+
BUSIO_WRITE_MOSI(send & b);
223+
}
224+
225+
BUSIO_SET_CLOCK_LOW();
226+
227+
if (bitdelay_us) {
228+
delayMicroseconds(bitdelay_us);
229+
}
230+
231+
BUSIO_SET_CLOCK_HIGH();
232+
233+
if (bitdelay_us) {
234+
delayMicroseconds(bitdelay_us);
235+
}
236+
237+
if (_miso != -1) { // read on rising edge
238+
if (BUSIO_READ_MISO()) {
211239
reply |= b;
212240
}
213241
}
214242

215-
#ifdef BUSIO_USE_FAST_PINIO
216-
*clkPort = *clkPort & ~clkPinMask; // Clock low
217-
#else
218-
digitalWrite(_sck, LOW);
219-
#endif
220-
} else { // if (_dataMode == SPI_MODE1 || _dataMode == SPI_MODE3)
243+
} else { // || _dataMode == SPI_MODE1)
221244

222-
#ifdef BUSIO_USE_FAST_PINIO
223-
*clkPort = *clkPort | clkPinMask; // Clock high
224-
#else
225-
digitalWrite(_sck, HIGH);
226-
#endif
245+
BUSIO_SET_CLOCK_HIGH();
227246

228247
if (bitdelay_us) {
229248
delayMicroseconds(bitdelay_us);
230249
}
231250

232251
if (_mosi != -1) {
233-
#ifdef BUSIO_USE_FAST_PINIO
234-
if (send & b)
235-
*mosiPort = *mosiPort | mosiPinMask;
236-
else
237-
*mosiPort = *mosiPort & ~mosiPinMask;
238-
#else
239-
digitalWrite(_mosi, send & b);
240-
#endif
252+
BUSIO_WRITE_MOSI(send & b);
241253
}
242254

243-
#ifdef BUSIO_USE_FAST_PINIO
244-
*clkPort = *clkPort & ~clkPinMask; // Clock low
245-
#else
246-
digitalWrite(_sck, LOW);
247-
#endif
255+
BUSIO_SET_CLOCK_LOW();
248256

249257
if (_miso != -1) {
250-
#ifdef BUSIO_USE_FAST_PINIO
251-
if (*misoPort & misoPinMask) {
252-
#else
253-
if (digitalRead(_miso)) {
254-
#endif
258+
if (BUSIO_READ_MISO()) {
255259
reply |= b;
256260
}
257261
}
258262
}
259-
if (_miso != -1) {
260-
buffer[i] = reply;
261-
}
263+
}
264+
if (_miso != -1) {
265+
buffer[i] = reply;
262266
}
263267
}
264268
return;

0 commit comments

Comments
 (0)