diff options
| author | Cristian Maglie <c.maglie@bug.st> | 2013-05-29 18:30:36 +0200 | 
|---|---|---|
| committer | Cristian Maglie <c.maglie@bug.st> | 2013-05-29 18:30:36 +0200 | 
| commit | d90fcca5839d13d57ed527d4009b78d22dafbde7 (patch) | |
| tree | 768b98af21e5075846184dd3de41ae0c22e75e20 /libraries/Robot_Control/SPI.cpp | |
| parent | 7207108255a772474b322151cb0fd113e8030afe (diff) | |
| parent | ef4e8c65373f531ce6d37ff226a21fc9b358ff29 (diff) | |
Merged 1.0.5
Diffstat (limited to 'libraries/Robot_Control/SPI.cpp')
| -rw-r--r-- | libraries/Robot_Control/SPI.cpp | 66 | 
1 files changed, 66 insertions, 0 deletions
| diff --git a/libraries/Robot_Control/SPI.cpp b/libraries/Robot_Control/SPI.cpp new file mode 100644 index 0000000..5e48073 --- /dev/null +++ b/libraries/Robot_Control/SPI.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2010 by Cristian Maglie <c.maglie@bug.st> + * SPI Master library for arduino. + * + * This file is free software; you can redistribute it and/or modify + * it under the terms of either the GNU General Public License version 2 + * or the GNU Lesser General Public License version 2.1, both as + * published by the Free Software Foundation. + */ + +#include "pins_arduino.h" +#include "SPI.h" + +SPIClass SPI; + +void SPIClass::begin() { + +  // Set SS to high so a connected chip will be "deselected" by default +  digitalWrite(SS, HIGH); + +  // When the SS pin is set as OUTPUT, it can be used as +  // a general purpose output port (it doesn't influence +  // SPI operations). +  pinMode(SS, OUTPUT); + +  // Warning: if the SS pin ever becomes a LOW INPUT then SPI +  // automatically switches to Slave, so the data direction of +  // the SS pin MUST be kept as OUTPUT. +  SPCR |= _BV(MSTR); +  SPCR |= _BV(SPE); + +  // Set direction register for SCK and MOSI pin. +  // MISO pin automatically overrides to INPUT. +  // By doing this AFTER enabling SPI, we avoid accidentally +  // clocking in a single bit since the lines go directly +  // from "input" to SPI control.   +  // http://code.google.com/p/arduino/issues/detail?id=888 +  pinMode(SCK, OUTPUT); +  pinMode(MOSI, OUTPUT); +} + + +void SPIClass::end() { +  SPCR &= ~_BV(SPE); +} + +void SPIClass::setBitOrder(uint8_t bitOrder) +{ +  if(bitOrder == LSBFIRST) { +    SPCR |= _BV(DORD); +  } else { +    SPCR &= ~(_BV(DORD)); +  } +} + +void SPIClass::setDataMode(uint8_t mode) +{ +  SPCR = (SPCR & ~SPI_MODE_MASK) | mode; +} + +void SPIClass::setClockDivider(uint8_t rate) +{ +  SPCR = (SPCR & ~SPI_CLOCK_MASK) | (rate & SPI_CLOCK_MASK); +  SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | ((rate >> 2) & SPI_2XCLOCK_MASK); +} + | 
