Skip to content

Commit e2e063a

Browse files
authored
Allow SPI display usage without CS pin (#376)
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 e2e063a

File tree

3 files changed

+39
-21
lines changed

3 files changed

+39
-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: 18 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,9 @@ 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);
57+
}
5558
pinMode(_rst, OUTPUT);
5659

5760
SPI.begin ();
@@ -105,27 +108,27 @@ class SH1106Spi : public OLEDDisplay {
105108
sendCommand(0xB0 + y);
106109
sendCommand(minBoundXp2H);
107110
sendCommand(minBoundXp2L);
108-
digitalWrite(_cs, HIGH);
111+
set_CS(HIGH);
109112
digitalWrite(_dc, HIGH); // data mode
110-
digitalWrite(_cs, LOW);
113+
set_CS(LOW);
111114
for (x = minBoundX; x <= maxBoundX; x++) {
112115
SPI.transfer(buffer[x + y * displayWidth]);
113116
}
114-
digitalWrite(_cs, HIGH);
117+
set_CS(HIGH);
115118
yield();
116119
}
117120
#else
118121
for (uint8_t y=0; y<displayHeight/8; y++) {
119122
sendCommand(0xB0 + y);
120123
sendCommand(0x02);
121124
sendCommand(0x10);
122-
digitalWrite(_cs, HIGH);
125+
set_CS(HIGH);
123126
digitalWrite(_dc, HIGH); // data mode
124-
digitalWrite(_cs, LOW);
127+
set_CS(LOW);
125128
for( uint8_t x=0; x < displayWidth; x++) {
126129
SPI.transfer(buffer[x + y * displayWidth]);
127130
}
128-
digitalWrite(_cs, HIGH);
131+
set_CS(HIGH);
129132
yield();
130133
}
131134
#endif
@@ -135,12 +138,17 @@ class SH1106Spi : public OLEDDisplay {
135138
int getBufferOffset(void) {
136139
return 0;
137140
}
141+
inline void set_CS(bool level) {
142+
if (_cs != (uint8_t) -1) {
143+
digitalWrite(_cs, level);
144+
}
145+
};
138146
inline void sendCommand(uint8_t com) __attribute__((always_inline)){
139-
digitalWrite(_cs, HIGH);
147+
set_CS(HIGH);
140148
digitalWrite(_dc, LOW);
141-
digitalWrite(_cs, LOW);
149+
set_CS(LOW);
142150
SPI.transfer(com);
143-
digitalWrite(_cs, HIGH);
151+
set_CS(HIGH);
144152
}
145153
};
146154

src/SSD1306Spi.h

Lines changed: 18 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,9 @@ 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);
63+
}
6164
pinMode(_rst, OUTPUT);
6265

6366
SPI.begin ();
@@ -111,16 +114,16 @@ class SSD1306Spi : public OLEDDisplay {
111114
sendCommand(minBoundY);
112115
sendCommand(maxBoundY);
113116

114-
digitalWrite(_cs, HIGH);
117+
set_CS(HIGH);
115118
digitalWrite(_dc, HIGH); // data mode
116-
digitalWrite(_cs, LOW);
119+
set_CS(LOW);
117120
for (y = minBoundY; y <= maxBoundY; y++) {
118121
for (x = minBoundX; x <= maxBoundX; x++) {
119122
SPI.transfer(buffer[x + y * displayWidth]);
120123
}
121124
yield();
122125
}
123-
digitalWrite(_cs, HIGH);
126+
set_CS(HIGH);
124127
#else
125128
// No double buffering
126129
sendCommand(COLUMNADDR);
@@ -136,27 +139,32 @@ class SSD1306Spi : public OLEDDisplay {
136139
sendCommand(0x3);
137140
}
138141

139-
digitalWrite(_cs, HIGH);
142+
set_CS(HIGH);
140143
digitalWrite(_dc, HIGH); // data mode
141-
digitalWrite(_cs, LOW);
144+
set_CS(LOW);
142145
for (uint16_t i=0; i<displayBufferSize; i++) {
143146
SPI.transfer(buffer[i]);
144147
yield();
145148
}
146-
digitalWrite(_cs, HIGH);
149+
set_CS(HIGH);
147150
#endif
148151
}
149152

150153
private:
151154
int getBufferOffset(void) {
152155
return 0;
153156
}
157+
inline void set_CS(bool level) {
158+
if (_cs != (uint8_t) -1) {
159+
digitalWrite(_cs, level);
160+
}
161+
};
154162
inline void sendCommand(uint8_t com) __attribute__((always_inline)){
155-
digitalWrite(_cs, HIGH);
163+
set_CS(HIGH);
156164
digitalWrite(_dc, LOW);
157-
digitalWrite(_cs, LOW);
165+
set_CS(LOW);
158166
SPI.transfer(com);
159-
digitalWrite(_cs, HIGH);
167+
set_CS(HIGH);
160168
}
161169
};
162170

0 commit comments

Comments
 (0)