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