Skip to content

Commit 9a5be09

Browse files
committed
[sam] Refactoring API for SPI library
1 parent 0e0c18e commit 9a5be09

File tree

5 files changed

+77
-86
lines changed

5 files changed

+77
-86
lines changed

hardware/arduino/sam/libraries/SPI/SPI.cpp

+32-43
Original file line numberDiff line numberDiff line change
@@ -10,75 +10,71 @@
1010

1111
#include "SPI.h"
1212

13-
SPIClass::SPIClass(Spi *_spi, uint32_t _id, void(*_initCb)(void), uint32_t *_ss) :
13+
SPIClass::SPIClass(Spi *_spi, uint32_t _id, void(*_initCb)(void)) :
1414
spi(_spi), id(_id), initCb(_initCb)
1515
{
16-
for (int i=0; i<SPI_CHANNELS_NUM; i++)
17-
ssPins[i] = _ss[i];
18-
}
19-
20-
void SPIClass::begin() {
2116
initCb();
2217

23-
// Set CS on NPCS3
2418
SPI_Configure(spi, id, SPI_MR_MSTR | SPI_MR_PS);
2519
SPI_Enable(spi);
2620
setClockDivider(1);
2721
setDataMode(SPI_MODE0);
2822
}
2923

30-
void SPIClass::addSlave(uint8_t _channel) {
31-
uint32_t pin = ssPins[_channel];
32-
if (pin == 0)
24+
void SPIClass::begin(uint8_t _pin) {
25+
if (_pin == 0)
3326
return;
34-
PIO_Configure(g_APinDescription[pin].pPort,
35-
g_APinDescription[pin].ulPinType,
36-
g_APinDescription[pin].ulPin,
37-
g_APinDescription[pin].ulPinConfiguration);
27+
PIO_Configure(g_APinDescription[_pin].pPort,
28+
g_APinDescription[_pin].ulPinType,
29+
g_APinDescription[_pin].ulPin,
30+
g_APinDescription[_pin].ulPinConfiguration);
3831
}
3932

4033
void SPIClass::end() {
4134
SPI_Disable(spi);
4235
}
4336

44-
void SPIClass::setBitOrder(uint8_t bitOrder) {
45-
setBitOrder(bitOrder, 0);
46-
setBitOrder(bitOrder, 1);
47-
setBitOrder(bitOrder, 2);
48-
setBitOrder(bitOrder, 3);
49-
}
37+
//void SPIClass::setBitOrder(uint8_t bitOrder) {
38+
// setBitOrder(bitOrder, 0);
39+
// setBitOrder(bitOrder, 1);
40+
// setBitOrder(bitOrder, 2);
41+
// setBitOrder(bitOrder, 3);
42+
//}
5043

51-
void SPIClass::setBitOrder(uint8_t bitOrder, uint8_t _channel) {
52-
// Not supported
53-
}
44+
//void SPIClass::setBitOrder(uint8_t bitOrder, uint8_t _channel) {
45+
// // Not supported
46+
//}
5447

5548
void SPIClass::setDataMode(uint8_t _mode) {
56-
setDataMode(_mode, 0);
57-
setDataMode(_mode, 1);
58-
setDataMode(_mode, 2);
59-
setDataMode(_mode, 3);
49+
setDataMode(PIN_SPI_SS0, _mode);
50+
setDataMode(PIN_SPI_SS1, _mode);
51+
setDataMode(PIN_SPI_SS2, _mode);
52+
setDataMode(PIN_SPI_SS3, _mode);
6053
}
6154

62-
void SPIClass::setDataMode(uint8_t _mode, uint8_t _channel) {
55+
void SPIClass::setDataMode(uint8_t _pin, uint8_t _mode) {
56+
uint32_t _channel = SPI_PIN_TO_SPI_CHANNEL(_pin);
6357
mode[_channel] = _mode | SPI_CSR_CSAAT;
6458
SPI_ConfigureNPCS(spi, _channel, mode[_channel] | SPI_CSR_SCBR(divider[_channel]));
6559
}
6660

6761
void SPIClass::setClockDivider(uint8_t _divider) {
68-
setClockDivider(_divider, 0);
69-
setClockDivider(_divider, 1);
70-
setClockDivider(_divider, 2);
71-
setClockDivider(_divider, 3);
62+
setClockDivider(PIN_SPI_SS0, _divider);
63+
setClockDivider(PIN_SPI_SS1, _divider);
64+
setClockDivider(PIN_SPI_SS2, _divider);
65+
setClockDivider(PIN_SPI_SS3, _divider);
7266
}
7367

74-
void SPIClass::setClockDivider(uint8_t _divider, uint8_t _channel) {
68+
void SPIClass::setClockDivider(uint8_t _pin, uint8_t _divider) {
69+
uint32_t _channel = SPI_PIN_TO_SPI_CHANNEL(_pin);
7570
divider[_channel] = _divider;
7671
SPI_ConfigureNPCS(spi, _channel, mode[_channel] | SPI_CSR_SCBR(divider[_channel]));
7772
}
7873

79-
byte SPIClass::transfer(byte _data, uint8_t _channel, bool _last) {
74+
byte SPIClass::transfer(byte _pin, uint8_t _data, SPITransferMode _mode) {
75+
uint32_t _channel = SPI_PIN_TO_SPI_CHANNEL(_pin);
8076
uint32_t d = _data | SPI_PCS(_channel);
81-
if (_last)
77+
if (_mode == SPI_LAST)
8278
d |= SPI_TDR_LASTXFER;
8379

8480
// SPI_Write(spi, _channel, _data);
@@ -117,12 +113,5 @@ static void SPI_0_Init(void) {
117113
g_APinDescription[PIN_SPI_SCK].ulPinConfiguration);
118114
}
119115

120-
uint32_t SPI_0_SS[] = {
121-
PIN_SPI_SS0,
122-
PIN_SPI_SS1,
123-
PIN_SPI_SS2,
124-
PIN_SPI_SS3
125-
};
126-
127-
SPIClass SPI_0(SPI_INTERFACE, SPI_INTERFACE_ID, SPI_0_Init, SPI_0_SS);
116+
SPIClass SPI(SPI_INTERFACE, SPI_INTERFACE_ID, SPI_0_Init);
128117
#endif

hardware/arduino/sam/libraries/SPI/SPI.h

+13-10
Original file line numberDiff line numberDiff line change
@@ -19,42 +19,45 @@
1919
#define SPI_MODE2 0x03
2020
#define SPI_MODE3 0x01
2121

22+
enum SPITransferMode {
23+
SPI_CONTINUE,
24+
SPI_LAST
25+
};
26+
2227
class SPIClass {
2328
public:
24-
SPIClass(Spi *_spi, uint32_t _id, void(*_initCb)(void), uint32_t *_ss);
29+
SPIClass(Spi *_spi, uint32_t _id, void(*_initCb)(void));
2530

26-
byte transfer(byte _data, uint8_t _channel = 0, bool _last = true);
31+
byte transfer(byte _channel, uint8_t _data, SPITransferMode _mode = SPI_LAST);
2732

2833
// SPI Configuration methods
2934

3035
void attachInterrupt(void);
3136
void detachInterrupt(void);
3237

33-
void begin(void);
34-
void addSlave(uint8_t _channel);
38+
void begin(uint8_t _channel);
3539
void end(void);
3640

3741
// These methods sets the same parameters on all channels
38-
void setBitOrder(uint8_t);
42+
//void setBitOrder(uint8_t);
3943
void setDataMode(uint8_t);
4044
void setClockDivider(uint8_t);
4145

4246
// These methods sets a parameter on a single channel
43-
void setBitOrder(uint8_t, uint8_t _channel);
44-
void setDataMode(uint8_t, uint8_t _channel);
45-
void setClockDivider(uint8_t, uint8_t _channel);
47+
// void setBitOrder(uint8_t _channel, uint8_t);
48+
void setDataMode(uint8_t _channel, uint8_t);
49+
void setClockDivider(uint8_t _channel, uint8_t);
4650

4751
private:
4852
Spi *spi;
4953
uint32_t id;
5054
uint32_t divider[SPI_CHANNELS_NUM];
5155
uint32_t mode[SPI_CHANNELS_NUM];
52-
uint32_t ssPins[SPI_CHANNELS_NUM];
5356
void (*initCb)(void);
5457
};
5558

5659
#if SPI_INTERFACES_COUNT > 0
57-
extern SPIClass SPI_0;
60+
extern SPIClass SPI;
5861
#endif
5962

6063
#endif
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,34 @@
11

22
#include <SPI.h>
33

4-
#define FLASH_SPI_CHAN 3
4+
// Flash memory is connected on SPI pin SS3
5+
#define FLASH PIN_SPI_SS3
56

67
void setup() {
7-
Serial1.begin(9600);
8-
SPI_0.begin();
9-
SPI_0.addSlave(FLASH_SPI_CHAN);
10-
SPI_0.setClockDivider(2); // We are too fast with 1
8+
Serial.begin(9600);
9+
SPI.begin(FLASH);
10+
SPI.setClockDivider(2); // We are too fast with 1
1111
}
1212

1313
void loop() {
14-
Serial1.println("Sending 'Identify' cmd to flash => 9F");
14+
Serial.println("Sending 'Identify' cmd to flash => 9F");
1515

16-
// Send cmd and receive response on the same transaction
17-
// Parameter "false" keeps the SS pin active
18-
SPI_0.transfer(0x9f, FLASH_SPI_CHAN, false);
19-
char a1 = SPI_0.transfer(0x00, FLASH_SPI_CHAN, false);
20-
char a2 = SPI_0.transfer(0x00, FLASH_SPI_CHAN, false);
21-
char a3 = SPI_0.transfer(0x00, FLASH_SPI_CHAN, false);
22-
char a4 = SPI_0.transfer(0x00, FLASH_SPI_CHAN, false);
23-
char a5 = SPI_0.transfer(0x00, FLASH_SPI_CHAN);
16+
// Send "identify" command (9f) and receive response
17+
// on the same SPI transaction. Parameter SPI_CONTINUE
18+
// keeps the SS pin active.
19+
SPI.transfer(FLASH, 0x9f, SPI_CONTINUE);
20+
char a1 = SPI.transfer(FLASH, 0x00, SPI_CONTINUE);
21+
char a2 = SPI.transfer(FLASH, 0x00, SPI_CONTINUE);
22+
char a3 = SPI.transfer(FLASH, 0x00, SPI_CONTINUE);
23+
char a4 = SPI.transfer(FLASH, 0x00, SPI_CONTINUE);
24+
char a5 = SPI.transfer(FLASH, 0x00);
2425

25-
Serial1.print("Received signature: ");
26-
Serial1.print(a1, HEX);
27-
Serial1.print(" ");
28-
Serial1.print(a2, HEX);
29-
Serial1.print(" ");
30-
Serial1.print(a3, HEX);
31-
Serial1.print(" ");
32-
Serial1.print(a4, HEX);
33-
Serial1.print(" ");
34-
Serial1.print(a5, HEX);
35-
Serial1.println();
26+
// Print response over serial port
27+
Serial.print("Received signature: ");
28+
Serial.print(a1, HEX);
29+
Serial.print(a2, HEX);
30+
Serial.print(a3, HEX);
31+
Serial.print(a4, HEX);
32+
Serial.println(a5, HEX);
3633
delay(1000);
3734
}
38-

hardware/arduino/sam/libraries/SPI/keywords.txt

+9-7
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,26 @@
66
# Datatypes (KEYWORD1)
77
#######################################
88

9-
SPI_0 KEYWORD1
9+
SPI KEYWORD1
1010

1111
#######################################
1212
# Methods and Functions (KEYWORD2)
1313
#######################################
1414
begin KEYWORD2
15-
addSlave KEYWORD2
1615
end KEYWORD2
1716
transfer KEYWORD2
18-
setBitOrder KEYWORD2
17+
#setBitOrder KEYWORD2
1918
setDataMode KEYWORD2
2019
setClockDivider KEYWORD2
2120

2221

2322
#######################################
2423
# Constants (LITERAL1)
2524
#######################################
26-
SPI_MODE0 LITERAL1
27-
SPI_MODE1 LITERAL1
28-
SPI_MODE2 LITERAL1
29-
SPI_MODE3 LITERAL1
25+
SPI_MODE0 LITERAL1
26+
SPI_MODE1 LITERAL1
27+
SPI_MODE2 LITERAL1
28+
SPI_MODE3 LITERAL1
29+
30+
SPI_CONTINUE LITERAL1
31+
SPI_LAST LITERAL1

hardware/arduino/sam/variants/arduino_due_x/variant.h

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ extern "C"{
9292
#define PIN_SPI_MOSI (75u)
9393
#define PIN_SPI_MISO (74u)
9494
#define PIN_SPI_SCK (76u)
95+
#define SPI_PIN_TO_SPI_CHANNEL(x) (x==PIN_SPI_SS0 ? 0 : (x==PIN_SPI_SS1 ? 1 : (x==PIN_SPI_SS2 ? 2 : 3)))
9596

9697
static const uint8_t SS = PIN_SPI_SS0 ;
9798
static const uint8_t SS1 = PIN_SPI_SS1 ;

0 commit comments

Comments
 (0)