1 | #ifndef _SPIDRIVER_H_
|
2 | #define _SPIDRIVER_H_
|
3 |
|
4 | typedef int bool;
|
5 | /*!< Definition for boolean type. */
|
6 | #ifdef __MISRA__ /* MISRA rule #18 */
|
7 | #define true 1u
|
8 | /*!< Definitioni for TRUE. */
|
9 | #define false 0u
|
10 | /*!< Definition for FALSE. */
|
11 | #else
|
12 | #define true 1
|
13 | /*!< Definitioni for TRUE. */
|
14 | #define false 0
|
15 | /*!< Definition for FALSE. */
|
16 | #endif
|
17 |
|
18 | // Includes ----------------------------------------------------------------------------------------
|
19 | #include <hidef.h> /* for EnableInterrupts macro */
|
20 | #include "derivative.h" /* include peripheral declarations */
|
21 |
|
22 | #define uint8 unsigned char
|
23 |
|
24 | // SPI Clock Sample Polarity
|
25 | typedef enum CLOCKPOL
|
26 | {
|
27 | RisingEdge = 0,
|
28 | FallingEdge = 1
|
29 |
|
30 | } e_clockpol_t;
|
31 |
|
32 | // SPI Clock Sample Phase
|
33 | typedef enum CLOCKPHS
|
34 | {
|
35 | LeadingEdge = 0,
|
36 | TrailingEdge = 1
|
37 |
|
38 | } e_clockphs_t;
|
39 |
|
40 | // SPI Clock Prescaler (Master only)
|
41 | typedef enum CLOCKPRSC
|
42 | {
|
43 |
|
44 | div1 = 0x000b,
|
45 | div2 = 0x001b,
|
46 | div3 = 0x010b,
|
47 | div4 = 0x011b,
|
48 | div5 = 0x100b,
|
49 | div6 = 0x101b,
|
50 | div7 = 0x110b,
|
51 | div8 = 0x111b
|
52 | } e_clockprsc_t;
|
53 |
|
54 | //SPI Clock Rate Divisor (Master only)
|
55 | typedef enum CLOCKRD
|
56 | {
|
57 |
|
58 | rdiv2 = 0x000b,
|
59 | rdiv4 = 0x001b,
|
60 | rdiv8 = 0x010b,
|
61 | rdiv16 = 0x011b,
|
62 | rdiv32 = 0x100b,
|
63 | rdiv64 = 0x101b,
|
64 | rdiv128 = 0x110b,
|
65 | rdiv256 = 0x111b
|
66 |
|
67 | } e_clockrd_t;
|
68 |
|
69 |
|
70 | // SPI Data Order
|
71 | typedef enum DATAORDER
|
72 | {
|
73 | MSBfirst = 0,
|
74 | LSBfirst = 1
|
75 |
|
76 | } e_dataorder_t;
|
77 |
|
78 | typedef enum SPIMODE
|
79 | {
|
80 | Slave = 0,
|
81 | Master = 1
|
82 | } spi_Mode_t;
|
83 |
|
84 |
|
85 | /**************************************************************************************************/
|
86 | __interrupt VectorNumber_Vspi1 void SPI_ISR();
|
87 |
|
88 | /****************************************************************************************************
|
89 | * Initialisierung des SPI Interfaces mit Standard-Einstellungen (Slave)
|
90 | **************************************************************************************************/
|
91 | extern void spi_init();
|
92 |
|
93 | /***************************************************************************************************
|
94 | * Aktivierung des SPI Interrupts
|
95 | *
|
96 | * Wird der SPI Interrupt freigeschalten, muss sichergestellt sein, dass die Interrupt Service
|
97 | * Routine (SPI_STC_vect) auch gefuellt ist. Erfordert, dass spi_init() zuvor einmalig gerufen wurde.
|
98 | *
|
99 | * b_Option SPI Serial Transfer Complete Interrupt aktivieren/deaktivieren
|
100 | ***************************************************************************************************/
|
101 | void spi_enableInterrupt(bool b_Option);
|
102 |
|
103 | /***********************************************************************************************//**
|
104 | * SPI Einstellungen vornehmen
|
105 | *
|
106 | * Erfordert, dass spi_init() zuvor einmalig gerufen wurde.
|
107 | *
|
108 | * e_Mode SPI in als Slave oder Master betreiben
|
109 | * e_ClockPolarity SPI Clock Polaritiy festlegen (Standard RisingEdge)
|
110 | * e_ClockPhase SPI Clock Phase festlegen (Standard LeadingEdge)
|
111 | * e_ClockPrescaler SPI Clock Prescaler festlegen (Standard div4)
|
112 | * e_DataOrder SPI Bit-Folge (Standard LDBfirst)
|
113 | **************************************************************************************************/
|
114 | void spi_setMode(spi_Mode_t e_Mode, e_clockpol_t e_ClockPolarity, e_clockphs_t e_ClockPhase, e_clockprsc_t e_ClockPrescaler,e_clockrd_t e_ClockRateDivisor, e_dataorder_t e_DataOrder);
|
115 |
|
116 | /***********************************************************************************************//**
|
117 | * Daten ueber SPI versenden
|
118 | *
|
119 | * Erfordert, dass spi_init() zuvor einmalig gerufen wurde.
|
120 | * Es wird empfohlen, vorher mittels spi_checkComplete() den Status des SPI zu pruefen.
|
121 | *
|
122 | * c_Data Byte welches ueber SPI gesendet werden soll
|
123 | **************************************************************************************************/
|
124 | void spi_sendData(byte c_Data);
|
125 |
|
126 | /***********************************************************************************************//**
|
127 | * Daten aus SPI receive buffer lesen
|
128 | *
|
129 | * Erfordert, dass spi_init() zuvor einmalig gerufen wurde.
|
130 | *
|
131 | * Byte welches zuletzt ueber SPI empfangen wurde
|
132 | **************************************************************************************************/
|
133 | uint8 spi_receiveData();
|
134 |
|
135 | /***********************************************************************************************//**
|
136 | * Setzt Slave-Select-Pin des SPI auf low oder zurueck auf high (/SS ist low active)
|
137 | *
|
138 | * Erfordert, dass spi_init() zuvor einmalig gerufen wurde.
|
139 | *
|
140 | * Enable Setzte Pin auf low (true) oder auf high (false)
|
141 | **************************************************************************************************/
|
142 | void spi_selectChip(bool Enable);
|
143 |
|
144 | /***********************************************************************************************//**
|
145 | * Ueberprueft ob ein SPI Transfer komplett ist
|
146 | *
|
147 | * Erfordert, dass spi_init() zuvor einmalig gerufen wurde.
|
148 | *
|
149 | * Gibt true zurueck, wenn ein Transfer stattgefunden hat
|
150 | **************************************************************************************************/
|
151 | bool spi_checkComplete();
|
152 |
|
153 | /***********************************************************************************************//**
|
154 | * Ueberprueft ob beim Schreiben von SPI Daten eine Kollision entstanden ist
|
155 | *
|
156 | * Erfordert, dass spi_init() zuvor einmalig gerufen wurde.
|
157 | *
|
158 | * Gibt true zurueck, wenn eine Kollision stattgefunden hat
|
159 | **************************************************************************************************/
|
160 | bool spi_checkCollision();
|
161 |
|
162 |
|
163 | #endif // _SPIDRIVER_H_
|