Skip to content

transfer16 equivalence #1

@rtek1000

Description

@rtek1000

Hello, nice job!

The arduino's current hardware library has a 16-bit transfer routine. Would it be possible to add this routine to the library via software?

This seems to be the original code (Arduino IDE source):

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

The equivalent could be this way, as below?

inline static uint16_t transfer16(uint16_t data, bool MSB1ST = true) {
  union {
    uint16_t val;
    struct {
      uint8_t lsb;
      uint8_t msb;
    };
  } in, out;
  in.val = data;

  if (MSB1ST) {
    out.msb = mySPI.transfer(in.msb);
    out.lsb = mySPI.transfer(in.lsb);
  } else {
    out.lsb = mySPI.transfer(in.lsb);
    out.msb = mySPI.transfer(in.msb);
  }

  return out.val;
}

Thank you!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions