Project

General

Profile

Statistics
| Branch: | Revision:

root / arduino-1.0 / libraries / SPI / SPI.cpp @ 58d82c77

History | View | Annotate | Download (1.47 KB)

1 58d82c77 Tom Mullins
/*
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
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
38
void SPIClass::end() {
39
  SPCR &= ~_BV(SPE);
40
}
41
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
51
void SPIClass::setDataMode(uint8_t mode)
52
{
53
  SPCR = (SPCR & ~SPI_MODE_MASK) | mode;
54
}
55
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
}