131
131
#define AD7280A_READ_TXVAL 0xF800030A
132
132
133
133
// ----------------------------------------------------------------------------
134
- template <typename Spi, typename Cs, typename Cnvst, int N>
135
- uint8_t modm::Ad7280a<Spi, Cs, Cnvst, N>::controlHighByte = 0 ;
136
-
137
- // ----------------------------------------------------------------------------
138
- template <typename Spi, typename Cs, typename Cnvst, int N>
134
+ template <typename SpiMaster, typename Cs, typename Cnvst, int N>
139
135
void
140
- modm::Ad7280a<Spi , Cs, Cnvst, N>::initialize(ad7280a::Average average)
136
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::initialize(ad7280a::Average average)
141
137
{
142
138
static_assert (N == 1 , " Daisy chain length is currently limited to 1!" );
143
139
@@ -148,9 +144,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::initialize(ad7280a::Average average)
148
144
}
149
145
150
146
// ----------------------------------------------------------------------------
151
- template <typename Spi , typename Cs, typename Cnvst, int N>
147
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
152
148
bool
153
- modm::Ad7280a<Spi , Cs, Cnvst, N>::chainSetup()
149
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::chainSetup()
154
150
{
155
151
// Set reset bit for all devices
156
152
write (ad7280a::MASTER, ad7280a::CTRL_LB, true ,
@@ -200,17 +196,17 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::chainSetup()
200
196
}
201
197
202
198
// ----------------------------------------------------------------------------
203
- template <typename Spi , typename Cs, typename Cnvst, int N>
199
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
204
200
void
205
- modm::Ad7280a<Spi , Cs, Cnvst, N>::enableBalancer(uint8_t device, uint8_t cells)
201
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::enableBalancer(uint8_t device, uint8_t cells)
206
202
{
207
203
write (device, ad7280a::CELL_BALANCE, false , cells);
208
204
}
209
205
210
206
// ----------------------------------------------------------------------------
211
- template <typename Spi , typename Cs, typename Cnvst, int N>
207
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
212
208
bool
213
- modm::Ad7280a<Spi , Cs, Cnvst, N>::performSelftest()
209
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::performSelftest()
214
210
{
215
211
// Set Bit D0 of the control register to 1 on all parts. This
216
212
// setting enables the daisy-chain register read operation on
@@ -256,9 +252,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::performSelftest()
256
252
}
257
253
258
254
// ----------------------------------------------------------------------------
259
- template <typename Spi , typename Cs, typename Cnvst, int N>
255
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
260
256
void
261
- modm::Ad7280a<Spi , Cs, Cnvst, N>::softwareReset()
257
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::softwareReset()
262
258
{
263
259
// Set reset bit for all devices
264
260
write (ad7280a::MASTER, ad7280a::CTRL_LB, true ,
@@ -275,9 +271,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::softwareReset()
275
271
}
276
272
277
273
// ----------------------------------------------------------------------------
278
- template <typename Spi , typename Cs, typename Cnvst, int N>
274
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
279
275
bool
280
- modm::Ad7280a<Spi , Cs, Cnvst, N>::readChannel(uint8_t device,
276
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::readChannel(uint8_t device,
281
277
ad7280a::Channel channel, uint16_t *value)
282
278
{
283
279
write (ad7280a::MASTER, ad7280a::CTRL_HB, true ,
@@ -308,9 +304,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::readChannel(uint8_t device,
308
304
}
309
305
310
306
// ----------------------------------------------------------------------------
311
- template <typename Spi , typename Cs, typename Cnvst, int N>
307
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
312
308
bool
313
- modm::Ad7280a<Spi , Cs, Cnvst, N>::readAllChannels(uint16_t *values)
309
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::readAllChannels(uint16_t *values)
314
310
{
315
311
// Write Register Address 0x00 to the read register on all
316
312
// parts. A device address of 0x00 is used when computing
@@ -350,9 +346,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::readAllChannels(uint16_t *values)
350
346
/*
351
347
* P(x) = x^8 + x^5 + x^3 + x^2 + x^1 + x^0 = 0b100101111 => 0x2F
352
348
*/
353
- template <typename Spi , typename Cs, typename Cnvst, int N>
349
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
354
350
uint8_t
355
- modm::Ad7280a<Spi , Cs, Cnvst, N>::updateCrc(uint8_t data)
351
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::updateCrc(uint8_t data)
356
352
{
357
353
for (uint_fast8_t i = 0 ; i < 8 ; i++) {
358
354
uint8_t bit = data & 0x80 ;
@@ -366,9 +362,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::updateCrc(uint8_t data)
366
362
}
367
363
368
364
// ----------------------------------------------------------------------------
369
- template <typename Spi , typename Cs, typename Cnvst, int N>
365
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
370
366
uint8_t
371
- modm::Ad7280a<Spi , Cs, Cnvst, N>::calculateCrc(uint32_t data)
367
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::calculateCrc(uint32_t data)
372
368
{
373
369
uint8_t crc;
374
370
@@ -379,9 +375,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::calculateCrc(uint32_t data)
379
375
}
380
376
381
377
// ----------------------------------------------------------------------------
382
- template <typename Spi , typename Cs, typename Cnvst, int N>
378
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
383
379
bool
384
- modm::Ad7280a<Spi , Cs, Cnvst, N>::write(uint8_t device, ad7280a::Register reg,
380
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::write(uint8_t device, ad7280a::Register reg,
385
381
bool addressAll, uint8_t value)
386
382
{
387
383
// The device address is send with LSB first
@@ -393,29 +389,34 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::write(uint8_t device, ad7280a::Register reg,
393
389
394
390
t |= calculateCrc (t >> 11 ) << 3 | 0x2 ;
395
391
392
+ modm::this_fiber::poll ([&]{ return this ->acquireMaster (); });
396
393
Cs::reset ();
397
- Spi::write ((t >> 24 ) & 0xff );
398
- Spi::write ((t >> 16 ) & 0xff );
399
- Spi::write ((t >> 8 ) & 0xff );
400
- Spi::write ((t >> 0 ) & 0xff );
401
- Cs::set ();
394
+ SpiMaster::transfer ((t >> 24 ) & 0xff );
395
+ SpiMaster::transfer ((t >> 16 ) & 0xff );
396
+ SpiMaster::transfer ((t >> 8 ) & 0xff );
397
+ SpiMaster::transfer ((t >> 0 ) & 0xff );
398
+
399
+ if (this ->releaseMaster ()) Cs::set ();
402
400
403
401
// TODO remove this
404
402
modm::this_fiber::sleep_for (1us);
405
403
return true ;
406
404
}
407
405
408
406
// ----------------------------------------------------------------------------
409
- template <typename Spi , typename Cs, typename Cnvst, int N>
407
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
410
408
bool
411
- modm::Ad7280a<Spi , Cs, Cnvst, N>::read(uint32_t *value)
409
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::read(uint32_t *value)
412
410
{
411
+ modm::this_fiber::poll ([&]{ return this ->acquireMaster (); });
413
412
Cs::reset ();
414
- *value = static_cast <uint32_t >(Spi::write (0xF8 )) << 24 ;
415
- *value |= static_cast <uint32_t >(Spi::write (0x00 )) << 16 ;
416
- *value |= static_cast <uint32_t >(Spi::write (0x03 )) << 8 ;
417
- *value |= static_cast <uint32_t >(Spi::write (0x0A ));
418
- Cs::set ();
413
+
414
+ *value = static_cast <uint32_t >(SpiMaster::transfer (0xF8 )) << 24 ;
415
+ *value |= static_cast <uint32_t >(SpiMaster::transfer (0x00 )) << 16 ;
416
+ *value |= static_cast <uint32_t >(SpiMaster::transfer (0x03 )) << 8 ;
417
+ *value |= static_cast <uint32_t >(SpiMaster::transfer (0x0A ));
418
+
419
+ if (this ->releaseMaster ()) Cs::set ();
419
420
420
421
// MODM_LOG_DEBUG << "read = " << modm::hex << *value << modm::ascii << modm::endl;
421
422
@@ -430,9 +431,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::read(uint32_t *value)
430
431
}
431
432
432
433
// ----------------------------------------------------------------------------
433
- template <typename Spi , typename Cs, typename Cnvst, int N>
434
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
434
435
bool
435
- modm::Ad7280a<Spi , Cs, Cnvst, N>::readRegister(ad7280a::RegisterValue* result)
436
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::readRegister(ad7280a::RegisterValue* result)
436
437
{
437
438
uint32_t value;
438
439
if (read (&value))
@@ -449,9 +450,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::readRegister(ad7280a::RegisterValue* result)
449
450
}
450
451
451
452
// ----------------------------------------------------------------------------
452
- template <typename Spi , typename Cs, typename Cnvst, int N>
453
+ template <typename SpiMaster , typename Cs, typename Cnvst, int N>
453
454
bool
454
- modm::Ad7280a<Spi , Cs, Cnvst, N>::readConversionResult(ad7280a::ConversionValue* result)
455
+ modm::Ad7280a<SpiMaster , Cs, Cnvst, N>::readConversionResult(ad7280a::ConversionValue* result)
455
456
{
456
457
uint32_t value;
457
458
if (read (&value))
0 commit comments