Skip to content

Commit 328f838

Browse files
committed
[samd] fixing arduino#28
1 parent f2cfe52 commit 328f838

File tree

1 file changed

+35
-17
lines changed

1 file changed

+35
-17
lines changed

Diff for: cores/arduino/wiring_digital.c

+35-17
Original file line numberDiff line numberDiff line change
@@ -69,29 +69,47 @@ void pinMode( uint32_t ulPin, uint32_t ulMode )
6969
}
7070
}
7171

72-
void digitalWrite( uint32_t ulPin, uint32_t ulVal )
72+
void digitalWrite(uint32_t ulPin, uint32_t ulVal)
7373
{
74-
// Handle the case the pin isn't usable as PIO
75-
if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
74+
uint32_t ulGPIOPin=g_APinDescription[ulPin].ulPin;
75+
PortGroup* port=&(PORT->Group[g_APinDescription[ulPin].ulPort]);
76+
77+
// Handle the case the pin is invalid
78+
if (ulPin >= PINS_COUNT)
7679
{
7780
return ;
7881
}
7982

80-
// Enable pull-up resistor
81-
PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_PULLEN) ;
82-
83-
switch ( ulVal )
83+
// Test if pin is set to INPUT mode, then activate pull-up according to ulVal
84+
if (port->DIR.reg & (1ul<<ulGPIOPin) != 0)
8485
{
85-
case LOW:
86-
PORT->Group[g_APinDescription[ulPin].ulPort].OUTCLR.reg = (1ul << g_APinDescription[ulPin].ulPin) ;
87-
break ;
88-
89-
case HIGH:
90-
PORT->Group[g_APinDescription[ulPin].ulPort].OUTSET.reg = (1ul << g_APinDescription[ulPin].ulPin) ;
91-
break ;
92-
93-
default:
94-
break ;
86+
switch (ulVal)
87+
{
88+
case LOW:
89+
// Disable pull-up resistor
90+
port->PINCFG[ulGPIOPin].bit.PULLEN=0;
91+
break;
92+
93+
case HIGH:
94+
default:
95+
// Enable pull-up resistor
96+
port->PINCFG[ulGPIOPin].bit.PULLEN=1;
97+
break;
98+
}
99+
}
100+
else // pin is set to OUTPUT mode, we output the requested voltage level
101+
{
102+
switch (ulVal)
103+
{
104+
case LOW:
105+
port->OUTCLR.reg=(1ul<<ulGPIOPin);
106+
break;
107+
108+
case HIGH:
109+
default:
110+
port->OUTSET.reg=(1ul<<ulGPIOPin);
111+
break;
112+
}
95113
}
96114

97115
return ;

0 commit comments

Comments
 (0)