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()16void 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()38void SPIClass::end() { 39 SPCR &= ~_BV(SPE); 40 } 41 setBitOrder(uint8_t bitOrder)42void 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)51void SPIClass::setDataMode(uint8_t mode) 52 { 53 SPCR = (SPCR & ~SPI_MODE_MASK) | mode; 54 } 55 setClockDivider(uint8_t rate)56void 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