Skip to content

Commit 2b4eae8

Browse files
committed
Initial SPI implementation
1 parent 2f23f11 commit 2b4eae8

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

libraries/SPI/SPI.cpp

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#include "SPI.h"
2+
3+
arduino::MbedSPI::MbedSPI(int miso, int mosi, int sck) : _miso(miso), _mosi(mosi), _sck(sck) {
4+
}
5+
6+
uint8_t arduino::MbedSPI::transfer(uint8_t data) {
7+
uint8_t ret;
8+
dev->write((const char*)&data, 1, (char*)&ret, 1);
9+
return ret;
10+
}
11+
12+
uint16_t arduino::MbedSPI::transfer16(uint16_t data) {
13+
uint8_t ret[2];
14+
dev->write((const char*)&data, 2, (char*)ret, 2);
15+
return ret[0] << 8 | ret[1];
16+
}
17+
18+
void arduino::MbedSPI::transfer(void *buf, size_t count) {
19+
dev->write((const char*)buf, count, (char*)buf, count);
20+
}
21+
22+
void arduino::MbedSPI::usingInterrupt(int interruptNumber) {
23+
24+
}
25+
26+
void arduino::MbedSPI::notUsingInterrupt(int interruptNumber) {
27+
28+
}
29+
30+
void arduino::MbedSPI::beginTransaction(SPISettings settings) {
31+
if (settings != this->settings) {
32+
dev->format(8, settings.getDataMode());
33+
dev->frequency(settings.getClockFreq());
34+
this->settings = settings;
35+
}
36+
}
37+
38+
void arduino::MbedSPI::endTransaction(void) {
39+
// spinlock until transmission is over (if using ASYNC transfer)
40+
}
41+
42+
void arduino::MbedSPI::attachInterrupt() {
43+
44+
}
45+
46+
void arduino::MbedSPI::detachInterrupt() {
47+
48+
}
49+
50+
void arduino::MbedSPI::begin() {
51+
dev = new mbed::SPI((PinName)_miso, (PinName)_mosi, (PinName)_sck);
52+
}
53+
54+
void arduino::MbedSPI::end() {
55+
if (dev != NULL) {
56+
delete dev;
57+
}
58+
}
59+
60+
#if DEVICE_SPI > 0
61+
arduino::MbedSPI SPI(SPI_MISO, SPI_MOSI, SPI_SCK);
62+
#elif DEVICE_SPI > 1
63+
arduino::MbedSPI SPI1(SPI_MISO1, SPI_MOSI1, SPI_SCK1);
64+
#endif

libraries/SPI/SPI.h

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#include "Arduino.h"
2+
#include "mbed.h"
3+
4+
namespace arduino {
5+
6+
class MbedSPI : public SPIClass
7+
{
8+
public:
9+
MbedSPI(int miso, int mosi, int sck);
10+
virtual uint8_t transfer(uint8_t data);
11+
virtual uint16_t transfer16(uint16_t data);
12+
virtual void transfer(void *buf, size_t count);
13+
14+
// Transaction Functions
15+
virtual void usingInterrupt(int interruptNumber);
16+
virtual void notUsingInterrupt(int interruptNumber);
17+
virtual void beginTransaction(SPISettings settings);
18+
virtual void endTransaction(void);
19+
20+
// SPI Configuration methods
21+
virtual void attachInterrupt();
22+
virtual void detachInterrupt();
23+
24+
virtual void begin();
25+
virtual void end();
26+
27+
private:
28+
SPISettings settings;
29+
mbed::SPI* dev;
30+
int _miso;
31+
int _mosi;
32+
int _sck;
33+
};
34+
35+
}
36+
37+
#if DEVICE_SPI > 0
38+
extern arduino::MbedSPI SPI;
39+
#elif DEVICE_SPI > 1
40+
extern arduino::MbedSPI SPI1;
41+
#endif

0 commit comments

Comments
 (0)