• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2010 by Cristian Maglie <c.maglie@bug.st>
3  * SPI Master library for arduino.
4  *
5  * This file is free software; you can redistribute it and/or modify
6  * it under the terms of either the GNU General Public License version 2
7  * or the GNU Lesser General Public License version 2.1, both as
8  * published by the Free Software Foundation.
9  */
10 
11 #include "pins_arduino.h"
12 #include "SPI.h"
13 
14 SPIClass SPI;
15 
begin()16 void SPIClass::begin() {
17   // Set direction register for SCK and MOSI pin.
18   // MISO pin automatically overrides to INPUT.
19   // When the SS pin is set as OUTPUT, it can be used as
20   // a general purpose output port (it doesn't influence
21   // SPI operations).
22 
23   pinMode(SCK, OUTPUT);
24   pinMode(MOSI, OUTPUT);
25   pinMode(SS, OUTPUT);
26 
27   digitalWrite(SCK, LOW);
28   digitalWrite(MOSI, LOW);
29   digitalWrite(SS, HIGH);
30 
31   // Warning: if the SS pin ever becomes a LOW INPUT then SPI
32   // automatically switches to Slave, so the data direction of
33   // the SS pin MUST be kept as OUTPUT.
34   SPCR |= _BV(MSTR);
35   SPCR |= _BV(SPE);
36 }
37 
end()38 void SPIClass::end() {
39   SPCR &= ~_BV(SPE);
40 }
41 
setBitOrder(uint8_t bitOrder)42 void SPIClass::setBitOrder(uint8_t bitOrder)
43 {
44   if(bitOrder == LSBFIRST) {
45     SPCR |= _BV(DORD);
46   } else {
47     SPCR &= ~(_BV(DORD));
48   }
49 }
50 
setDataMode(uint8_t mode)51 void SPIClass::setDataMode(uint8_t mode)
52 {
53   SPCR = (SPCR & ~SPI_MODE_MASK) | mode;
54 }
55 
setClockDivider(uint8_t rate)56 void SPIClass::setClockDivider(uint8_t rate)
57 {
58   SPCR = (SPCR & ~SPI_CLOCK_MASK) | (rate & SPI_CLOCK_MASK);
59   SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | ((rate >> 2) & SPI_2XCLOCK_MASK);
60 }
61 
62