Skip to content

Commit f054f5c

Browse files
authored
Merge pull request #101 from sandeepmistry/digital-read-write-pullup
Enable digitalRead on output pins, only enable pull-up in digitalWrite if pin is not output
2 parents 5b2c475 + a08cb3f commit f054f5c

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

cores/arduino/wiring_digital.c

+16-5
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,13 @@ void pinMode( uint32_t ulPin, uint32_t ulMode )
5858
break ;
5959

6060
case OUTPUT:
61+
// enable input, to support reading back values
62+
PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].bit.INEN = 1 ;
63+
64+
// disable pullups
65+
PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].bit.PULLEN = 0 ;
66+
6167
// Set pin to output mode
62-
PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg&=~(uint8_t)(PORT_PINCFG_INEN) ;
6368
PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ;
6469
break ;
6570

@@ -77,17 +82,23 @@ void digitalWrite( uint32_t ulPin, uint32_t ulVal )
7782
return ;
7883
}
7984

80-
// Enable pull-up resistor
81-
PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_PULLEN) ;
85+
EPortType port = g_APinDescription[ulPin].ulPort;
86+
uint32_t pin = g_APinDescription[ulPin].ulPin;
87+
uint32_t pinMask = (1ul << pin);
88+
89+
if ( (PORT->Group[port].DIRSET.reg & pinMask) == 0 ) {
90+
// the pin is not an output, disable pull-up if val is LOW, otherwise enable pull-up
91+
PORT->Group[port].PINCFG[pin].bit.PULLEN = ((ulVal == LOW) ? 0 : 1) ;
92+
}
8293

8394
switch ( ulVal )
8495
{
8596
case LOW:
86-
PORT->Group[g_APinDescription[ulPin].ulPort].OUTCLR.reg = (1ul << g_APinDescription[ulPin].ulPin) ;
97+
PORT->Group[port].OUTCLR.reg = pinMask;
8798
break ;
8899

89100
default:
90-
PORT->Group[g_APinDescription[ulPin].ulPort].OUTSET.reg = (1ul << g_APinDescription[ulPin].ulPin) ;
101+
PORT->Group[port].OUTSET.reg = pinMask;
91102
break ;
92103
}
93104

0 commit comments

Comments
 (0)