From 8d74f7e9b3bf246dcc0d2f17fe8ecbbcee41f344 Mon Sep 17 00:00:00 2001 From: jmz52 Date: Sat, 18 Aug 2018 11:59:33 +0300 Subject: [PATCH 1/3] Add support for SSD1306 and SH1106 I2C displays for STM32F1 Add support for SSD1306 and SH1106 I2C displays for STM32F1 and STM32F4. --- src/clib/u8g.h | 8 ++ src/clib/u8g_com_arduino_common.c | 2 +- src/clib/u8g_com_arduino_fast_parallel.c | 2 +- src/clib/u8g_com_arduino_no_en_parallel.c | 2 +- src/clib/u8g_com_arduino_parallel.c | 2 +- src/clib/u8g_com_arduino_port_d_wr.c | 2 +- src/clib/u8g_com_arduino_st7920_custom.c | 2 +- src/clib/u8g_com_arduino_st7920_hw_spi.c | 2 +- src/clib/u8g_com_arduino_st7920_spi.c | 2 +- src/clib/u8g_com_arduino_std_sw_spi.c | 2 +- src/clib/u8g_com_arduino_sw_spi.c | 2 +- src/clib/u8g_com_arduino_t6963.c | 2 +- src/clib/u8g_com_stm32duino_ssd_i2c_fn.cpp | 94 ++++++++++++++++++++++ src/clib/u8g_delay.c | 2 +- src/clib/u8g_delay.cpp | 10 +++ src/clib/u8g_dev_ht1632.c | 2 +- 16 files changed, 125 insertions(+), 13 deletions(-) create mode 100644 src/clib/u8g_com_stm32duino_ssd_i2c_fn.cpp create mode 100644 src/clib/u8g_delay.cpp diff --git a/src/clib/u8g.h b/src/clib/u8g.h index 2a8f836..ce961df 100755 --- a/src/clib/u8g.h +++ b/src/clib/u8g.h @@ -693,6 +693,8 @@ uint8_t u8g_com_msp430_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void uint8_t u8g_com_raspberrypi_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_rasperrypi_hw_spi.c */ uint8_t u8g_com_raspberrypi_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_raspberrypi_ssd_i2c.c */ +uint8_t u8g_com_stm32duino_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr); /* u8g_com_stm32duino_ssd_i2c.cpp */ + /* Translation of system specific com drives to generic com names @@ -847,6 +849,12 @@ defined(__18CXX) || defined(__PIC32MX) #endif #endif +#ifndef U8G_COM_SSD_I2C +#if defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx) +#define U8G_COM_SSD_I2C u8g_com_stm32duino_ssd_i2c_fn +#endif +#endif + #ifndef U8G_COM_SSD_I2C #define U8G_COM_SSD_I2C u8g_com_null_fn #endif diff --git a/src/clib/u8g_com_arduino_common.c b/src/clib/u8g_com_arduino_common.c index ea503b6..1469956 100755 --- a/src/clib/u8g_com_arduino_common.c +++ b/src/clib/u8g_com_arduino_common.c @@ -38,7 +38,7 @@ #include "u8g.h" -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 #include diff --git a/src/clib/u8g_com_arduino_fast_parallel.c b/src/clib/u8g_com_arduino_fast_parallel.c index 03ef515..a418493 100755 --- a/src/clib/u8g_com_arduino_fast_parallel.c +++ b/src/clib/u8g_com_arduino_fast_parallel.c @@ -59,7 +59,7 @@ #include "u8g.h" -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 //#include diff --git a/src/clib/u8g_com_arduino_no_en_parallel.c b/src/clib/u8g_com_arduino_no_en_parallel.c index dcbbd7e..27e09f5 100755 --- a/src/clib/u8g_com_arduino_no_en_parallel.c +++ b/src/clib/u8g_com_arduino_no_en_parallel.c @@ -59,7 +59,7 @@ #include "u8g.h" -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 //#include diff --git a/src/clib/u8g_com_arduino_parallel.c b/src/clib/u8g_com_arduino_parallel.c index 8927416..6973892 100755 --- a/src/clib/u8g_com_arduino_parallel.c +++ b/src/clib/u8g_com_arduino_parallel.c @@ -55,7 +55,7 @@ #include "u8g.h" -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 #include diff --git a/src/clib/u8g_com_arduino_port_d_wr.c b/src/clib/u8g_com_arduino_port_d_wr.c index 924a9bb..6a05656 100755 --- a/src/clib/u8g_com_arduino_port_d_wr.c +++ b/src/clib/u8g_com_arduino_port_d_wr.c @@ -54,7 +54,7 @@ #include "u8g.h" -#if defined(ARDUINO) && defined(PORTD) +#if defined(ARDUINO) && defined(PORTD) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 #include diff --git a/src/clib/u8g_com_arduino_st7920_custom.c b/src/clib/u8g_com_arduino_st7920_custom.c index 99d0e78..f06f70c 100755 --- a/src/clib/u8g_com_arduino_st7920_custom.c +++ b/src/clib/u8g_com_arduino_st7920_custom.c @@ -47,7 +47,7 @@ #include "u8g.h" -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 #include diff --git a/src/clib/u8g_com_arduino_st7920_hw_spi.c b/src/clib/u8g_com_arduino_st7920_hw_spi.c index bdf8007..6a59328 100755 --- a/src/clib/u8g_com_arduino_st7920_hw_spi.c +++ b/src/clib/u8g_com_arduino_st7920_hw_spi.c @@ -37,7 +37,7 @@ #include "u8g.h" -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 #include diff --git a/src/clib/u8g_com_arduino_st7920_spi.c b/src/clib/u8g_com_arduino_st7920_spi.c index 1a257e8..d8685eb 100755 --- a/src/clib/u8g_com_arduino_st7920_spi.c +++ b/src/clib/u8g_com_arduino_st7920_spi.c @@ -44,7 +44,7 @@ #include "u8g.h" -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 #include diff --git a/src/clib/u8g_com_arduino_std_sw_spi.c b/src/clib/u8g_com_arduino_std_sw_spi.c index bea7ff0..1a62f1c 100755 --- a/src/clib/u8g_com_arduino_std_sw_spi.c +++ b/src/clib/u8g_com_arduino_std_sw_spi.c @@ -36,7 +36,7 @@ #include "u8g.h" -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 #include diff --git a/src/clib/u8g_com_arduino_sw_spi.c b/src/clib/u8g_com_arduino_sw_spi.c index 04652dd..50ce351 100755 --- a/src/clib/u8g_com_arduino_sw_spi.c +++ b/src/clib/u8g_com_arduino_sw_spi.c @@ -42,7 +42,7 @@ #include "u8g.h" -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 #include diff --git a/src/clib/u8g_com_arduino_t6963.c b/src/clib/u8g_com_arduino_t6963.c index 5f05109..6e5efdb 100755 --- a/src/clib/u8g_com_arduino_t6963.c +++ b/src/clib/u8g_com_arduino_t6963.c @@ -61,7 +61,7 @@ #include "u8g.h" -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 //#include diff --git a/src/clib/u8g_com_stm32duino_ssd_i2c_fn.cpp b/src/clib/u8g_com_stm32duino_ssd_i2c_fn.cpp new file mode 100644 index 0000000..0babbf1 --- /dev/null +++ b/src/clib/u8g_com_stm32duino_ssd_i2c_fn.cpp @@ -0,0 +1,94 @@ +/* + u8g_com_stm32duino_ssd_i2c_fn.cpp + + communication interface for SSDxxxx chip variant I2C protocol +*/ + +#if defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx) + +#include "u8g.h" +#include "Wire.h" + + +/* + BUFFER_LENGTH is defined in libraries\Wire\utility\WireBase.h + Default value is 32 + Increate this value to 144 to send U8G_COM_MSG_WRITE_SEQ in single block +*/ + +#if defined(BUFFER_LENGTH) && BUFFER_LENGTH < 144 +#define I2C_MAX_LENGTH (BUFFER_LENGTH - 1) +#endif // BUFFER_LENGTH + + +static uint8_t control = 255; + +uint8_t u8g_com_stm32duino_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) +{ + + if (control == 255) { + if (msg == U8G_COM_MSG_INIT) { + control = 254; + } + return 1; + } + if (control == 254) { + if (msg != U8G_COM_MSG_INIT) { + return 1; + } else { + control = 0; + } + } + + switch(msg) + { + case U8G_COM_MSG_INIT: + Wire.setClock(400000); + Wire.begin(); + break; + + case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */ + if (arg_val == 0) { + control = 0x00; + } else { + control = 0x40; + } + break; + + case U8G_COM_MSG_WRITE_BYTE: + Wire.beginTransmission(0x3c); + Wire.write(control); + Wire.write(arg_val); + Wire.endTransmission(); + break; + + case U8G_COM_MSG_WRITE_SEQ: + { +#ifdef I2C_MAX_LENGTH + while (arg_val > 0) { + Wire.beginTransmission(0x3c); + Wire.write(control); + if (arg_val <= I2C_MAX_LENGTH) { + Wire.write((uint8_t *) arg_ptr, arg_val); + arg_val = 0; + } else { + Wire.write((uint8_t *) arg_ptr, I2C_MAX_LENGTH); + arg_val -= I2C_MAX_LENGTH; + arg_ptr += I2C_MAX_LENGTH; + } + Wire.endTransmission(); + } +#else + Wire.beginTransmission(0x3c); + Wire.write(control); + Wire.write((uint8_t *) arg_ptr, arg_val); + Wire.endTransmission(); +#endif // I2C_MAX_LENGTH + break; + } + + } + return 1; +} + +#endif // defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx) diff --git a/src/clib/u8g_delay.c b/src/clib/u8g_delay.c index 3d44467..8fde38f 100755 --- a/src/clib/u8g_delay.c +++ b/src/clib/u8g_delay.c @@ -44,7 +44,7 @@ /*==== Part 1: Derive suitable delay procedure ====*/ -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) # if ARDUINO < 100 # include diff --git a/src/clib/u8g_delay.cpp b/src/clib/u8g_delay.cpp new file mode 100644 index 0000000..a53aefb --- /dev/null +++ b/src/clib/u8g_delay.cpp @@ -0,0 +1,10 @@ +#if defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx) + +#include "u8g.h" +#include "Arduino.h" + +void u8g_Delay(uint16_t val) { + delay(val); +} + +#endif // defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx) diff --git a/src/clib/u8g_dev_ht1632.c b/src/clib/u8g_dev_ht1632.c index ddec166..8a08b3a 100755 --- a/src/clib/u8g_dev_ht1632.c +++ b/src/clib/u8g_dev_ht1632.c @@ -93,7 +93,7 @@ mapping #define HT1632_DATA_LEN 8 // Data are 4*2 bits #define HT1632_ADDR_LEN 7 // Address are 7 bits -#if defined(ARDUINO) +#if defined(ARDUINO) && ! (defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)) #if ARDUINO < 100 #include From 1d273327c3cef2526cb353459bafeffaeb06f080 Mon Sep 17 00:00:00 2001 From: jmz52 Date: Sat, 18 Aug 2018 15:31:20 +0300 Subject: [PATCH 2/3] Code cleanup --- src/clib/u8g_com_stm32duino_ssd_i2c_fn.cpp | 55 ++++++++++------------ 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/src/clib/u8g_com_stm32duino_ssd_i2c_fn.cpp b/src/clib/u8g_com_stm32duino_ssd_i2c_fn.cpp index 0babbf1..70d4e20 100644 --- a/src/clib/u8g_com_stm32duino_ssd_i2c_fn.cpp +++ b/src/clib/u8g_com_stm32duino_ssd_i2c_fn.cpp @@ -21,23 +21,15 @@ #endif // BUFFER_LENGTH -static uint8_t control = 255; +static uint8_t control; +static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT + uint8_t u8g_com_stm32duino_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { - - if (control == 255) { - if (msg == U8G_COM_MSG_INIT) { - control = 254; - } - return 1; - } - if (control == 254) { - if (msg != U8G_COM_MSG_INIT) { - return 1; - } else { - control = 0; - } + if (msgInitCount) { + if (msg == U8G_COM_MSG_INIT) msgInitCount --; + if (msgInitCount) return -1; } switch(msg) @@ -64,26 +56,27 @@ uint8_t u8g_com_stm32duino_ssd_i2c_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, case U8G_COM_MSG_WRITE_SEQ: { -#ifdef I2C_MAX_LENGTH - while (arg_val > 0) { + #ifdef I2C_MAX_LENGTH + while (arg_val > 0) { + Wire.beginTransmission(0x3c); + Wire.write(control); + if (arg_val <= I2C_MAX_LENGTH) { + Wire.write((uint8_t *) arg_ptr, arg_val); + arg_val = 0; + } + else { + Wire.write((uint8_t *) arg_ptr, I2C_MAX_LENGTH); + arg_val -= I2C_MAX_LENGTH; + arg_ptr += I2C_MAX_LENGTH; + } + Wire.endTransmission(); + } + #else Wire.beginTransmission(0x3c); Wire.write(control); - if (arg_val <= I2C_MAX_LENGTH) { - Wire.write((uint8_t *) arg_ptr, arg_val); - arg_val = 0; - } else { - Wire.write((uint8_t *) arg_ptr, I2C_MAX_LENGTH); - arg_val -= I2C_MAX_LENGTH; - arg_ptr += I2C_MAX_LENGTH; - } + Wire.write((uint8_t *) arg_ptr, arg_val); Wire.endTransmission(); - } -#else - Wire.beginTransmission(0x3c); - Wire.write(control); - Wire.write((uint8_t *) arg_ptr, arg_val); - Wire.endTransmission(); -#endif // I2C_MAX_LENGTH + #endif // I2C_MAX_LENGTH break; } From 1e429cdbaeedfaac96c23c724f15f0111db7c590 Mon Sep 17 00:00:00 2001 From: jmz52 Date: Sun, 19 Aug 2018 21:23:08 +0300 Subject: [PATCH 3/3] Only use stm32duino code in stm32duino environment Only use stm32duino code in stm32duino environment --- src/clib/u8g_delay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clib/u8g_delay.cpp b/src/clib/u8g_delay.cpp index a53aefb..ac5950b 100644 --- a/src/clib/u8g_delay.cpp +++ b/src/clib/u8g_delay.cpp @@ -1,4 +1,4 @@ -#if defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx) +#if defined(ARDUINO) && defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx) #include "u8g.h" #include "Arduino.h" @@ -7,4 +7,4 @@ void u8g_Delay(uint16_t val) { delay(val); } -#endif // defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx) +#endif // defined(ARDUINO) && defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)