Skip to content

Commit e6b81a2

Browse files
committed
allow SPI display usage without CS pin
If there is only one SPI device, the CS pin can be hardwired to ground. In that case, the CS pin setting should be ignored. Allow for that if CS is passed as "-1".
1 parent 057629d commit e6b81a2

File tree

3 files changed

+37
-21
lines changed

3 files changed

+37
-21
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,9 +125,11 @@ or for the SH1106:
125125
#include <SPI.h>
126126
#include "SH1106Spi.h"
127127
128-
SH1106Spi display(D0, D2); // RES, DC
128+
SH1106Spi display(D0, D2, CS); // RES, DC, CS
129129
```
130130

131+
In case the CS pin is not used (hard wired to ground), pass CS as -1.
132+
131133
## API
132134

133135
### Display Control

src/SH1106Spi.h

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class SH1106Spi : public OLEDDisplay {
4141
uint8_t _cs;
4242

4343
public:
44+
/* pass _cs as -1 to indicate "do not use CS pin", for cases where it is hard wired low */
4445
SH1106Spi(uint8_t _rst, uint8_t _dc, uint8_t _cs, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) {
4546
setGeometry(g);
4647

@@ -51,7 +52,8 @@ class SH1106Spi : public OLEDDisplay {
5152

5253
bool connect(){
5354
pinMode(_dc, OUTPUT);
54-
pinMode(_cs, OUTPUT);
55+
if (_cs != (uint8_t) -1)
56+
pinMode(_cs, OUTPUT);
5557
pinMode(_rst, OUTPUT);
5658

5759
SPI.begin ();
@@ -105,27 +107,27 @@ class SH1106Spi : public OLEDDisplay {
105107
sendCommand(0xB0 + y);
106108
sendCommand(minBoundXp2H);
107109
sendCommand(minBoundXp2L);
108-
digitalWrite(_cs, HIGH);
110+
set_CS(HIGH);
109111
digitalWrite(_dc, HIGH); // data mode
110-
digitalWrite(_cs, LOW);
112+
set_CS(LOW);
111113
for (x = minBoundX; x <= maxBoundX; x++) {
112114
SPI.transfer(buffer[x + y * displayWidth]);
113115
}
114-
digitalWrite(_cs, HIGH);
116+
set_CS(HIGH);
115117
yield();
116118
}
117119
#else
118120
for (uint8_t y=0; y<displayHeight/8; y++) {
119121
sendCommand(0xB0 + y);
120122
sendCommand(0x02);
121123
sendCommand(0x10);
122-
digitalWrite(_cs, HIGH);
124+
set_CS(HIGH);
123125
digitalWrite(_dc, HIGH); // data mode
124-
digitalWrite(_cs, LOW);
126+
set_CS(LOW);
125127
for( uint8_t x=0; x < displayWidth; x++) {
126128
SPI.transfer(buffer[x + y * displayWidth]);
127129
}
128-
digitalWrite(_cs, HIGH);
130+
set_CS(HIGH);
129131
yield();
130132
}
131133
#endif
@@ -135,12 +137,17 @@ class SH1106Spi : public OLEDDisplay {
135137
int getBufferOffset(void) {
136138
return 0;
137139
}
140+
inline void set_CS(bool level) {
141+
if (_cs != (uint8_t) -1) {
142+
digitalWrite(_cs, level);
143+
}
144+
};
138145
inline void sendCommand(uint8_t com) __attribute__((always_inline)){
139-
digitalWrite(_cs, HIGH);
146+
set_CS(HIGH);
140147
digitalWrite(_dc, LOW);
141-
digitalWrite(_cs, LOW);
148+
set_CS(LOW);
142149
SPI.transfer(com);
143-
digitalWrite(_cs, HIGH);
150+
set_CS(HIGH);
144151
}
145152
};
146153

src/SSD1306Spi.h

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class SSD1306Spi : public OLEDDisplay {
4747
uint8_t _cs;
4848

4949
public:
50+
/* pass _cs as -1 to indicate "do not use CS pin", for cases where it is hard wired low */
5051
SSD1306Spi(uint8_t _rst, uint8_t _dc, uint8_t _cs, OLEDDISPLAY_GEOMETRY g = GEOMETRY_128_64) {
5152
setGeometry(g);
5253

@@ -57,7 +58,8 @@ class SSD1306Spi : public OLEDDisplay {
5758

5859
bool connect(){
5960
pinMode(_dc, OUTPUT);
60-
pinMode(_cs, OUTPUT);
61+
if (_cs != (uint8_t) -1)
62+
pinMode(_cs, OUTPUT);
6163
pinMode(_rst, OUTPUT);
6264

6365
SPI.begin ();
@@ -111,16 +113,16 @@ class SSD1306Spi : public OLEDDisplay {
111113
sendCommand(minBoundY);
112114
sendCommand(maxBoundY);
113115

114-
digitalWrite(_cs, HIGH);
116+
set_CS(HIGH);
115117
digitalWrite(_dc, HIGH); // data mode
116-
digitalWrite(_cs, LOW);
118+
set_CS(LOW);
117119
for (y = minBoundY; y <= maxBoundY; y++) {
118120
for (x = minBoundX; x <= maxBoundX; x++) {
119121
SPI.transfer(buffer[x + y * displayWidth]);
120122
}
121123
yield();
122124
}
123-
digitalWrite(_cs, HIGH);
125+
set_CS(HIGH);
124126
#else
125127
// No double buffering
126128
sendCommand(COLUMNADDR);
@@ -136,27 +138,32 @@ class SSD1306Spi : public OLEDDisplay {
136138
sendCommand(0x3);
137139
}
138140

139-
digitalWrite(_cs, HIGH);
141+
set_CS(HIGH);
140142
digitalWrite(_dc, HIGH); // data mode
141-
digitalWrite(_cs, LOW);
143+
set_CS(LOW);
142144
for (uint16_t i=0; i<displayBufferSize; i++) {
143145
SPI.transfer(buffer[i]);
144146
yield();
145147
}
146-
digitalWrite(_cs, HIGH);
148+
set_CS(HIGH);
147149
#endif
148150
}
149151

150152
private:
151153
int getBufferOffset(void) {
152154
return 0;
153155
}
156+
inline void set_CS(bool level) {
157+
if (_cs != (uint8_t) -1) {
158+
digitalWrite(_cs, level);
159+
}
160+
};
154161
inline void sendCommand(uint8_t com) __attribute__((always_inline)){
155-
digitalWrite(_cs, HIGH);
162+
set_CS(HIGH);
156163
digitalWrite(_dc, LOW);
157-
digitalWrite(_cs, LOW);
164+
set_CS(LOW);
158165
SPI.transfer(com);
159-
digitalWrite(_cs, HIGH);
166+
set_CS(HIGH);
160167
}
161168
};
162169

0 commit comments

Comments
 (0)