@@ -87,21 +87,30 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h,
8787 _miso = miso;
8888 _freq = 0 ;
8989#ifdef USE_FAST_PINIO
90- csport = (RwReg *)portOutputRegister (digitalPinToPort (_cs));
91- cspinmask = digitalPinToBitMask (_cs);
92- dcport = (RwReg *)portOutputRegister (digitalPinToPort (_dc));
93- dcpinmask = digitalPinToBitMask (_dc);
94- clkport = (RwReg *)portOutputRegister (digitalPinToPort (_sclk));
95- clkpinmask = digitalPinToBitMask (_sclk);
96- mosiport = (RwReg *)portOutputRegister (digitalPinToPort (_mosi));
97- mosipinmask = digitalPinToBitMask (_mosi);
90+ dcport = (RwReg *)portOutputRegister (digitalPinToPort (dc));
91+ dcpinmask = digitalPinToBitMask (dc);
92+ clkport = (RwReg *)portOutputRegister (digitalPinToPort (sclk));
93+ clkpinmask = digitalPinToBitMask (sclk);
94+ mosiport = (RwReg *)portOutputRegister (digitalPinToPort (mosi));
95+ mosipinmask = digitalPinToBitMask (mosi);
9896 if (miso >= 0 ){
99- misoport = (RwReg *)portInputRegister (digitalPinToPort (_miso ));
100- misopinmask = digitalPinToBitMask (_miso );
97+ misoport = (RwReg *)portInputRegister (digitalPinToPort (miso ));
98+ misopinmask = digitalPinToBitMask (miso );
10199 } else {
102100 misoport = 0 ;
103101 misopinmask = 0 ;
104102 }
103+ if (cs >= 0 ) {
104+ csport = (RwReg *)portOutputRegister (digitalPinToPort (cs));
105+ cspinmask = digitalPinToBitMask (cs);
106+ } else {
107+ // No chip-select line defined; might be permanently tied to GND.
108+ // Assign a valid GPIO register (though not used for CS), and an
109+ // empty pin bitmask...the nonsense bit-twiddling might be faster
110+ // than checking _cs and possibly branching.
111+ csport = dcport;
112+ cspinmask = 0 ;
113+ }
105114#endif
106115}
107116
@@ -126,16 +135,22 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h,
126135 _miso = -1 ;
127136 _freq = 0 ;
128137#ifdef USE_FAST_PINIO
129- csport = (RwReg *)portOutputRegister (digitalPinToPort (_cs));
130- cspinmask = digitalPinToBitMask (_cs);
131- dcport = (RwReg *)portOutputRegister (digitalPinToPort (_dc));
132- dcpinmask = digitalPinToBitMask (_dc);
133138 clkport = 0 ;
134139 clkpinmask = 0 ;
135140 mosiport = 0 ;
136141 mosipinmask = 0 ;
137142 misoport = 0 ;
138143 misopinmask = 0 ;
144+ dcport = (RwReg *)portOutputRegister (digitalPinToPort (dc));
145+ dcpinmask = digitalPinToBitMask (dc);
146+ if (cs >= 0 ) {
147+ csport = (RwReg *)portOutputRegister (digitalPinToPort (cs));
148+ cspinmask = digitalPinToBitMask (cs);
149+ } else {
150+ // See notes in prior constructor.
151+ csport = dcport;
152+ cspinmask = 0 ;
153+ }
139154#endif
140155}
141156
@@ -150,10 +165,12 @@ void Adafruit_SPITFT::initSPI(uint32_t freq)
150165 _freq = freq;
151166
152167 // Control Pins
168+ if (_cs >= 0 ) {
169+ pinMode (_cs, OUTPUT);
170+ digitalWrite (_cs, HIGH); // Deselect
171+ }
153172 pinMode (_dc, OUTPUT);
154173 digitalWrite (_dc, LOW);
155- pinMode (_cs, OUTPUT);
156- digitalWrite (_cs, HIGH);
157174
158175 // Software SPI
159176 if (_sclk >= 0 ){
0 commit comments