Skip to content

Commit 588c232

Browse files
committed
[samd] fixing issue arduino#28
1 parent b0e8ff0 commit 588c232

File tree

1 file changed

+40
-19
lines changed

1 file changed

+40
-19
lines changed

Diff for: cores/arduino/wiring_digital.c

+40-19
Original file line numberDiff line numberDiff line change
@@ -69,45 +69,66 @@ 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-
default:
90-
PORT->Group[g_APinDescription[ulPin].ulPort].OUTSET.reg = (1ul << g_APinDescription[ulPin].ulPin) ;
91-
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+
}
92113
}
93114

94115
return ;
95116
}
96117

97118
int digitalRead( uint32_t ulPin )
98119
{
99-
// Handle the case the pin isn't usable as PIO
100-
if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
120+
// Handle the case the pin is invalid
121+
if (ulPin >= PINS_COUNT)
101122
{
102-
return LOW ;
123+
return LOW;
103124
}
104125

105126
if ( (PORT->Group[g_APinDescription[ulPin].ulPort].IN.reg & (1ul << g_APinDescription[ulPin].ulPin)) != 0 )
106127
{
107-
return HIGH ;
128+
return HIGH;
108129
}
109130

110-
return LOW ;
131+
return LOW;
111132
}
112133

113134
#ifdef __cplusplus

0 commit comments

Comments
 (0)