SPI setDataMode may be broken

Hi,

While debugging a code of mine that uses SPI to interface with a chip that requires data mode 3, I think I found a bug in the setDataMode function:

In 0021 it is :

void SPIClass::setDataMode(uint8_t mode)
{
  SPCR = (SPCR & ~SPI_MODE_MASK) | mode;
}

When the 'mode' argument is in the range described in the documentation (0-3), it does change the SPI data mode(CPOL and CPHA), but the bits SPR0 and SPR1, meaning it overwrites the SPI clock rate.

I think it should be something like:

void SPIClass::setDataMode(uint8_t mode)
{
  SPCR = (SPCR & ~SPI_MODE_MASK) | ( (mode & 0x02)?1:0 ) << CPOL ) | ( ( mode & 0x01) << CPHA );
}

or simply:

void SPIClass::setDataMode(uint8_t mode)
{
  SPCR = (SPCR & ~SPI_MODE_MASK) | (mode << 2 );
}

Thanks for all your hard work guys!

bug in the setDataMode

Well...

In SPI.H:

#define SPI_MODE0 0x00
#define SPI_MODE1 0x04
#define SPI_MODE2 0x08
#define SPI_MODE3 0x0C

#define SPI_MODE_MASK 0x0C  // CPOL = bit 3, CPHA = bit 2 on SPCR

So...

You should call setDataMode with the mode argument equal to SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3. (not 0, 1, 2 or 3).

Regards,

Dave

Oh my... sorry for that -_-'

Nevermind.