|
2 | 2 |
|
3 | 3 | // #define DEBUG_SERIAL Serial |
4 | 4 |
|
| 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 | + |
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,84 +199,70 @@ 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()) |
| 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()) { |
211 | 239 | reply |= b; |
212 | 240 | } |
213 | 241 | } |
214 | 242 |
|
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) |
221 | 244 |
|
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(); |
227 | 246 |
|
228 | 247 | if (bitdelay_us) { |
229 | 248 | delayMicroseconds(bitdelay_us); |
230 | 249 | } |
231 | 250 |
|
232 | 251 | 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); |
241 | 253 | } |
242 | 254 |
|
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(); |
248 | 256 |
|
249 | 257 | 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()) { |
255 | 259 | reply |= b; |
256 | 260 | } |
257 | 261 | } |
258 | 262 | } |
259 | | - if (_miso != -1) { |
260 | | - buffer[i] = reply; |
261 | | - } |
| 263 | + } |
| 264 | + if (_miso != -1) { |
| 265 | + buffer[i] = reply; |
262 | 266 | } |
263 | 267 | } |
264 | 268 | return; |
|
0 commit comments