You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					71 lines
				
				1.6 KiB
			
		
		
			
		
	
	
					71 lines
				
				1.6 KiB
			|   
											13 years ago
										 | /*
 | ||
|  |  * 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
 |