libDaisy
Hardware Library for Daisy
Loading...
Searching...
No Matches
oled_ssd130x.h
Go to the documentation of this file.
1#pragma once
2#ifndef SA_OLED_SSD130X_H
3#define SA_OLED_SSD130X_H
5#include "per/i2c.h"
6#include "per/spi.h"
7#include "per/gpio.h"
8#include "sys/system.h"
9
10namespace daisy
11{
16{
17 public:
37 void Init(const Config& config)
38 {
39 i2c_address_ = config.i2c_address;
40 i2c_.Init(config.i2c_config);
41 };
43 {
44 uint8_t buf[2] = {0X00, cmd};
45 i2c_.TransmitBlocking(i2c_address_, buf, 2, 1000);
46 };
47
48 void SendData(uint8_t* buff, size_t size)
49 {
50 for(size_t i = 0; i < size; i++)
51 {
52 uint8_t buf[2] = {0X40, buff[i]};
53 i2c_.TransmitBlocking(i2c_address_, buf, 2, 1000);
54 }
55 };
56
57 private:
59 uint8_t i2c_address_;
60};
61
66{
67 public:
103 void Init(const Config& config)
104 {
105 // Initialize both GPIO
107 pin_dc_.pin = config.pin_config.dc;
108 dsy_gpio_init(&pin_dc_);
109 pin_reset_.mode = DSY_GPIO_MODE_OUTPUT_PP;
110 pin_reset_.pin = config.pin_config.reset;
111 dsy_gpio_init(&pin_reset_);
112
113 // Initialize SPI
114 spi_.Init(config.spi_config);
115
116 // Reset and Configure OLED.
117 dsy_gpio_write(&pin_reset_, 0);
118 System::Delay(10);
119 dsy_gpio_write(&pin_reset_, 1);
120 System::Delay(10);
121 };
123 {
124 dsy_gpio_write(&pin_dc_, 0);
125 spi_.BlockingTransmit(&cmd, 1);
126 };
127
128 void SendData(uint8_t* buff, size_t size)
129 {
130 dsy_gpio_write(&pin_dc_, 1);
132 };
133
134 private:
135 SpiHandle spi_;
136 dsy_gpio pin_reset_;
137 dsy_gpio pin_dc_;
138};
139
144{
145 public:
146 struct Config
147 {
149 {
150 // Initialize using defaults
151 Defaults();
152 }
153 struct
154 {
161 void Defaults()
162 {
163 pin_config.sclk_delay = 0; // fast as possible?!
164 // SPI peripheral config
165 pin_config.sclk = {DSY_GPIOD, 3};
166 pin_config.mosi = {DSY_GPIOC, 3};
167 // SSD130x control pin config
168 pin_config.dc = {DSY_GPIOC, 11}; //D2
169 pin_config.reset = {DSY_GPIOC, 10}; //D3
170 }
171 };
172 void Init(const Config& config)
173 {
174 // Initialize both GPIO
175 pin_sclk_.mode = DSY_GPIO_MODE_OUTPUT_PP;
176 pin_sclk_.pin = config.pin_config.sclk;
177 dsy_gpio_init(&pin_sclk_);
178 dsy_gpio_write(&pin_sclk_, 1); //ClockPolarity::LOW
179 clk_delay = config.pin_config.sclk_delay;
180 pin_mosi_.mode = DSY_GPIO_MODE_OUTPUT_PP;
181 pin_mosi_.pin = config.pin_config.mosi;
182 dsy_gpio_init(&pin_mosi_);
183 dsy_gpio_write(&pin_mosi_, 0);
184
186 pin_dc_.pin = config.pin_config.dc;
187 dsy_gpio_init(&pin_dc_);
188 pin_reset_.mode = DSY_GPIO_MODE_OUTPUT_PP;
189 pin_reset_.pin = config.pin_config.reset;
190 dsy_gpio_init(&pin_reset_);
191
192 // Reset and Configure OLED.
193 dsy_gpio_write(&pin_reset_, 0);
194 System::Delay(10);
195 dsy_gpio_write(&pin_reset_, 1);
196 System::Delay(10);
197 };
199 {
200 dsy_gpio_write(&pin_dc_, 0);
201 SoftSpiTransmit(cmd);
202 };
203
204 void SendData(uint8_t* buff, size_t size)
205 {
206 dsy_gpio_write(&pin_dc_, 1);
207 for(size_t i = 0; i < size; i++)
208 SoftSpiTransmit(buff[i]);
209 };
210
211 private:
212 void SoftSpiTransmit(uint8_t val)
213 {
214 // bit flip
215 val = ((val & 0x01) << 7) | ((val & 0x02) << 5) | ((val & 0x04) << 3)
216 | ((val & 0x08) << 1) | ((val & 0x10) >> 1) | ((val & 0x20) >> 3)
217 | ((val & 0x40) >> 5) | ((val & 0x80) >> 7);
218
219 for(uint8_t bit = 0u; bit < 8u; bit++)
220 {
221 dsy_gpio_write(&pin_mosi_, ((val & (1 << bit)) ? 1 : 0));
222
223 System::DelayTicks(clk_delay);
224
225 dsy_gpio_toggle(&pin_sclk_);
226
227 System::DelayTicks(clk_delay);
228
229 dsy_gpio_toggle(&pin_sclk_);
230 }
231 }
232
233 uint32_t clk_delay;
234 dsy_gpio pin_sclk_;
235 dsy_gpio pin_mosi_;
236 dsy_gpio pin_reset_;
237 dsy_gpio pin_dc_;
238};
239
240
244template <size_t width, size_t height, typename Transport>
246{
247 public:
248 struct Config
249 {
250 typename Transport::Config transport_config;
251 };
252
254 {
255 transport_.Init(config.transport_config);
256
257 // Init routine...
258
259 // Display Off
260 transport_.SendCommand(0xaE);
261 // Dimension dependent commands...
262 switch(height)
263 {
264 case 16:
265 // Display Clock Divide Ratio
266 transport_.SendCommand(0xD5);
267 transport_.SendCommand(0x60);
268 // Multiplex Ratio
269 transport_.SendCommand(0xA8);
270 transport_.SendCommand(0x0F);
271 // COM Pins
272 transport_.SendCommand(0xDA);
273 transport_.SendCommand(0x02);
274 break;
275 case 32:
276 // Display Clock Divide Ratio
277 transport_.SendCommand(0xD5);
278 transport_.SendCommand(0x80);
279 // Multiplex Ratio
280 transport_.SendCommand(0xA8);
281 transport_.SendCommand(0x1F);
282 // COM Pins
283 transport_.SendCommand(0xDA);
284 if(width == 64)
285 {
286 transport_.SendCommand(0x12);
287 }
288 else
289 {
290 transport_.SendCommand(0x02);
291 }
292
293 break;
294 case 48:
295 // Display Clock Divide Ratio
296 transport_.SendCommand(0xD5);
297 transport_.SendCommand(0x80);
298 // Multiplex Ratio
299 transport_.SendCommand(0xA8);
300 transport_.SendCommand(0x2F);
301 // COM Pins
302 transport_.SendCommand(0xDA);
303 transport_.SendCommand(0x12);
304 break;
305 default: // 128
306 // Display Clock Divide Ratio
307 transport_.SendCommand(0xD5);
308 transport_.SendCommand(0x80);
309 // Multiplex Ratio
310 transport_.SendCommand(0xA8);
311 transport_.SendCommand(0x3F);
312 // COM Pins
313 transport_.SendCommand(0xDA);
314 transport_.SendCommand(0x12);
315 break;
316 }
317
318 // Display Offset
319 transport_.SendCommand(0xD3);
320 transport_.SendCommand(0x00);
321 // Start Line Address
322 transport_.SendCommand(0x40);
323 // Normal Display
324 transport_.SendCommand(0xA6);
325 // All On Resume
326 transport_.SendCommand(0xA4);
327 // Charge Pump
328 transport_.SendCommand(0x8D);
329 transport_.SendCommand(0x14);
330 // Set Segment Remap
331 transport_.SendCommand(0xA1);
332 // COM Output Scan Direction
333 transport_.SendCommand(0xC8);
334 // Contrast Control
335 transport_.SendCommand(0x81);
336 transport_.SendCommand(0x8F);
337 // Pre Charge
338 transport_.SendCommand(0xD9);
339 transport_.SendCommand(0x25);
340 // VCOM Detect
341 transport_.SendCommand(0xDB);
342 transport_.SendCommand(0x34);
343
344
345 // Display On
346 transport_.SendCommand(0xAF); //--turn on oled panel
347 };
348
349 size_t Width() const { return width; };
350 size_t Height() const { return height; };
351
353 {
354 if(x >= width || y >= height)
355 return;
356 if(on)
357 buffer_[x + (y / 8) * width] |= (1 << (y % 8));
358 else
359 buffer_[x + (y / 8) * width] &= ~(1 << (y % 8));
360 }
361
362 void Fill(bool on)
363 {
364 for(size_t i = 0; i < sizeof(buffer_); i++)
365 {
366 buffer_[i] = on ? 0xff : 0x00;
367 }
368 };
369
373 void Update()
374 {
375 uint8_t i;
377 switch(height)
378 {
379 case 32: high_column_addr = 0x12; break;
380
381 default: high_column_addr = 0x10; break;
382 }
383 for(i = 0; i < (height / 8); i++)
384 {
385 transport_.SendCommand(0xB0 + i);
386 transport_.SendCommand(0x00);
387 transport_.SendCommand(high_column_addr);
388 transport_.SendData(&buffer_[width * i], width);
389 }
390 };
391
392 protected:
394 uint8_t buffer_[width * height / 8];
395};
396
402
408
414
420
426
432
438
443
448
453
459
460}; // namespace daisy
461
462
463#endif
Definition i2c.h:25
Result Init(const Config &config)
Result TransmitBlocking(uint16_t address, uint8_t *data, uint16_t size, uint32_t timeout)
Definition leddriver.h:33
void Init(I2CHandle i2c, const uint8_t(&addresses)[numDrivers], DmaBuffer dma_buffer_a, DmaBuffer dma_buffer_b, dsy_gpio_pin oe_pin={DSY_GPIOX, 0})
Definition leddriver.h:65
Definition oled_ssd130x.h:144
void SendData(uint8_t *buff, size_t size)
Definition oled_ssd130x.h:204
void SendCommand(uint8_t cmd)
Definition oled_ssd130x.h:198
void Init(const Config &config)
Definition oled_ssd130x.h:172
Definition oled_ssd130x.h:66
void SendCommand(uint8_t cmd)
Definition oled_ssd130x.h:122
void SendData(uint8_t *buff, size_t size)
Definition oled_ssd130x.h:128
void Init(const Config &config)
Definition oled_ssd130x.h:103
Definition oled_ssd130x.h:246
void Update()
Definition oled_ssd130x.h:373
size_t Height() const
Definition oled_ssd130x.h:350
void Fill(bool on)
Definition oled_ssd130x.h:362
size_t Width() const
Definition oled_ssd130x.h:349
void Init(Config config)
Definition oled_ssd130x.h:253
Transport transport_
Definition oled_ssd130x.h:393
void DrawPixel(uint_fast8_t x, uint_fast8_t y, bool on)
Definition oled_ssd130x.h:352
uint8_t buffer_[width *height/8]
Definition oled_ssd130x.h:394
Definition oled_ssd130x.h:16
void Init(const Config &config)
Definition oled_ssd130x.h:37
void SendData(uint8_t *buff, size_t size)
Definition oled_ssd130x.h:48
void SendCommand(uint8_t cmd)
Definition oled_ssd130x.h:42
Definition spi.h:20
Result BlockingTransmit(uint8_t *buff, size_t size, uint32_t timeout=100)
Result Init(const Config &config)
static void Delay(uint32_t delay_ms)
static void DelayTicks(uint32_t delay_ticks)
void dsy_gpio_write(const dsy_gpio *p, uint8_t state)
void dsy_gpio_init(const dsy_gpio *p)
void dsy_gpio_toggle(const dsy_gpio *p)
@ DSY_GPIO_MODE_OUTPUT_PP
Definition gpio.h:159
@ DSY_GPIOB
Definition daisy_core.h:183
@ DSY_GPIOG
Definition daisy_core.h:188
@ DSY_GPIOD
Definition daisy_core.h:185
@ DSY_GPIOX
Definition daisy_core.h:193
@ DSY_GPIOC
Definition daisy_core.h:184
Hardware defines and helpers for daisy field platform.
Definition index.h:2
Definition i2c.h:29
Mode mode
Definition i2c.h:64
Speed speed
Definition i2c.h:63
struct daisy::I2CHandle::Config::@13 pin_config
Peripheral periph
Definition i2c.h:56
Definition oled_ssd130x.h:147
void Defaults()
Definition oled_ssd130x.h:161
Config()
Definition oled_ssd130x.h:148
uint32_t sclk_delay
Definition oled_ssd130x.h:155
struct daisy::SSD130x4WireSoftSpiTransport::Config::@10 pin_config
dsy_gpio_pin sclk
Definition oled_ssd130x.h:156
dsy_gpio_pin dc
Definition oled_ssd130x.h:158
dsy_gpio_pin mosi
Definition oled_ssd130x.h:157
dsy_gpio_pin reset
Definition oled_ssd130x.h:159
Definition oled_ssd130x.h:69
dsy_gpio_pin dc
Definition oled_ssd130x.h:78
SpiHandle::Config spi_config
Definition oled_ssd130x.h:75
void Defaults()
Definition oled_ssd130x.h:81
dsy_gpio_pin reset
Definition oled_ssd130x.h:79
struct daisy::SSD130x4WireSpiTransport::Config::@9 pin_config
Config()
Definition oled_ssd130x.h:70
Definition oled_ssd130x.h:249
Transport::Config transport_config
Definition oled_ssd130x.h:250
Definition oled_ssd130x.h:19
uint8_t i2c_address
Definition oled_ssd130x.h:26
void Defaults()
Definition oled_ssd130x.h:27
I2CHandle::Config i2c_config
Definition oled_ssd130x.h:25
Config()
Definition oled_ssd130x.h:20
Definition spi.h:23
ClockPolarity clock_polarity
Definition spi.h:100
Peripheral periph
Definition spi.h:96
struct daisy::SpiHandle::Config::@16 pin_config
Mode mode
Definition spi.h:97
dsy_gpio_pin nss
Definition spi.h:84
ClockPhase clock_phase
Definition spi.h:101
BaudPrescaler baud_prescaler
Definition spi.h:103
Direction direction
Definition spi.h:98
unsigned long datasize
Definition spi.h:99
Definition daisy_core.h:205
Definition gpio.h:175
dsy_gpio_mode mode
Definition gpio.h:177
dsy_gpio_pin pin
Definition gpio.h:176