-
Notifications
You must be signed in to change notification settings - Fork 2
/
bitbang_spi.c
224 lines (176 loc) · 8.86 KB
/
bitbang_spi.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
/**
* spi.c
*
* Contains the source code for communicating
* with the CC1101 radio using a bit-banged SPI port
* However, this SPI implementatio is generic enough for
* use with other SPI devices.
* Created on: May 12, 2015
* Author: Stefan
*/
// INCLUDES ***********************************************
#include <csl_gpio.h>
#include "gpio.h"
#define SPI_CK(x) GPIO_pinWrite(hGpio,GPIO_PIN13,x)
#define SPI_MOSI(x) GPIO_pinWrite(hGpio,GPIO_PIN3,x)
#define SPI_MISO GPIO_pinRead(hGpio, GPIO_PIN8)
// VARIABLES **********************************************
extern GPIO_Handle hGpio; /* GPIO handle */
/**************************************************************************************
* spiWriteReg
*
* Writes to an 8-bit register with the SPI port
**************************************************************************************/
void spiWriteReg(const unsigned char regAddr, const unsigned char regData)
{
unsigned char SPICount; // Counter used to clock out the data
unsigned char SPIData; // Define a data structure for the SPI data.
//SPI_CS = 1; // Make sure we start with /CS high
SPI_CK(0); // and CK low (idle low)
SPIData = regAddr; // Preload the data to be sent with Address
//SPI_CS = 0; // Set /CS low to start the SPI cycle 25nS
// Although SPIData could be implemented as an "int", resulting in one
// loop, the routines run faster when two loops are implemented with
// SPIData implemented as two "char"s.
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Address byte
{
if (SPIData & 0x80) // Check for a 1
SPI_MOSI(1); // and set the MOSI line appropriately
else
SPI_MOSI(0);
SPI_CK(1); // Toggle the clock line
SPI_CK(0);
SPIData <<= 1; // Rotate to get the next bit
} // and loop back to send the next bit
// Repeat for the Data byte
SPIData = regData; // Preload the data to be sent with Data
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Data
{
if (SPIData & 0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
SPI_CK(1);
SPI_CK(0);
SPIData <<= 1;
}
//SPI_CS = 1;
SPI_MOSI(0);
}
/**************************************************************************************
* spiWriteAddr
*
* Writes to an 8-bit register with the SPI register address
**************************************************************************************/
void spiWriteAddr(const unsigned char regAddr)
{
unsigned char SPICount; // Counter used to clock out the data
unsigned char SPIData; // Define a data structure for the SPI data.
//SPI_CS = 1; // Make sure we start with /CS high
SPI_CK(0); // and CK low (idle low)
SPIData = regAddr; // Preload the data to be sent with Address
//SPI_CS = 0; // Set /CS low to start the SPI cycle 25nS
// Although SPIData could be implemented as an "int", resulting in one
// loop, the routines run faster when two loops are implemented with
// SPIData implemented as two "char"s.
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Address byte
{
if (SPIData & 0x80) // Check for a 1
SPI_MOSI(1); // and set the MOSI line appropriately
else
SPI_MOSI(0);
SPI_CK(1); // Toggle the clock line
SPI_CK(0);
SPIData <<= 1; // Rotate to get the next bit
}
}
/**************************************************************************************
* spiWriteData
*
* Writes to an 8-bit register with the SPI register data
**************************************************************************************/
void spiWriteData(const unsigned char regData)
{
unsigned char SPICount; // Counter used to clock out the data
unsigned char SPIData; // Define a data structure for the SPI data.
//SPI_CS = 1; // Make sure we start with /CS high
SPI_CK(0); // and CK low (idle low)
SPIData = regData; // Preload the data to be sent with Data
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Data
{
if (SPIData & 0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
SPI_CK(1);
SPI_CK(0);
SPIData <<= 1;
}
//SPI_CS = 1;
SPI_MOSI(0);
}
/**************************************************************************************
* spiReadReg
*
* Reads an 8-bit register with the SPI port.
* Data is returned.
**************************************************************************************/
unsigned char spiReadReg (const unsigned char regAddr)
{
unsigned char SPICount; // Counter used to clock out the data
unsigned char SPIData;
//SPI_CS = 1; // Make sure we start with /CS high
SPI_CK(0); // and CK low
SPIData = regAddr; // Preload the data to be sent with Address & Data
//SPI_CS = 0; // Set /CS low to start the SPI cycle
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Address & Data
{
if (SPIData & 0x80)
SPI_MOSI(1);
else
SPI_MOSI(0);
SPI_CK(1);
SPI_CK(0);
SPIData <<= 1;
} // and loop back to send the next bit
SPI_MOSI(0); // Reset the MOSI data line
SPIData = 0;
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be fread
{
SPIData <<=1; // Rotate the data
SPI_CK(1); // Raise the clock to clock the data out of the MAX7456
SPIData += SPI_MISO; // Read the data bit
SPI_CK(0); // Drop the clock ready for th enext bit
} // and loop back
//SPI_CS = 1; // Raise CS
return ((unsigned char)SPIData); // Finally return the read data
}
/**************************************************************************************
* spiReadData
*
* Reads an 8-bit register with the SPI port, without send the address register first.
* Data is returned.
**************************************************************************************/
unsigned char spiReadData ()
{
unsigned char SPICount; // Counter used to clock out the data
unsigned char SPIData;
//SPI_CS = 1; // Make sure we start with /CS high
SPI_CK(0); // and CK low
SPI_MOSI(0); // Reset the MOSI data line
SPIData = 0;
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be fread
{
SPIData <<=1; // Rotate the data
SPI_CK(1); // Raise the clock to clock the data out of the MAX7456
SPIData += SPI_MISO; // Read the data bit
SPI_CK(0); // Drop the clock ready for th enext bit
} // and loop back
//SPI_CS = 1; // Raise CS
return ((unsigned char)SPIData); // Finally return the read data
}
/* bitbang_spi.c
*
* Created on: May 18, 2015
* Author: Stefan Gefa
*/