Skip to content

Commit a9ca22c

Browse files
committed
Correct + use digitalPinToPort, digitalPinToPin, digitalPinToPin macros
for pulseIn, pinMode, digitalWrite, digitalRead, Wire
1 parent 7da8ba7 commit a9ca22c

File tree

5 files changed

+84
-65
lines changed

5 files changed

+84
-65
lines changed

cores/nRF5/Arduino.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
#include <string.h>
88
#include <math.h>
99

10+
#include "nrf.h"
11+
#include "nrf_peripherals.h"
12+
1013
typedef bool boolean;
1114
typedef uint8_t byte;
1215
typedef uint16_t word;
@@ -92,9 +95,11 @@ void loop( void ) ;
9295

9396
#define bit(b) (1UL << (b))
9497

95-
#define digitalPinToPort(P) ( &(NRF_GPIO[P]) )
96-
#define digitalPinToBitMask(P) ( 1 << g_ADigitalPinMap[P] )
97-
//#define analogInPinToBit(P) ( )
98+
#define gpioBaseForPin(P) ( NRF_GPIO )
99+
#define digitalPinToPort(P) ( (NRF_GPIO_Type *) gpioBaseForPin(P) )
100+
#define digitalPinToPin(P) ( g_ADigitalPinMap[P] )
101+
#define digitalPinToBitMask(P) ( 1 << digitalPinToPin(P) )
102+
98103
#define portOutputRegister(port) ( &(port->OUTSET) )
99104
#define portInputRegister(port) ( &(port->IN) )
100105
#define portModeRegister(port) ( &(port->DIRSET) )

cores/nRF5/pulse.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ uint32_t pulseIn(uint32_t ulPin, uint32_t state, uint32_t timeout)
3333
// pulse width measuring loop and achieve finer resolution. calling
3434
// digitalRead() instead yields much coarser resolution.
3535
// PinDescription p = g_APinDescription[pin];
36-
uint32_t bit = 1 << digitalPinToPin(ulPin);
36+
NRF_GPIO_Type* port = digitalPinToPort(ulPin);
37+
uint32_t bit = digitalPinToBitMask(ulPin);
3738
uint32_t stateMask = state ? bit : 0;
3839

3940
// convert the timeout from microseconds to a number of times through
@@ -42,7 +43,7 @@ uint32_t pulseIn(uint32_t ulPin, uint32_t state, uint32_t timeout)
4243

4344
// count low-level loops during the pulse (or until maxLoops)
4445
// a zero loopCount means that a complete pulse was not detected within the timeout
45-
uint32_t loopCount = countPulseASM(&(NRF_GPIO->IN), bit, stateMask, maxloops);
46+
uint32_t loopCount = countPulseASM(&(port->IN), bit, stateMask, maxloops);
4647

4748
// convert the reading to (approximate) microseconds. The loop time as measured with an
4849
// oscilloscope is 10 cycles on a BBC micro:bit 1.3 (nRF51822). There is error because the

cores/nRF5/wiring_digital.c

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,45 +31,46 @@ void pinMode( uint32_t ulPin, uint32_t ulMode )
3131
return;
3232
}
3333

34-
ulPin = g_ADigitalPinMap[ulPin];
34+
NRF_GPIO_Type* port = digitalPinToPort(ulPin);
35+
uint32_t pin = digitalPinToPin(ulPin);
3536

3637
// Set pin mode according to chapter '22.6.3 I/O Pin Configuration'
3738
switch ( ulMode )
3839
{
3940
case INPUT:
4041
// Set pin to input mode
41-
NRF_GPIO->PIN_CNF[ulPin] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
42-
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
43-
| ((uint32_t)GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
44-
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
45-
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
42+
port->PIN_CNF[pin] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
43+
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
44+
| ((uint32_t)GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
45+
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
46+
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
4647
break ;
4748

4849
case INPUT_PULLUP:
4950
// Set pin to input mode with pull-up resistor enabled
50-
NRF_GPIO->PIN_CNF[ulPin] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
51-
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
52-
| ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
53-
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
54-
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
51+
port->PIN_CNF[pin] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
52+
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
53+
| ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
54+
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
55+
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
5556
break ;
5657

5758
case INPUT_PULLDOWN:
5859
// Set pin to input mode with pull-down resistor enabled
59-
NRF_GPIO->PIN_CNF[ulPin] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
60-
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
61-
| ((uint32_t)GPIO_PIN_CNF_PULL_Pulldown << GPIO_PIN_CNF_PULL_Pos)
62-
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
63-
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
60+
port->PIN_CNF[pin] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
61+
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
62+
| ((uint32_t)GPIO_PIN_CNF_PULL_Pulldown << GPIO_PIN_CNF_PULL_Pos)
63+
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
64+
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
6465
break ;
6566

6667
case OUTPUT:
6768
// Set pin to output mode
68-
NRF_GPIO->PIN_CNF[ulPin] = ((uint32_t)GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos)
69-
| ((uint32_t)GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos)
70-
| ((uint32_t)GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
71-
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
72-
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
69+
port->PIN_CNF[pin] = ((uint32_t)GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos)
70+
| ((uint32_t)GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos)
71+
| ((uint32_t)GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
72+
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
73+
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
7374
break ;
7475

7576
default:
@@ -84,16 +85,17 @@ void digitalWrite( uint32_t ulPin, uint32_t ulVal )
8485
return;
8586
}
8687

87-
ulPin = g_ADigitalPinMap[ulPin];
88+
NRF_GPIO_Type* port = digitalPinToPort(ulPin);
89+
uint32_t mask = digitalPinToBitMask(ulPin);
8890

8991
switch ( ulVal )
9092
{
9193
case LOW:
92-
NRF_GPIO->OUTCLR = (1UL << ulPin);
94+
port->OUTCLR = mask;
9395
break ;
9496

9597
default:
96-
NRF_GPIO->OUTSET = (1UL << ulPin);
98+
port->OUTSET = mask;
9799
break ;
98100
}
99101

@@ -106,9 +108,10 @@ int digitalRead( uint32_t ulPin )
106108
return 0;
107109
}
108110

109-
ulPin = g_ADigitalPinMap[ulPin];
111+
NRF_GPIO_Type* port = digitalPinToPort(ulPin);
112+
uint32_t pin = digitalPinToPin(ulPin);
110113

111-
return ((NRF_GPIO->IN >> ulPin) & 1UL) ? HIGH : LOW ;
114+
return ((port->IN >> pin) & 1UL) ? HIGH : LOW ;
112115
}
113116

114117
#ifdef __cplusplus

libraries/Wire/Wire_nRF51.cpp

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,40 +35,45 @@ extern "C" {
3535
TwoWire::TwoWire(NRF_TWI_Type * p_twi, uint8_t pinSDA, uint8_t pinSCL)
3636
{
3737
this->_p_twi = p_twi;
38-
this->_uc_pinSDA = g_ADigitalPinMap[pinSDA];
39-
this->_uc_pinSCL = g_ADigitalPinMap[pinSCL];
38+
this->_uc_pinSDA = pinSDA;
39+
this->_uc_pinSCL = pinSCL;
4040
this->transmissionBegun = false;
4141
this->suspended = false;
4242
}
4343

4444
#ifdef ARDUINO_GENERIC
4545
void TwoWire::setPins(uint8_t pinSDA, uint8_t pinSCL)
4646
{
47-
this->_uc_pinSDA = g_ADigitalPinMap[pinSDA];
48-
this->_uc_pinSCL = g_ADigitalPinMap[pinSCL];
47+
this->_uc_pinSDA = pinSDA;
48+
this->_uc_pinSCL = pinSCL;
4949
}
5050
#endif // ARDUINO_GENERIC
5151

5252
void TwoWire::begin(void) {
5353
//Master Mode
5454
master = true;
5555

56-
NRF_GPIO->PIN_CNF[_uc_pinSCL] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
57-
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
58-
| ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
59-
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
60-
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
56+
NRF_GPIO_Type* portSCL = digitalPinToPort(_uc_pinSCL);
57+
NRF_GPIO_Type* portSDA = digitalPinToPort(_uc_pinSDA);
58+
uint32_t pinSCL = digitalPinToPin(_uc_pinSCL);
59+
uint32_t pinSDA = digitalPinToPin(_uc_pinSDA);
6160

62-
NRF_GPIO->PIN_CNF[_uc_pinSDA] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
63-
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
64-
| ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
65-
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
66-
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
61+
portSCL->PIN_CNF[pinSCL] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
62+
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
63+
| ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
64+
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
65+
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
66+
67+
portSDA->PIN_CNF[pinSDA] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
68+
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
69+
| ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
70+
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
71+
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
6772

6873
_p_twi->FREQUENCY = (TWI_FREQUENCY_FREQUENCY_K100 << TWI_FREQUENCY_FREQUENCY_Pos);
6974
_p_twi->ENABLE = (TWI_ENABLE_ENABLE_Enabled << TWI_ENABLE_ENABLE_Pos);
70-
_p_twi->PSELSCL = _uc_pinSCL;
71-
_p_twi->PSELSDA = _uc_pinSDA;
75+
_p_twi->PSELSCL = g_ADigitalPinMap[_uc_pinSCL];
76+
_p_twi->PSELSDA = g_ADigitalPinMap[_uc_pinSDA];
7277
}
7378

7479
void TwoWire::setClock(uint32_t baudrate) {

libraries/Wire/Wire_nRF52.cpp

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -36,39 +36,44 @@ TwoWire::TwoWire(NRF_TWIM_Type * p_twim, NRF_TWIS_Type * p_twis, IRQn_Type IRQn,
3636
this->_p_twim = p_twim;
3737
this->_p_twis = p_twis;
3838
this->_IRQn = IRQn;
39-
this->_uc_pinSDA = g_ADigitalPinMap[pinSDA];
40-
this->_uc_pinSCL = g_ADigitalPinMap[pinSCL];
39+
this->_uc_pinSDA = pinSDA;
40+
this->_uc_pinSCL = pinSCL;
4141
transmissionBegun = false;
4242
}
4343

4444
#ifdef ARDUINO_GENERIC
4545
void TwoWire::setPins(uint8_t pinSDA, uint8_t pinSCL)
4646
{
47-
this->_uc_pinSDA = g_ADigitalPinMap[pinSDA];
48-
this->_uc_pinSCL = g_ADigitalPinMap[pinSCL];
47+
this->_uc_pinSDA = pinSDA;
48+
this->_uc_pinSCL = pinSCL;
4949
}
5050
#endif // ARDUINO_GENERIC
5151

5252
void TwoWire::begin(void) {
5353
//Master Mode
5454
master = true;
5555

56-
NRF_GPIO->PIN_CNF[_uc_pinSCL] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
57-
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
58-
| ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
59-
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
60-
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
56+
NRF_GPIO_Type* portSCL = digitalPinToPort(_uc_pinSCL);
57+
NRF_GPIO_Type* portSDA = digitalPinToPort(_uc_pinSDA);
58+
uint32_t pinSCL = digitalPinToPin(_uc_pinSCL);
59+
uint32_t pinSDA = digitalPinToPin(_uc_pinSDA);
6160

62-
NRF_GPIO->PIN_CNF[_uc_pinSDA] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
63-
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
64-
| ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
65-
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
66-
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
61+
portSCL->PIN_CNF[pinSCL] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
62+
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
63+
| ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
64+
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
65+
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
66+
67+
portSDA->PIN_CNF[pinSDA] = ((uint32_t)GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos)
68+
| ((uint32_t)GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
69+
| ((uint32_t)GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos)
70+
| ((uint32_t)GPIO_PIN_CNF_DRIVE_S0D1 << GPIO_PIN_CNF_DRIVE_Pos)
71+
| ((uint32_t)GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
6772

6873
_p_twim->FREQUENCY = TWIM_FREQUENCY_FREQUENCY_K100;
6974
_p_twim->ENABLE = (TWIM_ENABLE_ENABLE_Enabled << TWIM_ENABLE_ENABLE_Pos);
70-
_p_twim->PSEL.SCL = _uc_pinSCL;
71-
_p_twim->PSEL.SDA = _uc_pinSDA;
75+
_p_twim->PSEL.SCL = g_ADigitalPinMap[_uc_pinSCL];
76+
_p_twim->PSEL.SDA = g_ADigitalPinMap[_uc_pinSDA];
7277

7378
NVIC_ClearPendingIRQ(_IRQn);
7479
NVIC_SetPriority(_IRQn, 2);
@@ -93,8 +98,8 @@ void TwoWire::begin(uint8_t address) {
9398

9499
_p_twis->ADDRESS[0] = address;
95100
_p_twis->CONFIG = TWIS_CONFIG_ADDRESS0_Msk;
96-
_p_twis->PSEL.SCL = _uc_pinSCL;
97-
_p_twis->PSEL.SDA = _uc_pinSDA;
101+
_p_twis->PSEL.SCL = g_ADigitalPinMap[_uc_pinSCL];
102+
_p_twis->PSEL.SDA = g_ADigitalPinMap[_uc_pinSDA];
98103

99104
_p_twis->ORC = 0xff;
100105

0 commit comments

Comments
 (0)