Skip to content

Commit e914340

Browse files
committed
[driver] Refactor AD7280A driver to use SpiDevice
1 parent bd248dd commit e914340

File tree

3 files changed

+81
-77
lines changed

3 files changed

+81
-77
lines changed

src/modm/driver/adc/ad7280a.hpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include <stdint.h>
1717

18+
#include <modm/architecture/interface/spi_device.hpp>
1819
#include <modm/architecture/interface/gpio.hpp>
1920
#include <modm/processing/fiber.hpp>
2021

@@ -145,53 +146,53 @@ namespace modm
145146
*
146147
* @ingroup modm_driver_ad7280a
147148
*/
148-
template <typename Spi, typename Cs, typename Cnvst, int N>
149-
class Ad7280a
149+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
150+
class Ad7280a: public modm::SpiDevice<SpiMaster>
150151
{
151152
// used for Unittests
152153
friend class ::Ad7280aTest;
153154

154155
public:
155-
static void
156+
void
156157
initialize(ad7280a::Average average = ad7280a::NO_AVERAGE);
157158

158159
/*
159160
* Initialize daisy chain.
160161
*/
161-
static bool
162+
bool
162163
chainSetup();
163164

164165
/**
165166
* Enable/Disable the six cell balance outputs.
166167
*/
167-
static void
168+
void
168169
enableBalancer(uint8_t device, uint8_t cells);
169170

170-
static bool
171+
bool
171172
performSelftest();
172173

173-
static void
174+
void
174175
softwareReset();
175176

176177
/**
177178
* Read a single channel
178179
*/
179-
static bool
180+
bool
180181
readChannel(uint8_t device, ad7280a::Channel channel, uint16_t *value);
181182

182183
/**
183184
* Perform a conversion and read the results back.
184185
*
185186
* \param[out] values Array containing the results
186187
*/
187-
static bool
188+
bool
188189
readAllChannels(uint16_t *values);
189190

190191
private:
191192
/**
192193
* Calculate the CRC for one byte
193194
*/
194-
static uint8_t
195+
uint8_t
195196
updateCrc(uint8_t data);
196197

197198
/**
@@ -206,30 +207,30 @@ namespace modm
206207
* uint8_t crc = calculateCrc(reg >> 10);
207208
* \endcode
208209
*/
209-
static uint8_t
210+
uint8_t
210211
calculateCrc(uint32_t data);
211212

212-
static bool
213+
bool
213214
write(uint8_t device, ad7280a::Register reg, bool addressAll, uint8_t value);
214215

215-
static bool
216+
bool
216217
read(uint32_t *value);
217218

218219

219-
static bool
220+
bool
220221
readRegister(ad7280a::RegisterValue* result);
221222

222-
static bool
223+
bool
223224
readConversionResult(ad7280a::ConversionValue* result);
224225

225226

226227
/*static void
227228
dumpRegisterRead(uint32_t value);
228229
229-
static void
230+
void
230231
dumpConversion(uint32_t value);*/
231232

232-
static uint8_t controlHighByte;
233+
uint8_t controlHighByte{};
233234
};
234235

235236
#if __has_include(<modm/io/iostream.hpp>)

src/modm/driver/adc/ad7280a_impl.hpp

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,9 @@
131131
#define AD7280A_READ_TXVAL 0xF800030A
132132

133133
// ----------------------------------------------------------------------------
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>
139135
void
140-
modm::Ad7280a<Spi, Cs, Cnvst, N>::initialize(ad7280a::Average average)
136+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::initialize(ad7280a::Average average)
141137
{
142138
static_assert(N == 1, "Daisy chain length is currently limited to 1!");
143139

@@ -148,9 +144,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::initialize(ad7280a::Average average)
148144
}
149145

150146
// ----------------------------------------------------------------------------
151-
template <typename Spi, typename Cs, typename Cnvst, int N>
147+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
152148
bool
153-
modm::Ad7280a<Spi, Cs, Cnvst, N>::chainSetup()
149+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::chainSetup()
154150
{
155151
// Set reset bit for all devices
156152
write(ad7280a::MASTER, ad7280a::CTRL_LB, true,
@@ -200,17 +196,17 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::chainSetup()
200196
}
201197

202198
// ----------------------------------------------------------------------------
203-
template <typename Spi, typename Cs, typename Cnvst, int N>
199+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
204200
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)
206202
{
207203
write(device, ad7280a::CELL_BALANCE, false, cells);
208204
}
209205

210206
// ----------------------------------------------------------------------------
211-
template <typename Spi, typename Cs, typename Cnvst, int N>
207+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
212208
bool
213-
modm::Ad7280a<Spi, Cs, Cnvst, N>::performSelftest()
209+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::performSelftest()
214210
{
215211
// Set Bit D0 of the control register to 1 on all parts. This
216212
// setting enables the daisy-chain register read operation on
@@ -256,9 +252,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::performSelftest()
256252
}
257253

258254
// ----------------------------------------------------------------------------
259-
template <typename Spi, typename Cs, typename Cnvst, int N>
255+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
260256
void
261-
modm::Ad7280a<Spi, Cs, Cnvst, N>::softwareReset()
257+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::softwareReset()
262258
{
263259
// Set reset bit for all devices
264260
write(ad7280a::MASTER, ad7280a::CTRL_LB, true,
@@ -275,9 +271,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::softwareReset()
275271
}
276272

277273
// ----------------------------------------------------------------------------
278-
template <typename Spi, typename Cs, typename Cnvst, int N>
274+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
279275
bool
280-
modm::Ad7280a<Spi, Cs, Cnvst, N>::readChannel(uint8_t device,
276+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::readChannel(uint8_t device,
281277
ad7280a::Channel channel, uint16_t *value)
282278
{
283279
write(ad7280a::MASTER, ad7280a::CTRL_HB, true,
@@ -308,9 +304,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::readChannel(uint8_t device,
308304
}
309305

310306
// ----------------------------------------------------------------------------
311-
template <typename Spi, typename Cs, typename Cnvst, int N>
307+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
312308
bool
313-
modm::Ad7280a<Spi, Cs, Cnvst, N>::readAllChannels(uint16_t *values)
309+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::readAllChannels(uint16_t *values)
314310
{
315311
// Write Register Address 0x00 to the read register on all
316312
// parts. A device address of 0x00 is used when computing
@@ -350,9 +346,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::readAllChannels(uint16_t *values)
350346
/*
351347
* P(x) = x^8 + x^5 + x^3 + x^2 + x^1 + x^0 = 0b100101111 => 0x2F
352348
*/
353-
template <typename Spi, typename Cs, typename Cnvst, int N>
349+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
354350
uint8_t
355-
modm::Ad7280a<Spi, Cs, Cnvst, N>::updateCrc(uint8_t data)
351+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::updateCrc(uint8_t data)
356352
{
357353
for (uint_fast8_t i = 0; i < 8; i++) {
358354
uint8_t bit = data & 0x80;
@@ -366,9 +362,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::updateCrc(uint8_t data)
366362
}
367363

368364
// ----------------------------------------------------------------------------
369-
template <typename Spi, typename Cs, typename Cnvst, int N>
365+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
370366
uint8_t
371-
modm::Ad7280a<Spi, Cs, Cnvst, N>::calculateCrc(uint32_t data)
367+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::calculateCrc(uint32_t data)
372368
{
373369
uint8_t crc;
374370

@@ -379,9 +375,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::calculateCrc(uint32_t data)
379375
}
380376

381377
// ----------------------------------------------------------------------------
382-
template <typename Spi, typename Cs, typename Cnvst, int N>
378+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
383379
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,
385381
bool addressAll, uint8_t value)
386382
{
387383
// 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,
393389

394390
t |= calculateCrc(t >> 11) << 3 | 0x2;
395391

392+
modm::this_fiber::poll([&]{ return this->acquireMaster(); });
396393
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();
402400

403401
// TODO remove this
404402
modm::this_fiber::sleep_for(1us);
405403
return true;
406404
}
407405

408406
// ----------------------------------------------------------------------------
409-
template <typename Spi, typename Cs, typename Cnvst, int N>
407+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
410408
bool
411-
modm::Ad7280a<Spi, Cs, Cnvst, N>::read(uint32_t *value)
409+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::read(uint32_t *value)
412410
{
411+
modm::this_fiber::poll([&]{ return this->acquireMaster(); });
413412
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();
419420

420421
//MODM_LOG_DEBUG << "read = " << modm::hex << *value << modm::ascii << modm::endl;
421422

@@ -430,9 +431,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::read(uint32_t *value)
430431
}
431432

432433
// ----------------------------------------------------------------------------
433-
template <typename Spi, typename Cs, typename Cnvst, int N>
434+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
434435
bool
435-
modm::Ad7280a<Spi, Cs, Cnvst, N>::readRegister(ad7280a::RegisterValue* result)
436+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::readRegister(ad7280a::RegisterValue* result)
436437
{
437438
uint32_t value;
438439
if (read(&value))
@@ -449,9 +450,9 @@ modm::Ad7280a<Spi, Cs, Cnvst, N>::readRegister(ad7280a::RegisterValue* result)
449450
}
450451

451452
// ----------------------------------------------------------------------------
452-
template <typename Spi, typename Cs, typename Cnvst, int N>
453+
template <typename SpiMaster, typename Cs, typename Cnvst, int N>
453454
bool
454-
modm::Ad7280a<Spi, Cs, Cnvst, N>::readConversionResult(ad7280a::ConversionValue* result)
455+
modm::Ad7280a<SpiMaster, Cs, Cnvst, N>::readConversionResult(ad7280a::ConversionValue* result)
455456
{
456457
uint32_t value;
457458
if (read(&value))

0 commit comments

Comments
 (0)