1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-07-30 16:24:09 +03:00

Adding SPI library and revising Ethernet library (Christian Maglie).

This commit is contained in:
David A. Mellis
2010-08-02 18:59:44 +00:00
parent 78e093b482
commit e24b135755
24 changed files with 1429 additions and 2524 deletions

94
libraries/SPI/SPI.cpp Normal file
View File

@ -0,0 +1,94 @@
/*
* 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 "SPI.h"
SPIClass SPI;
SPIClass::SPIClass()
{
#if defined(__AVR_ATmega1280__)
// PBx
const static byte SS = 0;
const static byte MOSI = 2;
const static byte MISO = 3;
const static byte SCK = 1;
#else
// PBx
const static byte SS = 2;
const static byte MOSI = 3;
const static byte MISO = 4;
const static byte SCK = 5;
#endif
// Set direction register for SCK and MOSI pin.
// MISO pin automatically overrides to INPUT.
// When the SS pin is set as OUTPUT, it can be used as
// a general purpose output port (it doesn't influence
// SPI operations).
DDRB |= _BV(SCK) | _BV(MOSI) | _BV(SS);
PORTB &= ~(_BV(SCK) | _BV(MOSI) | _BV(SS));
SPCR = _BV(SPE) | _BV(MSTR);
// 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(SPE) | _BV(MSTR);
}
void SPIClass::setDataOrder(SPIDataOrder _d)
{
if (_d == SPI_DataOrder_LSB)
SPCR |= _BV(DORD); // LSB
else
SPCR &= ~_BV(DORD); // MSB
}
void SPIClass::setSPIMode(SPIMode _d)
{
switch (_d) {
case SPI_Mode_SampleRising:
SPCR &= ~(_BV(CPOL) | _BV(CPHA));
break;
case SPI_Mode_SetupRising:
SPCR &= ~_BV(CPOL);
SPCR |= _BV(CPHA);
break;
case SPI_Mode_SampleFalling:
SPCR &= ~_BV(CPHA);
SPCR |= _BV(CPOL);
break;
case SPI_Mode_SetupFalling:
SPCR |= _BV(CPOL) | _BV(CPHA);
break;
}
}
void SPIClass::setClockDivider(SPIClockDivider _d)
{
switch (_d) {
case SPI_ClkDiv_4:
SPCR &= ~(_BV(SPR1) | _BV(SPR0));
break;
case SPI_ClkDiv_16:
SPCR &= ~_BV(SPR1);
SPCR |= _BV(SPR0);
break;
case SPI_ClkDiv_64:
SPCR |= _BV(SPR1);
SPCR &= ~_BV(SPR0);
break;
case SPI_ClkDiv_128:
SPCR |= _BV(SPR1) | _BV(SPR0);
break;
}
}

93
libraries/SPI/SPI.h Normal file
View File

@ -0,0 +1,93 @@
/*
* 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.
*/
#ifndef _SPI_H_INCLUDED
#define _SPI_H_INCLUDED
#include <stdio.h>
#include <WProgram.h>
#include <avr/pgmspace.h>
enum SPIClockDivider {
SPI_ClkDiv_4,
SPI_ClkDiv_16,
SPI_ClkDiv_64,
SPI_ClkDiv_128,
};
enum SPIDataOrder {
SPI_DataOrder_LSB,
SPI_DataOrder_MSB,
};
enum SPIMode {
SPI_Mode_SampleRising,
SPI_Mode_SetupRising,
SPI_Mode_SampleFalling,
SPI_Mode_SetupFalling,
};
class SPIClass {
public:
SPIClass();
inline static byte send(byte _data);
// SPI Configuration methods
inline static void attachInterrupt();
inline static void detachInterrupt(); // Default
inline static void begin(); // Default
inline static void end();
static void setDataOrder(SPIDataOrder);
static void setSPIMode(SPIMode);
static void setClockDivider(SPIClockDivider);
inline static void doubleSpeed();
inline static void noDoubleSpeed(); // Default
};
extern SPIClass SPI;
byte SPIClass::send(byte _data) {
SPDR = _data;
while (!(SPSR & _BV(SPIF)))
;
return SPDR;
}
void SPIClass::attachInterrupt() {
SPCR |= _BV(SPIE);
}
void SPIClass::detachInterrupt() {
SPCR &= ~_BV(SPIE);
}
void SPIClass::begin() {
SPCR |= _BV(SPE);
}
void SPIClass::end() {
SPCR &= ~_BV(SPE);
}
void SPIClass::doubleSpeed() {
SPSR |= _BV(SPI2X);
}
void SPIClass::noDoubleSpeed() {
SPSR &= ~_BV(SPI2X);
}
#endif

View File

@ -0,0 +1,51 @@
#######################################
# Syntax Coloring Map SPI
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
SPI KEYWORD1
#######################################
# Methods and Functions (KEYWORD2)
#######################################
send KEYWORD2
sendInt16 KEYWORD2
sendInt32 KEYWORD2
initSS KEYWORD2
setSS KEYWORD2
resetSS KEYWORD2
initSS2 KEYWORD2
setSS2 KEYWORD2
resetSS2 KEYWORD2
initSS3 KEYWORD2
setSS3 KEYWORD2
resetSS3 KEYWORD2
initSS4 KEYWORD2
setSS4 KEYWORD2
resetSS4 KEYWORD2
enableInterrupt KEYWORD2
disableInterrupt KEYWORD2
enable KEYWORD2
disable KEYWORD2
dataOrderLSB KEYWORD2
dataOrderMSB KEYWORD2
setSPIMode0 KEYWORD2
setSPIMode1 KEYWORD2
setSPIMode2 KEYWORD2
setSPIMode3 KEYWORD2
setClockDividerTo2 KEYWORD2
setClockDividerTo4 KEYWORD2
setClockDividerTo8 KEYWORD2
setClockDividerTo16 KEYWORD2
setClockDividerTo32 KEYWORD2
setClockDividerTo64 KEYWORD2
setClockDividerTo128 KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################