Skip to content

Commit 6b61e9a

Browse files
committed
use SPIM3 & SPIM2 for SPI, I2C will use SPIM0/SPIM1
1 parent 0fa5b8a commit 6b61e9a

File tree

4 files changed

+46
-41
lines changed

4 files changed

+46
-41
lines changed

cores/nRF5/nordic/nrfx_config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#define NRFX_SPIM_EXTENDED_ENABLED 0
1212

1313
#define NRFX_SPIM0_ENABLED 0 // used as I2C
14-
#define NRFX_SPIM1_ENABLED 1
14+
#define NRFX_SPIM1_ENABLED 0 // used as I2C
1515
#define NRFX_SPIM2_ENABLED 1
1616

1717
#ifdef NRF52840_XXAA

libraries/SPI/SPI.cpp

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,24 +31,36 @@ SPIClass::SPIClass(NRF_SPIM_Type *p_spi, uint8_t uc_pinMISO, uint8_t uc_pinSCK,
3131

3232
_spim.p_reg = p_spi;
3333

34-
// NRF_SPIM0 is used for I2C
34+
// SPIM0 & SPIM1 are used for I2C
35+
#if NRFX_SPIM0_ENABLED
36+
if ( NRF_SPIM0 == p_spi ) {
37+
_spim.drv_inst_idx = NRFX_SPIM0_INST_IDX;
38+
}
39+
#endif
40+
41+
#if NRFX_SPIM1_ENABLED
3542
if ( NRF_SPIM1 == p_spi ) {
3643
_spim.drv_inst_idx = NRFX_SPIM1_INST_IDX;
37-
} else if ( NRF_SPIM2 == p_spi ) {
44+
}
45+
#endif
46+
47+
if ( NRF_SPIM2 == p_spi ) {
3848
_spim.drv_inst_idx = NRFX_SPIM2_INST_IDX;
39-
} else {
40-
#ifdef NRF52840_XXAA
49+
}
50+
51+
#if NRFX_SPIM3_ENABLED
52+
if ( NRF_SPIM3 == p_spi ) {
4153
_spim.drv_inst_idx = NRFX_SPIM3_INST_IDX;
42-
#endif
4354
}
55+
#endif
4456

4557
// pins
4658
_uc_pinMiso = g_ADigitalPinMap[uc_pinMISO];
4759
_uc_pinSCK = g_ADigitalPinMap[uc_pinSCK];
4860
_uc_pinMosi = g_ADigitalPinMap[uc_pinMOSI];
4961

5062
_dataMode = SPI_MODE0;
51-
_bitOrder = SPI_CONFIG_ORDER_MsbFirst;
63+
_bitOrder = NRF_SPIM_BIT_ORDER_MSB_FIRST;
5264
}
5365

5466
void SPIClass::begin()
@@ -119,7 +131,7 @@ void SPIClass::setDataMode(uint8_t mode)
119131
nrf_spim_configure(_spim.p_reg, (nrf_spim_mode_t) _dataMode, (nrf_spim_bit_order_t) _bitOrder);
120132
}
121133

122-
void SPIClass::setClockDivider(uint8_t div)
134+
void SPIClass::setClockDivider(uint32_t div)
123135
{
124136
nrf_spim_frequency_t clockFreq;
125137

@@ -214,17 +226,19 @@ void SPIClass::detachInterrupt() {
214226
// Should be disableInterrupt()
215227
}
216228

217-
// SPIM0 is used as I2C
218-
219-
#if SPI_INTERFACES_COUNT > 0
220-
#ifdef NRF52840_XXAA
229+
// SPIM0, SPIM1 are configured as I2C
230+
#ifdef NRF52840_XXAA
231+
#if SPI_INTERFACES_COUNT > 0
221232
// use SPIM3 for nrf52840 for highspeed 32Mhz
222233
SPIClass SPI(NRF_SPIM3, PIN_SPI_MISO, PIN_SPI_SCK, PIN_SPI_MOSI);
223-
#else
224-
SPIClass SPI(NRF_SPIM1, PIN_SPI_MISO, PIN_SPI_SCK, PIN_SPI_MOSI);
225234
#endif
226-
#endif
227235

228-
#if SPI_INTERFACES_COUNT > 1
229-
SPIClass SPI1(NRF_SPIM2, PIN_SPI1_MISO, PIN_SPI1_SCK, PIN_SPI1_MOSI);
236+
#if SPI_INTERFACES_COUNT > 1
237+
SPIClass SPI1(NRF_SPIM2, PIN_SPI1_MISO, PIN_SPI1_SCK, PIN_SPI1_MOSI);
238+
#endif
239+
240+
#else
241+
SPIClass SPI(NRF_SPIM2, PIN_SPI_MISO, PIN_SPI_SCK, PIN_SPI_MOSI);
242+
230243
#endif
244+

libraries/SPI/SPI.h

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -40,33 +40,25 @@
4040

4141
class SPISettings {
4242
public:
43-
SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
44-
if (__builtin_constant_p(clock)) {
45-
init_AlwaysInline(clock, bitOrder, dataMode);
46-
} else {
47-
init_MightInline(clock, bitOrder, dataMode);
43+
SPISettings(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
44+
this->clockFreq = clock;
45+
this->bitOrder = bitOrder;
46+
this->dataMode = dataMode;
4847
}
49-
}
5048

51-
// Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first.
52-
SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); }
49+
// Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first.
50+
SPISettings() {
51+
this->clockFreq = 4000000;
52+
this->bitOrder = MSBFIRST;
53+
this->dataMode = SPI_MODE0;
54+
}
5355

5456
private:
55-
void init_MightInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) {
56-
init_AlwaysInline(clock, bitOrder, dataMode);
57-
}
58-
59-
void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, uint8_t dataMode) __attribute__((__always_inline__)) {
60-
this->clockFreq = clock;
61-
this->bitOrder = bitOrder;
62-
this->dataMode = dataMode;
63-
}
64-
65-
uint32_t clockFreq;
66-
uint8_t dataMode;
67-
uint32_t bitOrder;
57+
uint32_t clockFreq;
58+
uint8_t dataMode;
59+
uint8_t bitOrder;
6860

69-
friend class SPIClass;
61+
friend class SPIClass;
7062
};
7163

7264
class SPIClass {
@@ -92,7 +84,7 @@ class SPIClass {
9284

9385
void setBitOrder(BitOrder order);
9486
void setDataMode(uint8_t uc_mode);
95-
void setClockDivider(uint8_t uc_div);
87+
void setClockDivider(uint32_t uc_div);
9688

9789
private:
9890
nrfx_spim_t _spim;

variants/feather_nrf52832/variant.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@ const uint32_t g_ADigitalPinMap[] = {
6767
29, // A5
6868
30, // A6
6969
31, // A7
70-
7170
};
7271

7372
void initVariant()

0 commit comments

Comments
 (0)