1
1
/*
2
- * Copyright (c) 2016-2018 Thomas Roell. All rights reserved.
2
+ * Copyright (c) 2016-2020 Thomas Roell. All rights reserved.
3
3
*
4
4
* Permission is hereby granted, free of charge, to any person obtaining a copy
5
5
* of this software and associated documentation files (the "Software"), to
@@ -53,9 +53,8 @@ SPIClass::SPIClass(struct _stm32l0_spi_t *spi, const struct _stm32l0_spi_params_
53
53
_clock = 4000000 ;
54
54
_option = STM32L0_SPI_OPTION_MODE_0 | STM32L0_SPI_OPTION_MSB_FIRST;
55
55
56
- _transferRoutine = SPIClass::_transferSelect ;
56
+ _transfer8Routine = SPIClass::_transfer8Select ;
57
57
_transfer16Routine = SPIClass::_transfer16Select;
58
- _transfer32Routine = SPIClass::_transfer32Select;
59
58
60
59
_spi_class[spi->instance ] = this ;
61
60
}
@@ -70,9 +69,8 @@ void SPIClass::end()
70
69
if (_active) {
71
70
stm32l0_spi_release (_spi);
72
71
73
- _transferRoutine = SPIClass::_transferSelect ;
72
+ _transfer8Routine = SPIClass::_transfer8Select ;
74
73
_transfer16Routine = SPIClass::_transfer16Select;
75
- _transfer32Routine = SPIClass::_transfer32Select;
76
74
77
75
_active = false ;
78
76
}
@@ -108,18 +106,16 @@ void SPIClass::beginTransaction(SPISettings settings)
108
106
109
107
_active = true ;
110
108
111
- _transferRoutine = stm32l0_spi_data ;
109
+ _transfer8Routine = stm32l0_spi_data8 ;
112
110
_transfer16Routine = stm32l0_spi_data16;
113
- _transfer32Routine = stm32l0_spi_data32;
114
111
}
115
112
116
113
void SPIClass::endTransaction (void )
117
114
{
118
115
stm32l0_spi_release (_spi);
119
116
120
- _transferRoutine = SPIClass::_transferSelect ;
117
+ _transfer8Routine = SPIClass::_transfer8Select ;
121
118
_transfer16Routine = SPIClass::_transfer16Select;
122
- _transfer32Routine = SPIClass::_transfer32Select;
123
119
124
120
_active = false ;
125
121
}
@@ -129,9 +125,8 @@ void SPIClass::setBitOrder(BitOrder bitOrder)
129
125
if (_active) {
130
126
stm32l0_spi_release (_spi);
131
127
132
- _transferRoutine = SPIClass::_transferSelect ;
128
+ _transfer8Routine = SPIClass::_transfer8Select ;
133
129
_transfer16Routine = SPIClass::_transfer16Select;
134
- _transfer32Routine = SPIClass::_transfer32Select;
135
130
136
131
_active = false ;
137
132
}
@@ -144,9 +139,8 @@ void SPIClass::setDataMode(uint8_t dataMode)
144
139
if (_active) {
145
140
stm32l0_spi_release (_spi);
146
141
147
- _transferRoutine = SPIClass::_transferSelect ;
142
+ _transfer8Routine = SPIClass::_transfer8Select ;
148
143
_transfer16Routine = SPIClass::_transfer16Select;
149
- _transfer32Routine = SPIClass::_transfer32Select;
150
144
151
145
_active = false ;
152
146
}
@@ -159,9 +153,8 @@ void SPIClass::setClockDivider(uint8_t divider)
159
153
if (_active) {
160
154
stm32l0_spi_release (_spi);
161
155
162
- _transferRoutine = SPIClass::_transferSelect ;
156
+ _transfer8Routine = SPIClass::_transfer8Select ;
163
157
_transfer16Routine = SPIClass::_transfer16Select;
164
- _transfer32Routine = SPIClass::_transfer32Select;
165
158
166
159
_active = false ;
167
160
}
@@ -171,21 +164,6 @@ void SPIClass::setClockDivider(uint8_t divider)
171
164
}
172
165
}
173
166
174
- void SPIClass::setHalfDuplex (bool enable)
175
- {
176
- if (_active) {
177
- stm32l0_spi_release (_spi);
178
-
179
- _transferRoutine = SPIClass::_transferSelect;
180
- _transfer16Routine = SPIClass::_transfer16Select;
181
- _transfer32Routine = SPIClass::_transfer32Select;
182
-
183
- _active = false ;
184
- }
185
-
186
- _option = (_option & ~STM32L0_SPI_OPTION_HALFDUPLEX) | (enable ? STM32L0_SPI_OPTION_HALFDUPLEX : 0 );
187
- }
188
-
189
167
void SPIClass::attachInterrupt ()
190
168
{
191
169
// Should be enableInterrupt()
@@ -196,19 +174,18 @@ void SPIClass::detachInterrupt()
196
174
// Should be disableInterrupt()
197
175
}
198
176
199
- uint8_t SPIClass::_transferSelect (struct _stm32l0_spi_t *spi, uint8_t data)
177
+ uint8_t SPIClass::_transfer8Select (struct _stm32l0_spi_t *spi, uint8_t data)
200
178
{
201
179
SPIClass *spi_class = _spi_class[spi->instance ];
202
180
203
181
stm32l0_spi_acquire (spi, spi_class->_clock , spi_class->_option );
204
182
205
183
spi_class->_active = true ;
206
184
207
- spi_class->_transferRoutine = stm32l0_spi_data ;
185
+ spi_class->_transfer8Routine = stm32l0_spi_data8 ;
208
186
spi_class->_transfer16Routine = stm32l0_spi_data16;
209
- spi_class->_transfer32Routine = stm32l0_spi_data32;
210
187
211
- return (*spi_class->_transferRoutine )(spi, data);
188
+ return (*spi_class->_transfer8Routine )(spi, data);
212
189
}
213
190
214
191
uint16_t SPIClass::_transfer16Select (struct _stm32l0_spi_t *spi, uint16_t data)
@@ -219,56 +196,85 @@ uint16_t SPIClass::_transfer16Select(struct _stm32l0_spi_t *spi, uint16_t data)
219
196
220
197
spi_class->_active = true ;
221
198
222
- spi_class->_transferRoutine = stm32l0_spi_data ;
199
+ spi_class->_transfer8Routine = stm32l0_spi_data8 ;
223
200
spi_class->_transfer16Routine = stm32l0_spi_data16;
224
- spi_class->_transfer32Routine = stm32l0_spi_data32;
225
201
226
202
return (*spi_class->_transfer16Routine )(spi, data);
227
203
}
228
204
229
- uint32_t SPIClass::_transfer32Select ( struct _stm32l0_spi_t *spi, uint32_t data)
205
+ void SPIClass::transfer ( const void *txBuffer, void *rxBuffer, size_t count)
230
206
{
231
- SPIClass *spi_class = _spi_class[spi->instance ];
232
-
233
- stm32l0_spi_acquire (spi, spi_class->_clock , spi_class->_option );
207
+ if (!_active)
208
+ {
209
+ stm32l0_spi_acquire (_spi, _clock, _option);
210
+
211
+ _active = true ;
212
+
213
+ _transfer8Routine = stm32l0_spi_data8;
214
+ _transfer16Routine = stm32l0_spi_data16;
215
+ }
234
216
235
- spi_class->_active = true ;
217
+ stm32l0_spi_data (_spi, (const uint8_t *)txBuffer, (uint8_t *)rxBuffer, count);
218
+ }
236
219
237
- spi_class->_transferRoutine = stm32l0_spi_data;
238
- spi_class->_transfer16Routine = stm32l0_spi_data16;
239
- spi_class->_transfer32Routine = stm32l0_spi_data32;
240
-
241
- return (*spi_class->_transfer32Routine )(spi, data);
220
+ bool SPIClass::transfer (const void *txBuffer, void *rxBuffer, size_t count, void (*callback)(void ))
221
+ {
222
+ return transfer (txBuffer, rxBuffer, count, Callback (callback));
242
223
}
243
224
244
- void SPIClass::transfer (const void *txBuffer, void *rxBuffer, size_t count)
225
+ bool SPIClass::transfer (const void *txBuffer, void *rxBuffer, size_t count, Callback callback)
245
226
{
227
+ if (!stm32l0_spi_done (_spi))
228
+ {
229
+ return false ;
230
+ }
231
+
246
232
if (!_active)
247
233
{
248
234
stm32l0_spi_acquire (_spi, _clock, _option);
249
235
250
236
_active = true ;
251
237
252
- _transferRoutine = stm32l0_spi_data ;
238
+ _transfer8Routine = stm32l0_spi_data8 ;
253
239
_transfer16Routine = stm32l0_spi_data16;
254
- _transfer32Routine = stm32l0_spi_data32;
255
240
}
256
241
257
- if (txBuffer)
258
- {
259
- if (rxBuffer)
260
- {
261
- stm32l0_spi_transfer (_spi, (const uint8_t *)txBuffer, (uint8_t *)rxBuffer, count);
262
- }
263
- else
264
- {
265
- stm32l0_spi_transmit (_spi, (const uint8_t *)txBuffer, count);
242
+ _callback = callback;
243
+
244
+ if (txBuffer) {
245
+ if (rxBuffer) {
246
+ if (!stm32l0_spi_transfer (_spi, static_cast <const uint8_t *>(txBuffer), static_cast <uint8_t *>(rxBuffer), count, (stm32l0_spi_done_callback_t )SPIClass::_doneCallback, (void *)this )) {
247
+ return false ;
248
+ }
249
+ } else {
250
+ if (!stm32l0_spi_transmit (_spi, static_cast <const uint8_t *>(txBuffer), count, (stm32l0_spi_done_callback_t )SPIClass::_doneCallback, (void *)this )) {
251
+ return false ;
252
+ }
266
253
}
267
254
}
268
255
else
269
256
{
270
- stm32l0_spi_receive (_spi, (uint8_t *)rxBuffer, count);
257
+ if (!stm32l0_spi_receive (_spi, static_cast <uint8_t *>(rxBuffer), count, (stm32l0_spi_done_callback_t )SPIClass::_doneCallback, (void *)this )) {
258
+ return false ;
259
+ }
271
260
}
261
+
262
+ return true ;
263
+ }
264
+
265
+ size_t SPIClass::cancel (void )
266
+ {
267
+ return stm32l0_spi_cancel (_spi);
268
+ }
269
+
270
+ bool SPIClass::done (void )
271
+ {
272
+ return stm32l0_spi_done (_spi);
273
+ }
274
+
275
+ void SPIClass::_doneCallback (class SPIClass *self)
276
+ {
277
+ self->_callback .queue ();;
272
278
}
273
279
274
280
#if SPI_INTERFACES_COUNT > 0
0 commit comments