|
2 | 2 |
|
3 | 3 | // #define DEBUG_SERIAL Serial |
4 | 4 |
|
| 5 | + |
| 6 | +#ifdef BUSIO_USE_FAST_PINIO |
| 7 | +#define BUSIO_SET_CLOCK_LOW() (*clkPort = *clkPort & ~clkPinMask) |
| 8 | +#define BUSIO_SET_CLOCK_HIGH() (*clkPort = *clkPort | clkPinMask) |
| 9 | +#define BUSIO_READ_MISO() (*misoPort & misoPinMask) |
| 10 | +#define BUSIO_WRITE_MOSI(value) 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 | + |
5 | 23 | /*! |
6 | 24 | * @brief Create an SPI device with the given CS pin and settings |
7 | 25 | * @param cspin The arduino pin number to use for chip select |
@@ -181,77 +199,40 @@ void Adafruit_SPIDevice::transfer(uint8_t *buffer, size_t len) { |
181 | 199 | if (_dataMode == SPI_MODE0 || _dataMode == SPI_MODE2) { |
182 | 200 | towrite = send & b; |
183 | 201 | 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); |
192 | 203 | lastmosi = towrite; |
193 | 204 | } |
194 | 205 |
|
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(); |
200 | 207 |
|
201 | 208 | if (bitdelay_us) { |
202 | 209 | delayMicroseconds(bitdelay_us); |
203 | 210 | } |
204 | 211 |
|
205 | 212 | 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()) |
211 | 214 | reply |= b; |
212 | 215 | } |
213 | 216 | } |
214 | 217 |
|
215 | | -#ifdef BUSIO_USE_FAST_PINIO |
216 | | - *clkPort = *clkPort & ~clkPinMask; // Clock low |
217 | | -#else |
218 | | - digitalWrite(_sck, LOW); |
219 | | -#endif |
| 218 | + BUSIO_SET_CLOCK_LOW(); |
| 219 | + |
220 | 220 | } else { // if (_dataMode == SPI_MODE1 || _dataMode == SPI_MODE3) |
221 | 221 |
|
222 | | -#ifdef BUSIO_USE_FAST_PINIO |
223 | | - *clkPort = *clkPort | clkPinMask; // Clock high |
224 | | -#else |
225 | | - digitalWrite(_sck, HIGH); |
226 | | -#endif |
| 222 | + BUSIO_SET_CLOCK_HIGH(); |
227 | 223 |
|
228 | 224 | if (bitdelay_us) { |
229 | 225 | delayMicroseconds(bitdelay_us); |
230 | 226 | } |
231 | 227 |
|
232 | 228 | 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 |
| 229 | + BUSIO_WRITE_MOSI(send & b); |
241 | 230 | } |
242 | 231 |
|
243 | | -#ifdef BUSIO_USE_FAST_PINIO |
244 | | - *clkPort = *clkPort & ~clkPinMask; // Clock low |
245 | | -#else |
246 | | - digitalWrite(_sck, LOW); |
247 | | -#endif |
| 232 | + BUSIO_SET_CLOCK_LOW(); |
248 | 233 |
|
249 | 234 | if (_miso != -1) { |
250 | | -#ifdef BUSIO_USE_FAST_PINIO |
251 | | - if (*misoPort & misoPinMask) { |
252 | | -#else |
253 | | - if (digitalRead(_miso)) { |
254 | | -#endif |
| 235 | + if (BUSIO_READ_MISO()) { |
255 | 236 | reply |= b; |
256 | 237 | } |
257 | 238 | } |
|
0 commit comments