Skip to content

Commit 3dbe473

Browse files
committed
initial entry of SPI driver - no testing/build performed
1 parent b2c3f66 commit 3dbe473

File tree

2 files changed

+161
-0
lines changed

2 files changed

+161
-0
lines changed

src/sfTk/sfDevFPC2534SPI.cpp

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
/*
2+
*---------------------------------------------------------------------------------
3+
*
4+
* Copyright (c) 2025, SparkFun Electronics Inc.
5+
*
6+
* SPDX-License-Identifier: MIT
7+
*
8+
*---------------------------------------------------------------------------------
9+
*/
10+
11+
#include "sfDevFPC2534SPI.h"
12+
13+
// --------------------------------------------------------------------------------------------
14+
// CTOR
15+
sfDevFPC2534SPI::sfDevFPC2534SPI() : _spiPort{nullptr}, _spiSettings{nullptr}, _csPin{0}
16+
{
17+
}
18+
19+
//--------------------------------------------------------------------------------------------
20+
bool sfDevFPC2534SPI::initialize(SPIClass &spiPort, SPISettings &busSPISettings, uint8_t csPin, uint32_t interruptPin,
21+
bool bInit)
22+
23+
{
24+
_spiPort = &spiPort;
25+
26+
_spiSettings = busSPISettings;
27+
_csPin = csPin;
28+
29+
// Call our super to init the ISR handler
30+
sfDevFPC2534IComm::initISRHandler(interruptPin);
31+
32+
// clear out our data buffer
33+
clearData();
34+
35+
return true;
36+
}
37+
//--------------------------------------------------------------------------------------------
38+
bool sfDevFPC2534SPI::initialize(uint8_t csPin, uint32_t interruptPin, bool bInit)
39+
{
40+
return initialize(SPI, SPISettings(3000000, MSBFIRST, SPI_MODE3), csPin, interruptPin, bInit);
41+
}
42+
//--------------------------------------------------------------------------------------------
43+
// Is data available to read - either the device is indicating it via an interrupt, or we have
44+
// data in our internal buffer
45+
//
46+
bool sfDevFPC2534SPI::dataAvailable()
47+
{
48+
if (_spiPort == nullptr)
49+
return false;
50+
51+
// the data available flag is set, or we have data in the buffer
52+
return isISRDataAvailable() || _dataCount > 0;
53+
}
54+
55+
//--------------------------------------------------------------------------------------------
56+
// Clear out the internal data buffer...
57+
//
58+
void sfDevFPC2534SPI::clearData()
59+
{
60+
// clear any data signaled by the ISR
61+
clearISRDataAvailable();
62+
}
63+
64+
//--------------------------------------------------------------------------------------------
65+
// Write data to the device
66+
//
67+
uint16_t sfDevFPC2534SPI::write(const uint8_t *data, size_t len)
68+
{
69+
if (_spiPort == nullptr)
70+
return FPC_RESULT_IO_RUNTIME_FAILURE; // I2C bus not initialized
71+
72+
_spiPort->beginTransaction(_spiSettings);
73+
74+
// Signal communication start
75+
digitalWrite(_csPin, LOW);
76+
77+
// the datasheet specifiies a delay greater than 500us after CS goes low
78+
delayMicroseconds(600);
79+
80+
// now send the data
81+
for (size_t i = 0; i < len; i++)
82+
_spiPort->transfer(*data++);
83+
84+
// End comms
85+
digitalWrite(_csPin, HIGH);
86+
_spiPort->endTransaction();
87+
88+
return FPC_RESULT_OK;
89+
}
90+
91+
//--------------------------------------------------------------------------------------------
92+
uint16_t sfDevFPC2534SPI::read(uint8_t *data, size_t len)
93+
{
94+
// got port
95+
if (_spiPort == nullptr)
96+
return FPC_RESULT_IO_RUNTIME_FAILURE;
97+
98+
if (len == 0)
99+
return FPC_RESULT_OK;
100+
101+
// lets return data to the user...
102+
if (data == nullptr)
103+
return FPC_RESULT_INVALID_PARAM;
104+
105+
_spiPort->beginTransaction(_spiSettings);
106+
107+
// Signal communication start
108+
digitalWrite(_csPin, LOW);
109+
110+
// the datasheet specifiies a delay greater than 500us after CS goes low
111+
delayMicroseconds(600);
112+
113+
// Lets read the data...
114+
for (size_t i = 0; i < len; i++)
115+
*data++ = _spiPort->transfer(0x00);
116+
117+
// End transaction
118+
digitalWrite(_csPin, HIGH);
119+
_spiPort->endTransaction();
120+
121+
return FPC_RESULT_OK;
122+
}

src/sfTk/sfDevFPC2534SPI.h

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
*---------------------------------------------------------------------------------
3+
*
4+
* Copyright (c) 2025, SparkFun Electronics Inc.
5+
*
6+
* SPDX-License-Identifier: MIT
7+
*
8+
*---------------------------------------------------------------------------------
9+
*/
10+
11+
#pragma once
12+
13+
// from the FPC SDK
14+
#include "fpc_api.h"
15+
16+
#include <Arduino.h>
17+
#include <SPI.h>
18+
19+
// SPI impl for the FPC2534 communication interface
20+
21+
class sfDevFPC2534SPI : public sfDevFPC2534IComm
22+
{
23+
public:
24+
sfDevFPC2534SPI();
25+
bool initialize(SPIClass &spiPort, SPISettings &busSPISettings, uint8_t csPin, uint32_t interruptPin,
26+
bool bInit = false);
27+
bool initialize(uint8_t csPin, uint32_t interruptPin, bool bInit = false);
28+
29+
bool dataAvailable();
30+
void clearData();
31+
uint16_t write(const uint8_t *data, size_t len);
32+
uint16_t read(uint8_t *data, size_t len);
33+
34+
private:
35+
// SPI Things
36+
SPIClass *_spiPort;
37+
SPISettings _spiSettings;
38+
uint8_t _csPin;
39+
};

0 commit comments

Comments
 (0)