Browse Source

Speedup transfer16() on AVR

main
PaulStoffregen 10 years ago
parent
commit
cec43ff698
1 changed files with 11 additions and 7 deletions
  1. +11
    -7
      SPI.h

+ 11
- 7
SPI.h View File

inline static uint16_t transfer16(uint16_t data) { inline static uint16_t transfer16(uint16_t data) {
union { uint16_t val; struct { uint8_t lsb; uint8_t msb; }; } in, out; union { uint16_t val; struct { uint8_t lsb; uint8_t msb; }; } in, out;
in.val = data; in.val = data;
if (!(SPCR & _BV(DORD))) {
SPDR = in.msb;
while (!(SPSR & _BV(SPIF))) ;
out.msb = SPDR;
if ((SPCR & _BV(DORD))) {
SPDR = in.lsb; SPDR = in.lsb;
asm volatile("nop");
while (!(SPSR & _BV(SPIF))) ; while (!(SPSR & _BV(SPIF))) ;
out.lsb = SPDR; out.lsb = SPDR;
} else {
SPDR = in.lsb;
SPDR = in.msb;
asm volatile("nop");
while (!(SPSR & _BV(SPIF))) ; while (!(SPSR & _BV(SPIF))) ;
out.lsb = SPDR;
out.msb = SPDR;
} else {
SPDR = in.msb; SPDR = in.msb;
asm volatile("nop");
while (!(SPSR & _BV(SPIF))) ; while (!(SPSR & _BV(SPIF))) ;
out.msb = SPDR; out.msb = SPDR;
SPDR = in.lsb;
asm volatile("nop");
while (!(SPSR & _BV(SPIF))) ;
out.lsb = SPDR;
} }
return out.val; return out.val;
} }

Loading…
Cancel
Save