1
1
/*
2
2
* Copyright (c) 2010 by Cristian Maglie <[email protected] >
3
+ * Copyright (c) 2014 by Paul Stoffregen <[email protected] > (Transaction API)
3
4
* SPI Master library for arduino.
4
5
*
5
6
* This file is free software; you can redistribute it and/or modify
8
9
* published by the Free Software Foundation.
9
10
*/
10
11
11
- #include " pins_arduino.h"
12
12
#include " SPI.h"
13
+ #include " pins_arduino.h"
13
14
14
15
SPIClass SPI;
15
16
16
- void SPIClass::begin () {
17
+ uint8_t SPIClass::interruptMode = 0 ;
18
+ uint8_t SPIClass::interruptMask = 0 ;
19
+ uint8_t SPIClass::interruptSave = 0 ;
20
+ #ifdef SPI_TRANSACTION_MISMATCH_LED
21
+ uint8_t SPIClass::inTransactionFlag = 0 ;
22
+ #endif
17
23
24
+ void SPIClass::begin ()
25
+ {
18
26
// Set SS to high so a connected chip will be "deselected" by default
19
27
digitalWrite (SS, HIGH);
20
28
@@ -39,28 +47,86 @@ void SPIClass::begin() {
39
47
pinMode (MOSI, OUTPUT);
40
48
}
41
49
42
-
43
50
void SPIClass::end () {
44
51
SPCR &= ~_BV (SPE);
45
52
}
46
53
47
- void SPIClass::setBitOrder (uint8_t bitOrder)
48
- {
49
- if (bitOrder == LSBFIRST) {
50
- SPCR |= _BV (DORD);
51
- } else {
52
- SPCR &= ~(_BV (DORD));
53
- }
54
- }
54
+ // mapping of interrupt numbers to bits within SPI_AVR_EIMSK
55
+ #if defined(__AVR_ATmega32U4__)
56
+ #define SPI_INT0_MASK (1 <<INT0)
57
+ #define SPI_INT1_MASK (1 <<INT1)
58
+ #define SPI_INT2_MASK (1 <<INT2)
59
+ #define SPI_INT3_MASK (1 <<INT3)
60
+ #define SPI_INT4_MASK (1 <<INT6)
61
+ #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
62
+ #define SPI_INT0_MASK (1 <<INT0)
63
+ #define SPI_INT1_MASK (1 <<INT1)
64
+ #define SPI_INT2_MASK (1 <<INT2)
65
+ #define SPI_INT3_MASK (1 <<INT3)
66
+ #define SPI_INT4_MASK (1 <<INT4)
67
+ #define SPI_INT5_MASK (1 <<INT5)
68
+ #define SPI_INT6_MASK (1 <<INT6)
69
+ #define SPI_INT7_MASK (1 <<INT7)
70
+ #elif defined(EICRA) && defined(EICRB) && defined(EIMSK)
71
+ #define SPI_INT0_MASK (1 <<INT4)
72
+ #define SPI_INT1_MASK (1 <<INT5)
73
+ #define SPI_INT2_MASK (1 <<INT0)
74
+ #define SPI_INT3_MASK (1 <<INT1)
75
+ #define SPI_INT4_MASK (1 <<INT2)
76
+ #define SPI_INT5_MASK (1 <<INT3)
77
+ #define SPI_INT6_MASK (1 <<INT6)
78
+ #define SPI_INT7_MASK (1 <<INT7)
79
+ #else
80
+ #ifdef INT0
81
+ #define SPI_INT0_MASK (1 <<INT0)
82
+ #endif
83
+ #ifdef INT1
84
+ #define SPI_INT1_MASK (1 <<INT1)
85
+ #endif
86
+ #ifdef INT2
87
+ #define SPI_INT2_MASK (1 <<INT2)
88
+ #endif
89
+ #endif
55
90
56
- void SPIClass::setDataMode (uint8_t mode )
91
+ void SPIClass::usingInterrupt (uint8_t interruptNumber )
57
92
{
58
- SPCR = (SPCR & ~SPI_MODE_MASK) | mode;
59
- }
93
+ uint8_t mask;
60
94
61
- void SPIClass::setClockDivider (uint8_t rate)
62
- {
63
- SPCR = (SPCR & ~SPI_CLOCK_MASK) | (rate & SPI_CLOCK_MASK);
64
- SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | ((rate >> 2 ) & SPI_2XCLOCK_MASK);
95
+ if (interruptMode > 1 ) return ;
96
+
97
+ noInterrupts ();
98
+ switch (interruptNumber) {
99
+ #ifdef SPI_INT0_MASK
100
+ case 0 : mask = SPI_INT0_MASK; break ;
101
+ #endif
102
+ #ifdef SPI_INT1_MASK
103
+ case 1 : mask = SPI_INT1_MASK; break ;
104
+ #endif
105
+ #ifdef SPI_INT2_MASK
106
+ case 2 : mask = SPI_INT2_MASK; break ;
107
+ #endif
108
+ #ifdef SPI_INT3_MASK
109
+ case 3 : mask = SPI_INT3_MASK; break ;
110
+ #endif
111
+ #ifdef SPI_INT4_MASK
112
+ case 4 : mask = SPI_INT4_MASK; break ;
113
+ #endif
114
+ #ifdef SPI_INT5_MASK
115
+ case 5 : mask = SPI_INT5_MASK; break ;
116
+ #endif
117
+ #ifdef SPI_INT6_MASK
118
+ case 6 : mask = SPI_INT6_MASK; break ;
119
+ #endif
120
+ #ifdef SPI_INT7_MASK
121
+ case 7 : mask = SPI_INT7_MASK; break ;
122
+ #endif
123
+ default :
124
+ interruptMode = 2 ;
125
+ interrupts ();
126
+ return ;
127
+ }
128
+ interruptMode = 1 ;
129
+ interruptMask |= mask;
130
+ interrupts ();
65
131
}
66
132
0 commit comments