32
32
#include "pinmap.h"
33
33
#include "gpio_include.h"
34
34
35
+ #if DEVICE_SPI_ASYNCH
36
+ #define SPI_S (obj ) (struct spi_s *) (&((obj)->spi))
37
+ #else
38
+ #define SPI_S (obj ) (struct spi_s *) (obj)
39
+ #endif
40
+
35
41
static const PinMap PinMap_SPI_SCLK [] = {
36
42
{PM0 , SPI_0 , PIN_DATA (3 , 1 )},
37
43
{PB2 , SPI_1 , PIN_DATA (3 , 1 )},
@@ -69,6 +75,7 @@ static const PinMap PinMap_SPI_SSEL[] = {
69
75
70
76
void spi_init (spi_t * obj , PinName mosi , PinName miso , PinName sclk , PinName ssel )
71
77
{
78
+ struct spi_s * obj_s = SPI_S (obj );
72
79
TSB_TSPI_TypeDef * spi ;
73
80
// Check pin parameters
74
81
SPIName spi_mosi = (SPIName )pinmap_peripheral (mosi , PinMap_SPI_MOSI );
@@ -78,9 +85,9 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
78
85
SPIName spi_data = (SPIName )pinmap_merge (spi_mosi , spi_miso );
79
86
SPIName spi_cntl = (SPIName )pinmap_merge (spi_sclk , spi_ssel );
80
87
81
- obj -> module = (SPIName )pinmap_merge (spi_data , spi_cntl );
82
- spi = obj -> spi ;
83
- switch ((int )obj -> module ) {
88
+ obj_s -> module = (SPIName )pinmap_merge (spi_data , spi_cntl );
89
+ spi = obj_s -> spi ;
90
+ switch ((int )obj_s -> module ) {
84
91
case SPI_0 :
85
92
TSB_CG_FSYSENA_IPENA11 = ENABLE ;
86
93
TSB_CG_FSYSENB_IPENB00 = ENABLE ;
@@ -110,7 +117,7 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
110
117
error ("Cannot found SPI module corresponding with input pins." );
111
118
break ;
112
119
}
113
- obj -> spi = spi ;
120
+ obj_s -> spi = spi ;
114
121
// pin out the SPI pins
115
122
pinmap_pinout (mosi , PinMap_SPI_MOSI );
116
123
pinmap_pinout (miso , PinMap_SPI_MISO );
@@ -146,20 +153,22 @@ void spi_init(spi_t *obj, PinName mosi, PinName miso, PinName sclk, PinName ssel
146
153
147
154
void spi_free (spi_t * obj )
148
155
{
156
+ struct spi_s * obj_s = SPI_S (obj );
149
157
TSB_TSPI_TypeDef * spi ;
150
158
151
- spi = obj -> spi ;
159
+ spi = obj_s -> spi ;
152
160
spi -> CR0 |= TSPI_DISABLE ;
153
161
spi -> CR2 = TSPI_INT_ALL ; // Disable all interrupt
154
162
}
155
163
156
164
void spi_format (spi_t * obj , int bits , int mode , int slave )
157
165
{
166
+ struct spi_s * obj_s = SPI_S (obj );
158
167
TSB_TSPI_TypeDef * spi ;
159
168
160
- obj -> bits = bits ;
161
- spi = obj -> spi ;
162
- obj -> bits = bits ;
169
+ obj_s -> bits = bits ;
170
+ spi = obj_s -> spi ;
171
+ obj_s -> bits = bits ;
163
172
spi -> CR0 |= TSPI_DISABLE ;
164
173
165
174
if (bits >= 8 || bits <= 32 ) {
@@ -174,10 +183,11 @@ void spi_format(spi_t *obj, int bits, int mode, int slave)
174
183
175
184
void spi_frequency (spi_t * obj , int hz )
176
185
{
186
+ struct spi_s * obj_s = SPI_S (obj );
177
187
TSB_TSPI_TypeDef * spi ;
178
188
int clk_div = 1 ;
179
189
uint32_t clocks = ((SystemCoreClock / 2 ) / hz );
180
- obj -> spi -> CR0 |= TSPI_DISABLE ;
190
+ obj_s -> spi -> CR0 |= TSPI_DISABLE ;
181
191
182
192
while (clk_div < 10 ) {
183
193
if (clocks < 16 ) {
@@ -190,17 +200,18 @@ void spi_frequency(spi_t *obj, int hz)
190
200
if (clk_div == 0 ) {
191
201
clocks ++ ;
192
202
}
193
- spi = obj -> spi ;
203
+ spi = obj_s -> spi ;
194
204
spi -> CR0 |= TSPI_DISABLE ;
195
205
spi -> BR = ((clk_div << 4 ) | clocks );
196
206
spi -> CR0 |= TSPI_ENABLE ;
197
207
}
198
208
199
209
int spi_master_write (spi_t * obj , int value )
200
210
{
211
+ struct spi_s * obj_s = SPI_S (obj );
201
212
TSB_TSPI_TypeDef * spi ;
202
- MBED_ASSERT (obj != NULL );
203
- spi = obj -> spi ;
213
+ MBED_ASSERT (obj_s != NULL );
214
+ spi = obj_s -> spi ;
204
215
spi -> CR3 |= TSPI_TX_BUFF_CLR_DONE ; // FIFO Cear
205
216
// Check if the TSPI is already enabled
206
217
if ((spi -> CR0 & TSPI_ENABLE ) != TSPI_ENABLE ) {
@@ -258,10 +269,11 @@ int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length,
258
269
259
270
int spi_busy (spi_t * obj )
260
271
{
272
+ struct spi_s * obj_s = SPI_S (obj );
261
273
TSB_TSPI_TypeDef * spi ;
262
274
uint8_t result = 0 ;
263
275
264
- spi = obj -> spi ;
276
+ spi = obj_s -> spi ;
265
277
if ( (spi -> SR & (1 <<7 )) || (spi -> SR & (1 <<23 ))) {
266
278
result = 1 ;
267
279
} else {
@@ -272,7 +284,8 @@ int spi_busy(spi_t *obj)
272
284
273
285
uint8_t spi_get_module (spi_t * obj )
274
286
{
275
- return (uint8_t )(obj -> module );
287
+ struct spi_s * obj_s = SPI_S (obj );
288
+ return (uint8_t )(obj_s -> module );
276
289
}
277
290
278
291
const PinMap * spi_master_mosi_pinmap ()
0 commit comments