Skip to content

Commit b6bd051

Browse files
authored
Merge pull request #315 from ogatatsu/Serial2
Support Serial2
2 parents cc69ecc + c84538a commit b6bd051

File tree

4 files changed

+130
-104
lines changed

4 files changed

+130
-104
lines changed

cores/nRF5/HardwareSerial.h

Lines changed: 33 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -20,49 +20,41 @@
2020
#define HardwareSerial_h
2121

2222
#include <inttypes.h>
23+
#include <nrf.h>
2324

2425
#include "Stream.h"
2526

26-
#define HARDSER_PARITY_EVEN (0x1ul)
27-
#define HARDSER_PARITY_ODD (0x2ul)
28-
#define HARDSER_PARITY_NONE (0x3ul)
29-
#define HARDSER_PARITY_MASK (0xFul)
27+
// below configs are not supported by nRF52
28+
// #define SERIAL_5N1
29+
// #define SERIAL_6N1
30+
// #define SERIAL_7N1
31+
// #define SERIAL_5N2
32+
// #define SERIAL_6N2
33+
// #define SERIAL_7N2
34+
// #define SERIAL_5E1
35+
// #define SERIAL_6E1
36+
// #define SERIAL_7E1
37+
// #define SERIAL_5E2
38+
// #define SERIAL_6E2
39+
// #define SERIAL_7E2
40+
// #define SERIAL_5O1
41+
// #define SERIAL_6O1
42+
// #define SERIAL_7O1
43+
// #define SERIAL_8O1
44+
// #define SERIAL_5O2
45+
// #define SERIAL_6O2
46+
// #define SERIAL_7O2
47+
// #define SERIAL_8O2
3048

31-
#define HARDSER_STOP_BIT_1 (0x10ul)
32-
#define HARDSER_STOP_BIT_1_5 (0x20ul)
33-
#define HARDSER_STOP_BIT_2 (0x30ul)
34-
#define HARDSER_STOP_BIT_MASK (0xF0ul)
35-
36-
#define HARDSER_DATA_5 (0x100ul)
37-
#define HARDSER_DATA_6 (0x200ul)
38-
#define HARDSER_DATA_7 (0x300ul)
39-
#define HARDSER_DATA_8 (0x400ul)
40-
#define HARDSER_DATA_MASK (0xF00ul)
41-
42-
#define SERIAL_5N1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_NONE | HARDSER_DATA_5)
43-
#define SERIAL_6N1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_NONE | HARDSER_DATA_6)
44-
#define SERIAL_7N1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_NONE | HARDSER_DATA_7)
45-
#define SERIAL_8N1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_NONE | HARDSER_DATA_8)
46-
#define SERIAL_5N2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_NONE | HARDSER_DATA_5)
47-
#define SERIAL_6N2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_NONE | HARDSER_DATA_6)
48-
#define SERIAL_7N2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_NONE | HARDSER_DATA_7)
49-
#define SERIAL_8N2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_NONE | HARDSER_DATA_8)
50-
#define SERIAL_5E1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_EVEN | HARDSER_DATA_5)
51-
#define SERIAL_6E1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_EVEN | HARDSER_DATA_6)
52-
#define SERIAL_7E1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_EVEN | HARDSER_DATA_7)
53-
#define SERIAL_8E1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_EVEN | HARDSER_DATA_8)
54-
#define SERIAL_5E2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_EVEN | HARDSER_DATA_5)
55-
#define SERIAL_6E2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_EVEN | HARDSER_DATA_6)
56-
#define SERIAL_7E2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_EVEN | HARDSER_DATA_7)
57-
#define SERIAL_8E2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_EVEN | HARDSER_DATA_8)
58-
#define SERIAL_5O1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_ODD | HARDSER_DATA_5)
59-
#define SERIAL_6O1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_ODD | HARDSER_DATA_6)
60-
#define SERIAL_7O1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_ODD | HARDSER_DATA_7)
61-
#define SERIAL_8O1 (HARDSER_STOP_BIT_1 | HARDSER_PARITY_ODD | HARDSER_DATA_8)
62-
#define SERIAL_5O2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_ODD | HARDSER_DATA_5)
63-
#define SERIAL_6O2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_ODD | HARDSER_DATA_6)
64-
#define SERIAL_7O2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_ODD | HARDSER_DATA_7)
65-
#define SERIAL_8O2 (HARDSER_STOP_BIT_2 | HARDSER_PARITY_ODD | HARDSER_DATA_8)
49+
#ifdef NRF52832_XXAA
50+
#define SERIAL_8N1 (UARTE_CONFIG_PARITY_Excluded << UARTE_CONFIG_PARITY_Pos)
51+
#define SERIAL_8E1 (UARTE_CONFIG_PARITY_Included << UARTE_CONFIG_PARITY_Pos)
52+
#elif NRF52840_XXAA
53+
#define SERIAL_8N1 ((UARTE_CONFIG_STOP_One << UARTE_CONFIG_STOP_Pos) | (UARTE_CONFIG_PARITY_Excluded << UARTE_CONFIG_PARITY_Pos))
54+
#define SERIAL_8N2 ((UARTE_CONFIG_STOP_Two << UARTE_CONFIG_STOP_Pos) | (UARTE_CONFIG_PARITY_Excluded << UARTE_CONFIG_PARITY_Pos))
55+
#define SERIAL_8E1 ((UARTE_CONFIG_STOP_One << UARTE_CONFIG_STOP_Pos) | (UARTE_CONFIG_PARITY_Included << UARTE_CONFIG_PARITY_Pos))
56+
#define SERIAL_8E2 ((UARTE_CONFIG_STOP_Two << UARTE_CONFIG_STOP_Pos) | (UARTE_CONFIG_PARITY_Included << UARTE_CONFIG_PARITY_Pos))
57+
#endif
6658

6759
class HardwareSerial : public Stream
6860
{
@@ -75,7 +67,8 @@ class HardwareSerial : public Stream
7567
virtual int read(void) = 0;
7668
virtual void flush(void) = 0;
7769
virtual size_t write(uint8_t) = 0;
78-
using Print::write; // pull in write(str) and write(buf, size) from Print
70+
virtual size_t write(const uint8_t *buffer, size_t size) = 0;
71+
using Print::write; // pull in write(str) from Print
7972
virtual operator bool() = 0;
8073
};
8174

cores/nRF5/Uart.cpp

Lines changed: 70 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ void serialEventRun(void)
2727
if (serialEvent && Serial.available() ) serialEvent();
2828
}
2929

30-
Uart::Uart(NRF_UART_Type *_nrfUart, IRQn_Type _IRQn, uint8_t _pinRX, uint8_t _pinTX)
30+
Uart::Uart(NRF_UARTE_Type *_nrfUart, IRQn_Type _IRQn, uint8_t _pinRX, uint8_t _pinTX)
3131
{
3232
nrfUart = _nrfUart;
3333
IRQn = _IRQn;
@@ -39,7 +39,7 @@ Uart::Uart(NRF_UART_Type *_nrfUart, IRQn_Type _IRQn, uint8_t _pinRX, uint8_t _pi
3939
_begun = false;
4040
}
4141

42-
Uart::Uart(NRF_UART_Type *_nrfUart, IRQn_Type _IRQn, uint8_t _pinRX, uint8_t _pinTX, uint8_t _pinCTS, uint8_t _pinRTS)
42+
Uart::Uart(NRF_UARTE_Type *_nrfUart, IRQn_Type _IRQn, uint8_t _pinRX, uint8_t _pinTX, uint8_t _pinCTS, uint8_t _pinRTS)
4343
{
4444
nrfUart = _nrfUart;
4545
IRQn = _IRQn;
@@ -55,8 +55,8 @@ Uart::Uart(NRF_UART_Type *_nrfUart, IRQn_Type _IRQn, uint8_t _pinRX, uint8_t _pi
5555

5656
void Uart::setPins(uint8_t pin_rx, uint8_t pin_tx)
5757
{
58-
uc_pinRX = pin_rx;
59-
uc_pinTX = pin_tx;
58+
uc_pinRX = g_ADigitalPinMap[pin_rx];
59+
uc_pinTX = g_ADigitalPinMap[pin_tx];
6060
}
6161

6262
void Uart::begin(unsigned long baudrate)
@@ -69,23 +69,15 @@ void Uart::begin(unsigned long baudrate, uint16_t config)
6969
// skip if already begun
7070
if ( _begun ) return;
7171

72-
nrfUart->PSELTXD = uc_pinTX;
73-
nrfUart->PSELRXD = uc_pinRX;
72+
nrfUart->PSEL.TXD = uc_pinTX;
73+
nrfUart->PSEL.RXD = uc_pinRX;
7474

7575
if (uc_hwFlow == 1) {
76-
nrfUart->PSELCTS = uc_pinCTS;
77-
nrfUart->PSELRTS = uc_pinRTS;
78-
if (config==SERIAL_8E1) {
79-
nrfUart->CONFIG = (UART_CONFIG_PARITY_Included << UART_CONFIG_PARITY_Pos) | UART_CONFIG_HWFC_Enabled;
80-
} else {
81-
nrfUart->CONFIG = (UART_CONFIG_PARITY_Excluded << UART_CONFIG_PARITY_Pos) | UART_CONFIG_HWFC_Enabled;
82-
}
76+
nrfUart->PSEL.CTS = uc_pinCTS;
77+
nrfUart->PSEL.RTS = uc_pinRTS;
78+
nrfUart->CONFIG = config | (UARTE_CONFIG_HWFC_Enabled << UARTE_CONFIG_HWFC_Pos);
8379
} else {
84-
if (config==SERIAL_8E1) {
85-
nrfUart->CONFIG = (UART_CONFIG_PARITY_Included << UART_CONFIG_PARITY_Pos) | UART_CONFIG_HWFC_Disabled;
86-
} else {
87-
nrfUart->CONFIG = (UART_CONFIG_PARITY_Excluded << UART_CONFIG_PARITY_Pos) | UART_CONFIG_HWFC_Disabled;
88-
}
80+
nrfUart->CONFIG = config | (UARTE_CONFIG_HWFC_Disabled << UARTE_CONFIG_HWFC_Pos);
8981
}
9082

9183
uint32_t nrfBaudRate;
@@ -126,15 +118,16 @@ void Uart::begin(unsigned long baudrate, uint16_t config)
126118

127119
nrfUart->BAUDRATE = nrfBaudRate;
128120

129-
nrfUart->ENABLE = UART_ENABLE_ENABLE_Enabled;
121+
nrfUart->ENABLE = UARTE_ENABLE_ENABLE_Enabled;
130122

131-
nrfUart->EVENTS_RXDRDY = 0x0UL;
132-
nrfUart->EVENTS_TXDRDY = 0x0UL;
123+
nrfUart->TXD.PTR = (uint32_t)txBuffer;
124+
nrfUart->EVENTS_ENDTX = 0x0UL;
133125

126+
nrfUart->RXD.PTR = (uint32_t)&rxRcv;
127+
nrfUart->RXD.MAXCNT = 1;
134128
nrfUart->TASKS_STARTRX = 0x1UL;
135-
nrfUart->TASKS_STARTTX = 0x1UL;
136129

137-
nrfUart->INTENSET = UART_INTENSET_RXDRDY_Msk;
130+
nrfUart->INTENSET = UARTE_INTENSET_ENDRX_Msk | UARTE_INTENSET_ENDTX_Msk;
138131

139132
NVIC_ClearPendingIRQ(IRQn);
140133
NVIC_SetPriority(IRQn, 3);
@@ -148,18 +141,18 @@ void Uart::end()
148141
{
149142
NVIC_DisableIRQ(IRQn);
150143

151-
nrfUart->INTENCLR = UART_INTENCLR_RXDRDY_Msk;
144+
nrfUart->INTENCLR = UARTE_INTENSET_ENDRX_Msk | UARTE_INTENSET_ENDTX_Msk;
152145

153146
nrfUart->TASKS_STOPRX = 0x1UL;
154147
nrfUart->TASKS_STOPTX = 0x1UL;
155148

156-
nrfUart->ENABLE = UART_ENABLE_ENABLE_Disabled;
149+
nrfUart->ENABLE = UARTE_ENABLE_ENABLE_Disabled;
157150

158-
nrfUart->PSELTXD = 0xFFFFFFFF;
159-
nrfUart->PSELRXD = 0xFFFFFFFF;
151+
nrfUart->PSEL.TXD = 0xFFFFFFFF;
152+
nrfUart->PSEL.RXD = 0xFFFFFFFF;
160153

161-
nrfUart->PSELRTS = 0xFFFFFFFF;
162-
nrfUart->PSELCTS = 0xFFFFFFFF;
154+
nrfUart->PSEL.RTS = 0xFFFFFFFF;
155+
nrfUart->PSEL.CTS = 0xFFFFFFFF;
163156

164157
rxBuffer.clear();
165158

@@ -170,15 +163,28 @@ void Uart::end()
170163

171164
void Uart::flush()
172165
{
173-
rxBuffer.clear();
166+
if ( _begun ) {
167+
xSemaphoreTake(_mutex, portMAX_DELAY);
168+
xSemaphoreGive(_mutex);
169+
}
174170
}
175171

176172
void Uart::IrqHandler()
177173
{
178-
if (nrfUart->EVENTS_RXDRDY)
174+
if (nrfUart->EVENTS_ENDRX)
175+
{
176+
nrfUart->EVENTS_ENDRX = 0x0UL;
177+
if (nrfUart->RXD.AMOUNT)
178+
{
179+
rxBuffer.store_char(rxRcv);
180+
}
181+
nrfUart->TASKS_STARTRX = 0x1UL;
182+
}
183+
184+
if (nrfUart->EVENTS_ENDTX)
179185
{
180-
nrfUart->EVENTS_RXDRDY = 0x0UL;
181-
rxBuffer.store_char(nrfUart->RXD);
186+
nrfUart->EVENTS_ENDTX = 0x0UL;
187+
xSemaphoreGiveFromISR(_mutex, NULL);
182188
}
183189
}
184190

@@ -197,26 +203,39 @@ int Uart::read()
197203
return rxBuffer.read_char();
198204
}
199205

200-
size_t Uart::write(const uint8_t data)
206+
size_t Uart::write(uint8_t data)
207+
{
208+
return write(&data, 1);
209+
}
210+
211+
size_t Uart::write(const uint8_t *buffer, size_t size)
201212
{
202-
xSemaphoreTake(_mutex, portMAX_DELAY);
213+
if(size == 0) return 0;
203214

204-
nrfUart->TXD = data;
215+
size_t sent = 0;
205216

206-
while(!nrfUart->EVENTS_TXDRDY);
217+
do
218+
{
219+
size_t remaining = size - sent;
220+
size_t txSize = min(remaining, SERIAL_BUFFER_SIZE);
221+
222+
xSemaphoreTake(_mutex, portMAX_DELAY);
207223

208-
nrfUart->EVENTS_TXDRDY = 0x0UL;
224+
memcpy(txBuffer, buffer + sent, txSize);
209225

210-
xSemaphoreGive(_mutex);
226+
nrfUart->TXD.MAXCNT = txSize;
227+
nrfUart->TASKS_STARTTX = 0x1UL;
228+
sent += txSize;
211229

212-
return 1;
230+
} while (sent < size);
231+
232+
return sent;
213233
}
214234

215-
Uart SERIAL_PORT_HARDWARE( NRF_UART0, UARTE0_UART0_IRQn, PIN_SERIAL_RX, PIN_SERIAL_TX );
235+
Uart SERIAL_PORT_HARDWARE( NRF_UARTE0, UARTE0_UART0_IRQn, PIN_SERIAL_RX, PIN_SERIAL_TX );
216236

217-
#ifdef HAVE_HWSERIAL2
218-
// TODO UART1 is UARTE only, need update class Uart to work
219-
Uart Serial2( NRF_UARTE1, UARTE1_IRQn, PIN_SERIAL2_RX, PIN_SERIAL2_TX );
237+
#ifdef SERIAL_PORT_HARDWARE1
238+
Uart SERIAL_PORT_HARDWARE1( NRF_UARTE1, UARTE1_IRQn, PIN_SERIAL2_RX, PIN_SERIAL2_TX );
220239
#endif
221240

222241
extern "C"
@@ -225,4 +244,11 @@ extern "C"
225244
{
226245
SERIAL_PORT_HARDWARE.IrqHandler();
227246
}
247+
248+
#ifdef SERIAL_PORT_HARDWARE1
249+
void UARTE1_IRQHandler()
250+
{
251+
SERIAL_PORT_HARDWARE1.IrqHandler();
252+
}
253+
#endif
228254
}

cores/nRF5/Uart.h

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@
2424
#include "HardwareSerial.h"
2525
#include "RingBuffer.h"
2626
#include "rtos.h"
27+
#include "variant.h"
2728

2829
#include <cstddef>
2930

3031
class Uart : public HardwareSerial
3132
{
3233
public:
33-
Uart(NRF_UART_Type *_nrfUart, IRQn_Type _IRQn, uint8_t _pinRX, uint8_t _pinTX);
34-
Uart(NRF_UART_Type *_nrfUart, IRQn_Type _IRQn, uint8_t _pinRX, uint8_t _pinTX, uint8_t _pinCTS, uint8_t _pinRTS );
34+
Uart(NRF_UARTE_Type *_nrfUart, IRQn_Type _IRQn, uint8_t _pinRX, uint8_t _pinTX);
35+
Uart(NRF_UARTE_Type *_nrfUart, IRQn_Type _IRQn, uint8_t _pinRX, uint8_t _pinTX, uint8_t _pinCTS, uint8_t _pinRTS);
3536

3637
void setPins(uint8_t pin_rx, uint8_t pin_tx);
3738
void begin(unsigned long baudRate);
@@ -41,8 +42,9 @@ class Uart : public HardwareSerial
4142
int peek();
4243
int read();
4344
void flush();
44-
size_t write(const uint8_t data);
45-
using Print::write; // pull in write(str) and write(buf, size) from Print
45+
size_t write(uint8_t data);
46+
size_t write(const uint8_t *buffer, size_t size);
47+
using Print::write; // pull in write(str) from Print
4648

4749
void IrqHandler();
4850

@@ -52,8 +54,10 @@ class Uart : public HardwareSerial
5254
}
5355

5456
private:
55-
NRF_UART_Type *nrfUart;
57+
NRF_UARTE_Type *nrfUart;
5658
RingBuffer rxBuffer;
59+
uint8_t rxRcv;
60+
uint8_t txBuffer[SERIAL_BUFFER_SIZE];
5761

5862
IRQn_Type IRQn;
5963

@@ -86,22 +90,23 @@ class Uart : public HardwareSerial
8690
// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX
8791
// pins are NOT connected to anything by default.
8892
#ifdef NRF52840_XXAA
93+
#define SERIAL_PORT_MONITOR Serial
94+
#define SERIAL_PORT_USBVIRTUAL Serial
8995

90-
#define SERIAL_PORT_MONITOR Serial
91-
#define SERIAL_PORT_USBVIRTUAL Serial
92-
93-
#define SERIAL_PORT_HARDWARE Serial1
94-
#define SERIAL_PORT_HARDWARE_OPEN Serial1
95-
96-
// TODO need to update class Uart to work with UARTE
97-
//extern Uart Serial2;
98-
//#define HAVE_HWSERIAL2
96+
#define SERIAL_PORT_HARDWARE Serial1
97+
#define SERIAL_PORT_HARDWARE_OPEN Serial1
9998

99+
#ifdef HAVE_HWSERIAL2
100+
#define SERIAL_PORT_HARDWARE1 Serial2
101+
#define SERIAL_PORT_HARDWARE_OPEN1 Serial2
102+
#endif
100103
#else
101-
102-
#define SERIAL_PORT_MONITOR Serial
103-
#define SERIAL_PORT_HARDWARE Serial
104-
104+
#define SERIAL_PORT_MONITOR Serial
105+
#define SERIAL_PORT_HARDWARE Serial
105106
#endif
106107

107108
extern Uart SERIAL_PORT_HARDWARE;
109+
110+
#ifdef SERIAL_PORT_HARDWARE1
111+
extern Uart SERIAL_PORT_HARDWARE1;
112+
#endif

variants/pca10056/variant.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,13 @@ static const uint8_t AREF = PIN_AREF;
9494
/*
9595
* Serial interfaces
9696
*/
97+
#define HAVE_HWSERIAL2
98+
9799
#define PIN_SERIAL_RX (33)
98100
#define PIN_SERIAL_TX (34)
99101

100-
//#define PIN_SERIAL2_RX (8)
101-
//#define PIN_SERIAL2_TX (6)
102+
#define PIN_SERIAL2_RX (8)
103+
#define PIN_SERIAL2_TX (6)
102104

103105
/*
104106
* SPI Interfaces

0 commit comments

Comments
 (0)