71 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * 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>
 | |
| 
 | |
| #define SPI_CLOCK_DIV4 0x00
 | |
| #define SPI_CLOCK_DIV16 0x01
 | |
| #define SPI_CLOCK_DIV64 0x02
 | |
| #define SPI_CLOCK_DIV128 0x03
 | |
| #define SPI_CLOCK_DIV2 0x04
 | |
| #define SPI_CLOCK_DIV8 0x05
 | |
| #define SPI_CLOCK_DIV32 0x06
 | |
| #define SPI_CLOCK_DIV64 0x07
 | |
| 
 | |
| #define SPI_MODE0 0x00
 | |
| #define SPI_MODE1 0x04
 | |
| #define SPI_MODE2 0x08
 | |
| #define SPI_MODE3 0x0C
 | |
| 
 | |
| #define SPI_MODE_MASK 0x0C  // CPOL = bit 3, CPHA = bit 2 on SPCR
 | |
| #define SPI_CLOCK_MASK 0x03  // SPR1 = bit 1, SPR0 = bit 0 on SPCR
 | |
| #define SPI_2XCLOCK_MASK 0x01  // SPI2X = bit 0 on SPSR
 | |
| 
 | |
| class SPIClass {
 | |
| public:
 | |
|   inline static byte transfer(byte _data);
 | |
| 
 | |
|   // SPI Configuration methods
 | |
| 
 | |
|   inline static void attachInterrupt();
 | |
|   inline static void detachInterrupt(); // Default
 | |
| 
 | |
|   static void begin(); // Default
 | |
|   static void end();
 | |
| 
 | |
|   static void setBitOrder(uint8_t);
 | |
|   static void setDataMode(uint8_t);
 | |
|   static void setClockDivider(uint8_t);
 | |
| };
 | |
| 
 | |
| extern SPIClass SPI;
 | |
| 
 | |
| byte SPIClass::transfer(byte _data) {
 | |
|   SPDR = _data;
 | |
|   while (!(SPSR & _BV(SPIF)))
 | |
|     ;
 | |
|   return SPDR;
 | |
| }
 | |
| 
 | |
| void SPIClass::attachInterrupt() {
 | |
|   SPCR |= _BV(SPIE);
 | |
| }
 | |
| 
 | |
| void SPIClass::detachInterrupt() {
 | |
|   SPCR &= ~_BV(SPIE);
 | |
| }
 | |
| 
 | |
| #endif
 |