Просмотр исходного кода

Работа с LCD spi_bridge

unknown 3 часов назад
Родитель
Сommit
b89adc9c55

+ 27 - 49
desk/libs/thirdparty/oled_ssd1327/OLED_SSD1327.c

@@ -9,10 +9,9 @@
  */
 
 #include "main.h"
-
 #include "OLED_SSD1327.h"
-
 #include "string.h"
+#include "oled_common.h"   
 
 #ifdef SSD1327_I2C_CONTROL
 I2C_HandleTypeDef *ssd1337_i2c;
@@ -25,6 +24,8 @@ uint8_t buffer[SSD1327_BUFFERSIZE];
 
 void SSD1327_Command(uint8_t com)
 {
+    //oled_command(com);
+#if 0  
 #ifdef SSD1327_I2C_CONTROL
 	// I2C
 	HAL_I2C_Mem_Write(ssd1337_i2c, SSD1327_I2C_ADDRESS, 0x00, 1, &com, sizeof(com), 100);
@@ -40,10 +41,13 @@ void SSD1327_Command(uint8_t com)
 	HAL_GPIO_WritePin(SSD1327_CS_GPIO_Port, SSD1327_CS_Pin, GPIO_PIN_SET);
 #endif
 #endif
+#endif    
 }
 
 void SSD1327_Data(uint8_t dat)
 {
+    //oled_data(dat);
+#if 0  
 #ifdef SSD1327_I2C_CONTROL
 	// I2C
 	HAL_I2C_Mem_Write(ssd1337_i2c, SSD1327_I2C_ADDRESS, 0x40, 1, &dat, sizeof(dat), 100);
@@ -59,14 +63,18 @@ void SSD1327_Data(uint8_t dat)
 	HAL_GPIO_WritePin(SSD1327_CS_GPIO_Port, SSD1327_CS_Pin, GPIO_PIN_SET);
 #endif
 #endif
+#endif    
 }
 
 #if defined(SSD1327_SPI_CONTROL) || defined(SSD1327_RESET_USE)
 void SSD1327_Reset(void)
 {
+    //oled_reset();
+#if 0  
 	HAL_GPIO_WritePin(SSD1327_RESET_GPIO_Port, SSD1327_RESET_Pin, GPIO_PIN_RESET);
 	HAL_Delay(5);
 	HAL_GPIO_WritePin(SSD1327_RESET_GPIO_Port, SSD1327_RESET_Pin, GPIO_PIN_SET);
+#endif    
 }
 #endif
 
@@ -75,11 +83,12 @@ void SSD1327_Reset(void)
 //
 void SSD1327_InvertColors(uint8_t Invert)
 {
-	SSD1327_Command(Invert ? SSD1327_INVERTDISPLAY : SSD1327_NORMALDISPLAY);
+	//SSD1327_Command(Invert ? SSD1327_INVERTDISPLAY : SSD1327_NORMALDISPLAY);
 }
 
 void SSD1327_RotateDisplay(uint8_t Rotate)
 {
+#if 0  
 	if(Rotate > 1) Rotate = 1;
 
 	SSD1327_Command(0xA0 | (0x01 & Rotate));  // Set Segment Re-Map Default
@@ -89,17 +98,20 @@ void SSD1327_RotateDisplay(uint8_t Rotate)
 	SSD1327_Command(0xC0 | (0x08 & (Rotate<<3)));  // Set COM Output Scan Direction
 							// 0xC0	(0x00) => normal mode (RESET) Scan from COM0 to COM[N-1];Where N is the Multiplex ratio.
 							// 0xC8	(0xC8) => remapped mode. Scan from COM[N-1] to COM0;;Where N is the Multiplex ratio.
+#endif    
 }
 
 void SSD1327_DisplayON(uint8_t On)
 {
-	SSD1327_Command(On ? SSD1327_DISPLAYON : SSD1327_DISPLAYOFF);
+	//SSD1327_Command(On ? SSD1327_DISPLAYON : SSD1327_DISPLAYOFF);
 }
 
 void SSD1327_SetContrast(uint8_t Contrast)
 {
+#if 0  
 	SSD1327_Command(SSD1327_SETCONTRASTCURRENT);	// Set Contrast Control
 	SSD1327_Command(Contrast);
+#endif
 }
 
 #if GRAPHIC_ACCELERATION_COMMANDS == 1
@@ -108,27 +120,31 @@ void SSD1327_SetContrast(uint8_t Contrast)
 //
 void SSD1327_StartScrollRight(uint8_t StartPage, uint8_t EndPage, uint8_t Speed)
 {
+#if 0  
 	SSD1327_Command(SSD1327_RIGHT_HORIZONTAL_SCROLL);
 	SSD1327_Command(0x00);
 	SSD1327_Command(StartPage);
 	SSD1327_Command(Speed);
 	SSD1327_Command(EndPage);
 	SSD1327_Command(SSD1327_ACTIVATE_SCROLL);
+#endif
 }
 
 void SSD1327_StartScrollLeft(uint8_t StartPage, uint8_t EndPage, uint8_t Speed)
 {
+#if 0  
 	SSD1327_Command(SSD1327_LEFT_HORIZONTAL_SCROLL);
 	SSD1327_Command(0x00);
 	SSD1327_Command(StartPage);
 	SSD1327_Command(Speed);
 	SSD1327_Command(EndPage);
 	SSD1327_Command(SSD1327_ACTIVATE_SCROLL);
+#endif
 }
 
 void SSD1327_StopScroll(void)
 {
-	SSD1327_Command(SSD1327_DEACTIVATE_SCROLL);
+	//SSD1327_Command(SSD1327_DEACTIVATE_SCROLL);
 }
 #endif
 
@@ -137,7 +153,7 @@ void SSD1327_StopScroll(void)
 //
 void SSD1327_Init(void)
 {
-#if 1
+#if 0
     SSD1327_Command(SSD1327_DISPLAYOFF);  // Display Off
     
     SSD1327_Command(SSD1327_SETCOLUMNADDRESS);
@@ -310,49 +326,7 @@ void SSD1327_Clear(uint8_t Color)
 //
 void SSD1327_Display(void)
 {
-	SSD1327_Command(SSD1327_SETCOLUMNADDRESS);
-	SSD1327_Command(0x00);
-	//SSD1327_Command(0x3F);
-    //SSD1327_Command(0x7F);
-    SSD1327_Command(0x3F);
-
-	SSD1327_Command(SSD1327_SETROWADDRESS);
-	SSD1327_Command(0x00);
-	//SSD1327_Command(0x5F);
-    //SSD1327_Command(0x7F);
-    SSD1327_Command(0x7F);
-
-#ifdef SSD1327_I2C_CONTROL
-#ifdef SSD1327_I2C_DMA_ENABLE
-	if(ssd1337_i2c->hdmatx->State == HAL_DMA_STATE_READY)
-	{
-		HAL_I2C_Mem_Write_DMA(ssd1337_i2c, SSD1327_I2C_ADDRESS, 0x40, 1, (uint8_t*)&buffer, SSD1327_BUFFERSIZE);
-	}
-#else
-	HAL_I2C_Mem_Write(ssd1337_i2c, SSD1327_I2C_ADDRESS, 0x40, 1, (uint8_t*)&buffer, SSD1327_BUFFERSIZE, 1000);
-#endif
-#endif
-#ifdef SSD1327_SPI_CONTROL
-#ifdef SSD1327_SPI_DMA_ENABLE
-	HAL_GPIO_WritePin(SSD1327_DC_GPIO_Port, SSD1327_DC_Pin, GPIO_PIN_SET);
-#ifndef SPI_CS_HARDWARE_CONTROL
-	HAL_GPIO_WritePin(SSD1327_CS_GPIO_Port, SSD1327_CS_Pin, GPIO_PIN_RESET);
-#endif
-	if(ssd1337_spi->hdmatx->State == HAL_DMA_STATE_READY)
-	{
-		HAL_SPI_Transmit_DMA(ssd1337_spi, (uint8_t*)&buffer, SSD1327_BUFFERSIZE);
-	}
-#else
-	HAL_GPIO_WritePin(SSD1327_DC_GPIO_Port, SSD1327_DC_Pin, GPIO_PIN_SET);
-#ifndef SPI_CS_HARDWARE_CONTROL
-	HAL_GPIO_WritePin(SSD1327_CS_GPIO_Port, SSD1327_CS_Pin, GPIO_PIN_RESET);
-#endif
-	HAL_SPI_Transmit(ssd1337_spi, (uint8_t*)&buffer, SSD1327_BUFFERSIZE, 100);
-#ifndef SPI_CS_HARDWARE_CONTROL
-	HAL_GPIO_WritePin(SSD1327_CS_GPIO_Port, SSD1327_CS_Pin, GPIO_PIN_SET);
-#endif
-#endif
-#endif
+    //oled_display();
 }
 
 //
@@ -360,6 +334,9 @@ void SSD1327_Display(void)
 //
 void SSD1327_Bitmap(uint8_t *bitmap)
 {
+    //oled_bitmap(bitmap);
+    
+#if 0  
 	SSD1327_Command(0x22);
 	SSD1327_Command(0x00);
 	SSD1327_Command(0x07);
@@ -394,6 +371,7 @@ void SSD1327_Bitmap(uint8_t *bitmap)
 #endif
 #endif
 #endif
+#endif    
 }
 
 #if defined(SSD1327_SPI_CONTROL) && !defined(SSD1327_SPI_DMA_ENABLE) && !defined(SPI_CS_HARDWARE_CONTROL)

+ 7 - 2
desk/libs/thirdparty/oled_ssd1327/OLED_SSD1327.h

@@ -20,8 +20,8 @@
  *    Please set only one interface. It won't work with both one time.
  *
  */
-//#define SSD1327_SPI_CONTROL
-#define SSD1327_I2C_CONTROL
+#define SSD1327_SPI_CONTROL
+//#define SSD1327_I2C_CONTROL
 
 #ifdef SSD1327_I2C_CONTROL
 //#define SSD1327_I2C_DMA_ENABLE
@@ -128,6 +128,11 @@ typedef enum
 #ifdef SSD1327_I2C_CONTROL
 void SSD1327_I2cInit(I2C_HandleTypeDef *i2c);
 #endif
+
+#if defined(SSD1327_SPI_CONTROL)
+void SSD1327_SpiInit(SPI_HandleTypeDef *spi);
+#endif
+
 #if defined(SSD1327_SPI_CONTROL) && !defined(SSD1327_SPI_DMA_ENABLE)
 void SSD1327_DmaEndCallback(SPI_HandleTypeDef *hspi);
 #endif

+ 0 - 6
desk/modules/configs/config.h

@@ -57,10 +57,4 @@
 // Коэффициент 2, нижний порог
 #define FACTOR_2_DOWN_THR   1950
 
-// Интерфейс экрана
-#define I2C_BRIDGE
-
-// Интерфейс экрана
-//#define SPI_BRIDGE
-
 #endif /* #ifndef __CONFIG_H */

+ 1 - 0
desk/modules/ssd_1327/i2c_bridge.cpp

@@ -1,4 +1,5 @@
 #include "i2c_bridge.h"
+#include "oled_config.h"
 
 
 I2C_HandleTypeDef hi2c2;

+ 314 - 72
desk/modules/ssd_1327/oled_common.cpp

@@ -1,45 +1,51 @@
 #include "stm32g4xx_hal.h"
 #include "oled_common.h"
+#include "oled_config.h"
 #include "config.h"
 #include "i2c_bridge.h"
 #include "spi_bridge.h"
 #include "logo_grayscale.h"
 #include "fonts.h"
 #include "SSD1327.h"
+#include "cmsis_os.h"
+#include <string.h>
 
 extern "C" {
 #include "OLED_SSD1327.h"
 #include "GFX_SSD1327.h"
 }
   
-#ifdef I2C_BRIDGE
+#if defined(I2C_BRIDGE)
 I2C_HandleTypeDef *i2c_bridge;
-#elif SPI_BRIDGE
+#elif defined(SPI_BRIDGE)
 SPI_HandleTypeDef *spi_bridge;
-//DMA_HandleTypeDef hdma_spi_bridge;
 #endif
 
+  
+uint8_t oled_buf[OLED_BUF_SIZE];
+
 
 //
 void init_oled(void)
 {
     init_gpio_oled();
     
-#ifdef I2C_BRIDGE
+    oled_reset();
+    
+#if defined(I2C_BRIDGE)
     i2c_bridge_init();
     i2c_bridge = i2c_get_bridge();
     SSD1327_I2cInit(i2c_bridge);
     
-#elif SPI_BRIDGE
+#elif defined(SPI_BRIDGE)
     spi_bridge_init();
-
+    spi_bridge = spi_get_bridge();
+    SSD1327_SpiInit(spi_bridge);
 #endif
     
-    //return;
+    oled_clear(BLACK);
     
     
-    SSD1327_Clear(BLACK);
-    
 #if 0    
     ssd1327.clearBuffer();
     ssd1327.drawString(16, 16, (char*)"Hello", 0xF, 32);
@@ -48,85 +54,300 @@ void init_oled(void)
 #endif
     
 #if 0    
-    SSD1327_DrawPixel(20, 20, 15);
-    SSD1327_DrawPixel(21, 20, 15);
-    SSD1327_DrawPixel(22, 20, 15);
+    oled_draw_pixel(20, 20, 15);
+    oled_draw_pixel(21, 20, 15);
+    oled_draw_pixel(22, 20, 15);
     
-    SSD1327_DrawPixel(20, 21, 15);
-    SSD1327_DrawPixel(21, 21, 15);
-    SSD1327_DrawPixel(22, 21, 15);
+    oled_draw_pixel(20, 21, 15);
+    oled_draw_pixel(21, 21, 15);
+    oled_draw_pixel(22, 21, 15);
     
-    SSD1327_DrawPixel(20, 22, 15);
-    SSD1327_DrawPixel(21, 22, 15);
-    SSD1327_DrawPixel(22, 22, 15);
+    oled_draw_pixel(20, 22, 15);
+    oled_draw_pixel(21, 22, 15);
+    oled_draw_pixel(22, 22, 15);
     
-    SSD1327_DrawPixel(20, 23, 15);
-    SSD1327_DrawPixel(21, 23, 15);
-    SSD1327_DrawPixel(22, 23, 15);
+    oled_draw_pixel(20, 23, 15);
+    oled_draw_pixel(21, 23, 15);
+    oled_draw_pixel(22, 23, 15);
 #endif    
     
     //GFX_Image(15, 0, (uint8_t*)logo_grayscale, 96, 96);
             
-    SSD1327_Display();
-    
+    oled_display();
+
+}
+
+//
+void init_gpio_oled(void)
+{
+    GPIO_InitTypeDef GPIO_InitStruct = {0};
+        
+    __HAL_RCC_GPIOA_CLK_ENABLE();
+
+    // GPIOA_5 - reset
+    GPIO_InitStruct.Pin = OLED_RST_PIN;
+    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+    HAL_GPIO_Init(OLED_RST_PORT, &GPIO_InitStruct);
     
+    // GPIOA_6 - DC
+    GPIO_InitStruct.Pin = OLED_DC_PIN;
+    HAL_GPIO_Init(OLED_DC_PORT, &GPIO_InitStruct);
     
-    //while (1) {} 
+    // GPIOA_7 - CS
+    GPIO_InitStruct.Pin = OLED_CS_PIN;
+    HAL_GPIO_Init(OLED_CS_PORT, &GPIO_InitStruct);
+        
+    HAL_GPIO_WritePin(OLED_RST_PORT, OLED_RST_PIN, GPIO_PIN_RESET);
+    HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_RESET);
+    HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET);
 }
 
 //
-void test_oled(void)
+void oled_reset(void)
 {
-#if 0  
-    for (int i = 0; i < 16; i++) {
-        SSD1327_DrawPixel(10, 20 + i, i);
-    }
+    OLED_RST_1;
+    oled_delay_ms(100);
+    OLED_RST_0;
+    oled_delay_ms(100);
+    OLED_RST_1;
+    oled_delay_ms(100);
+}
+
+//
+void oled_delay_ms(uint32_t ms)
+{
+    osDelay(ms);
+}
+
+// TODO убрать sizeof
+void oled_command(uint8_t com)
+{
+#ifdef I2C_BRIDGE  
+    HAL_I2C_Mem_Write(i2c_bridge, OLED_I2C_ADDR, 0x00, 1, &com, sizeof(com), 100);
+#endif  
   
-    SSD1327_DrawPixel(20, 20, 15);
-    SSD1327_DrawPixel(30, 20, 15);
-    SSD1327_DrawPixel(40, 20, 5);
+#ifdef SPI_BRIDGE
+    OLED_DC_0;
+    OLED_CS_0;
+    HAL_SPI_Transmit(spi_bridge, &com, 1, 10);
+    OLED_CS_1;
+#endif
+}
+
+// TODO убрать sizeof
+void oled_data(uint8_t dat)
+{
+#ifdef I2C_BRIDGE
+	HAL_I2C_Mem_Write(i2c_bridge, OLED_I2C_ADDR, 0x40, 1, &dat, sizeof(dat), 100);
+#endif
+    
+#ifdef SPI_BRIDGE
+    OLED_DC_1;
+    OLED_CS_0;
+    HAL_SPI_Transmit(spi_bridge, &dat, 1, 10);
+    OLED_CS_1;
+#endif
+}
+
+//
+void oled_display(void)
+{
+	oled_command(SSD1327_SETCOLUMNADDRESS);
+	oled_command(0x00);
+    oled_command(0x3F);
+
+	oled_command(SSD1327_SETROWADDRESS);
+	oled_command(0x00);
+    oled_command(0x7F);
+
+#ifdef I2C_BRIDGE
+    HAL_I2C_Mem_Write(i2c_bridge, OLED_I2C_ADDR, 0x40, 1, (uint8_t*)&oled_buf, OLED_BUF_SIZE, 1000);
+#endif
+    
+#ifdef SPI_BRIDGE
+    OLED_DC_1;
+    OLED_CS_0;
+    HAL_SPI_Transmit(spi_bridge, (uint8_t*)&oled_buf, OLED_BUF_SIZE, 100);
+    OLED_CS_1;
+#endif
+}
+
+//
+void oled_bitmap(uint8_t *bitmap)
+{
+	oled_command(0x22);
+	oled_command(0x00);
+	oled_command(0x07);
+    
+#ifdef I2C_BRIDGE
+    HAL_I2C_Mem_Write(i2c_bridge, OLED_I2C_ADDR, 0x40, 1, bitmap, (OLED_HEIGHT * OLED_WIDTH / 8), 100);
 #endif    
-    //void GFX_DrawLine(int x_start, int y_start, int x_end, int y_end, uint8_t color);
-    // Верхняя 
-    GFX_DrawLine(0, 0, 127, 0, 15);
     
-    // Левая
-    GFX_DrawLine(0, 0, 0, 127, 15);
+#ifdef SPI_BRIDGE
+    OLED_DC_1;
+    OLED_CS_0;
+    HAL_SPI_Transmit(spi_bridge, bitmap, (OLED_HEIGHT * OLED_WIDTH / 8), 100);
+    OLED_CS_1;
+#endif    
+}
+
+//
+void oled_invert_colors(uint8_t invert)
+{
+    oled_command(invert ? SSD1327_INVERTDISPLAY : SSD1327_NORMALDISPLAY);
+}
+
+//
+void oled_rotate_display(uint8_t rotate)
+{
+	if (rotate > 1) rotate = 1;
+
+	oled_command(0xA0 | (0x01 & rotate));  // Set Segment Re-Map Default
+						// 0xA0 (0x00) => column Address 0 mapped to 127
+                		// 0xA1 (0x01) => Column Address 127 mapped to 0
+
+	oled_command(0xC0 | (0x08 & (rotate<<3)));  // Set COM Output Scan Direction
+                        // 0xC0	(0x00) => normal mode (RESET) Scan from COM0 to COM[N-1];Where N is the Multiplex ratio.
+						// 0xC8	(0xC8) => remapped mode. Scan from COM[N-1] to COM0;;Where N is the Multiplex ratio.
+}
+
+//
+void oled_display_on(uint8_t on)
+{
+	oled_command(on ? SSD1327_DISPLAYON : SSD1327_DISPLAYOFF);
+}
+
+//
+void oled_set_contrast(uint8_t contrast)
+{
+	oled_command(SSD1327_SETCONTRASTCURRENT);	// Set Contrast Control
+	oled_command(contrast);
+}
+
+//
+void oled_start_scroll_right(uint8_t start_page, uint8_t end_page, uint8_t speed)
+{
+	oled_command(SSD1327_RIGHT_HORIZONTAL_SCROLL);
+	oled_command(0x00);
+	oled_command(start_page);
+	oled_command(speed);
+	oled_command(end_page);
+	oled_command(SSD1327_ACTIVATE_SCROLL);
+}
+
+//
+void oled_start_scroll_left(uint8_t start_page, uint8_t end_page, uint8_t speed)
+{
+	oled_command(SSD1327_LEFT_HORIZONTAL_SCROLL);
+	oled_command(0x00);
+	oled_command(start_page);
+	oled_command(speed);
+	oled_command(end_page);
+	oled_command(SSD1327_ACTIVATE_SCROLL);
+}
+
+//
+void oled_stop_scroll(void)
+{
+	oled_command(SSD1327_DEACTIVATE_SCROLL);
+}
+
+void oled_init(void)
+{
+    oled_command(SSD1327_DISPLAYOFF);  // Display Off
     
-    // Правая
-    GFX_DrawLine(127, 0, 127, 127, 15);
+    oled_command(SSD1327_SETCOLUMNADDRESS);
+	oled_command(0x00);
+    oled_command(0x7F);
+
+	oled_command(SSD1327_SETROWADDRESS);
+	oled_command(0x00);
+	oled_command(0x7F);
     
-    // Нижняя 
-    GFX_DrawLine(0, 127, 127, 127, 15);
+    oled_set_contrast(0x7F);
     
-    GFX_SetFont(font_8x5);
+    oled_command(SSD1327_SEGREMAP);
+	oled_command(0x51);
     
-    GFX_SetFontSize(1);
-    GFX_DrawString(4, 10, (char*)"BbAa12345", 15, 0);
+    oled_command(SSD1327_SETDISPLAYSTARTLINE);
+	oled_command(0x00);
     
-    GFX_SetFontSize(2);
-    GFX_DrawString(4, 30, (char*)"BbAa12345", 15, 0);
+    oled_command(SSD1327_SETDISPLAYOFFSET);
+    oled_command(0x0);
     
-    GFX_SetFontSize(3);
-    GFX_DrawString(4, 60, (char*)"BbAa12345", 15, 0);
+    oled_command(SSD1327_DISPLAYALLON_RESUME);  // Entire Display ON
+    oled_command(SSD1327_SETMULTIPLEX);
+	oled_command(0x7F);
     
-    //GFX_DrawChar(50, 50, 'F', 15, 0);
-    //GFX_DrawString(10, 100, "Hello!!!", 15, 0);
+    oled_command(SSD1327_SETPHASELENGTH);
+	oled_command(0xF1);  // !
     
+    oled_command(SSD1327_SETFRONTCLOCKDIVIDER_OSCILLATORFREQUENCY);
+	oled_command(0x00);
     
-#if 0    
-    uint8_t GFX_GetFontHeight(void);
-    uint8_t GFX_GetFontWidth(void);
-    uint8_t  GFX_GetFontSize(void);
-    void GFX_DrawChar(int x, int y, char chr, uint8_t color, uint8_t background);
-    void GFX_DrawString(int x, int y, char* str, uint8_t color, uint8_t background);
-#endif    
-
-    SSD1327_Display();
+    oled_command(SSD1327_FUNCTIONSELECTIONA); // !
+	oled_command(0x01); // !
+    
+    oled_command(SSD1327_SETSECONDPRECHARGEPERTIOD);
+	oled_command(0x0F); // !
+    
+    oled_command(SSD1327_SETSETVCOMVOLTAGE);
+	oled_command(0x0F); // !
+    
+    oled_command(SSD1327_SETPRECHARGEVOLTAGE);
+	oled_command(0x08); // !
+    
+    oled_command(SSD1327_FUNCTIONSELECTIONB);
+	oled_command(0x62);
+    
+    oled_command(SSD1327_SETCOMMANDLOCK); // !
+	oled_command(0x12);  // !
     
+    oled_display_on(1);
 }
 
-// oled_draw_rec(3, 5, 123, 22, 15);
+//
+void oled_draw_pixel(int16_t x, int16_t y, uint8_t color)
+{
+	 if ((x < 0) || (x >= SSD1327_LCDWIDTH) || (y < 0) || (y >= SSD1327_LCDHEIGHT))
+		 return;
+
+	 uint8_t SelectedCell = oled_buf[x/2 + y*(SSD1327_LCDWIDTH/2)];
+
+	 if(x % 2)
+	 {
+		 SelectedCell &= ~(0x0F);
+		 SelectedCell |= (0x0F & color);
+	 }
+	 else
+	 {
+		 SelectedCell &= ~(0xF0);
+		 SelectedCell |= (0xF0 & (color<<4));
+	 }
+
+	 oled_buf[x/2 + y*(SSD1327_LCDWIDTH/2)] = SelectedCell;
+}
+
+//
+void oled_clear(uint8_t color)
+{
+    if(color > WHITE) color = WHITE;
+	memset(oled_buf, (color << 4 | color), OLED_BUF_SIZE);
+}
+
+
+
+
+
+
+
+
+
+// ------------------------------------------------------------------------------- //
+
+//
 void oled_draw_rec(int x_start, int y_start, int x_end, int y_end, uint8_t color)
 {
     for (int i = 0; i < y_end; i++) {
@@ -161,20 +382,41 @@ void oled_draw_string_frame(uint8_t str_num)
     GFX_DrawLine(STR_X_S, str_num*STR_H + STR_Y_S, STR_X_S, str_num*STR_H + STR_Y_S - STR_H, 15);
 }
 
-
 //
-void init_gpio_oled(void)
+void test_oled(void)
 {
-    GPIO_InitTypeDef GPIO_InitStruct = {0};
-        
-    __HAL_RCC_GPIOA_CLK_ENABLE();
+#if 0  
+    for (int i = 0; i < 16; i++) {
+        SSD1327_DrawPixel(10, 20 + i, i);
+    }
+  
+    SSD1327_DrawPixel(20, 20, 15);
+    SSD1327_DrawPixel(30, 20, 15);
+    SSD1327_DrawPixel(40, 20, 5);
+#endif    
+    //void GFX_DrawLine(int x_start, int y_start, int x_end, int y_end, uint8_t color);
+    // Верхняя 
+    GFX_DrawLine(0, 0, 127, 0, 15);
     
-    GPIO_InitStruct.Pin = GPIO_PIN_5;
-    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
-    GPIO_InitStruct.Pull = GPIO_NOPULL;
-    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    // Левая
+    GFX_DrawLine(0, 0, 0, 127, 15);
     
-    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
-}
-
+    // Правая
+    GFX_DrawLine(127, 0, 127, 127, 15);
+    
+    // Нижняя 
+    GFX_DrawLine(0, 127, 127, 127, 15);
+    
+    GFX_SetFont(font_8x5);
+    
+    GFX_SetFontSize(1);
+    GFX_DrawString(4, 10, (char*)"BbAa12345", 15, 0);
+    
+    GFX_SetFontSize(2);
+    GFX_DrawString(4, 30, (char*)"BbAa12345", 15, 0);
+    
+    GFX_SetFontSize(3);
+    GFX_DrawString(4, 60, (char*)"BbAa12345", 15, 0);
 
+    SSD1327_Display();
+}

+ 50 - 3
desk/modules/ssd_1327/oled_common.h

@@ -6,15 +6,62 @@
 void init_oled(void);
 
 //
-void test_oled(void);
+void init_gpio_oled(void);
 
 //
-void oled_draw_rec(int x_start, int y_start, int x_end, int y_end, uint8_t color);
+void oled_reset(void);
 
 //
-void init_gpio_oled(void);
+void oled_delay_ms(uint32_t ms);
+
+//
+void oled_command(uint8_t com);
+
+//
+void oled_data(uint8_t dat);
+
+//
+void oled_display(void);
+
+//
+void oled_bitmap(uint8_t *bitmap);
+
+//
+void oled_invert_colors(uint8_t invert);
+
+//
+void oled_rotate_display(uint8_t rotate);
+
+//
+void oled_display_on(uint8_t on);
+
+//
+void oled_set_contrast(uint8_t contrast);
+
+//
+void oled_start_scroll_right(uint8_t start_page, uint8_t end_page, uint8_t speed);
+
+//
+void oled_start_scroll_left(uint8_t start_page, uint8_t end_page, uint8_t speed);
+
+//
+void oled_stop_scroll(void);
+
+//
+void oled_draw_pixel(int16_t x, int16_t y, uint8_t color);
+
+//
+void oled_clear(uint8_t color);
+
+// ------------------------------------------------------------------------------- //
 
 //
 void oled_draw_string_frame(uint8_t str_num);
 
+//
+void oled_draw_rec(int x_start, int y_start, int x_end, int y_end, uint8_t color);
+
+//
+void test_oled(void);
+
 #endif // __OLED_COMMON_H

+ 54 - 0
desk/modules/ssd_1327/oled_config.h

@@ -0,0 +1,54 @@
+#ifndef __OLED_CONFIG_H
+#define __OLED_CONFIG_H
+
+// Интерфейс экрана
+//#define I2C_BRIDGE
+
+// Интерфейс экрана
+#define SPI_BRIDGE
+
+
+#define OLED_RST_PIN    GPIO_PIN_5
+#define OLED_RST_PORT   GPIOA
+
+#define OLED_DC_PIN     GPIO_PIN_6
+#define OLED_DC_PORT    GPIOA
+
+#define OLED_CS_PIN     GPIO_PIN_7
+#define OLED_CS_PORT    GPIOA
+
+#define OLED_RST_0      HAL_GPIO_WritePin(OLED_RST_PORT, OLED_RST_PIN, GPIO_PIN_RESET)
+#define OLED_RST_1      HAL_GPIO_WritePin(OLED_RST_PORT, OLED_RST_PIN, GPIO_PIN_SET)
+
+#define OLED_DC_0       HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_RESET)
+#define OLED_DC_1       HAL_GPIO_WritePin(OLED_DC_PORT, OLED_DC_PIN, GPIO_PIN_SET)
+
+#define OLED_CS_0       HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_RESET)
+#define OLED_CS_1       HAL_GPIO_WritePin(OLED_CS_PORT, OLED_CS_PIN, GPIO_PIN_SET)
+
+// SPI settings
+#define OLED_SPI_SCK_PORT   GPIOB
+#define OLED_SPI_SCK_PIN    GPIO_PIN_13
+#define OLED_SPI_SCK_AF     GPIO_AF5_SPI2
+
+#define OLED_SPI_CS_PORT    GPIOB
+#define OLED_SPI_CS_PIN     GPIO_PIN_12
+
+#define OLED_SPI_MOSI_PORT  GPIOB
+#define OLED_SPI_MOSI_PIN   GPIO_PIN_15
+#define OLED_SPI_MOSI_AF    GPIO_AF5_SPI2
+
+#define OLED_SPI_MISO_PORT  GPIOB
+#define OLED_SPI_MISO_PIN   GPIO_PIN_14
+#define OLED_SPI_MISO_AF    GPIO_AF5_SPI2
+
+
+// OLED settings
+#define OLED_I2C_ADDR       0x7A
+
+#define OLED_HEIGHT         128
+#define OLED_WIDTH          128
+#define OLED_BUF_SIZE       8192    // OLED_HEIGHT * OLED_WIDTH / 2
+
+
+#endif // __OLED_CONFIG_H

+ 65 - 69
desk/modules/ssd_1327/spi_bridge.cpp

@@ -1,90 +1,86 @@
 #include "spi_bridge.h"
+#include "oled_config.h"
 
 
 SPI_HandleTypeDef hspi2;
 
+
 //
 void spi_bridge_init(void)
 {
-
+    hspi2.Instance = SPI2;
+    hspi2.Init.Mode = SPI_MODE_MASTER;
+    hspi2.Init.Direction = SPI_DIRECTION_2LINES;
+    hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
+    hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
+    hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
+    hspi2.Init.NSS = SPI_NSS_SOFT;
+    hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
+    hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
+    hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
+    hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
+    hspi2.Init.CRCPolynomial = 10;
+    HAL_SPI_Init(&hspi2);
 }
 
-
 //
-#if 0
-I2C_HandleTypeDef *i2c_get_bridge(void)
+SPI_HandleTypeDef *spi_get_bridge(void)
 {
-    return &hi2c2;
+    return &hspi2;
 }
-#endif
 
+//
 void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
 {
-  GPIO_InitTypeDef GPIO_InitStruct = {0};
+    GPIO_InitTypeDef GPIO_InitStruct = {0};
   
-  if(hspi->Instance==SPI2)
-  {
-    __HAL_RCC_SPI2_CLK_ENABLE();
-
-    __HAL_RCC_GPIOA_CLK_ENABLE();
-    __HAL_RCC_GPIOA_CLK_ENABLE();
-    /**SPI1 GPIO Configuration
-    PA4     ------> SPI1_NSS
-    PA5     ------> SPI1_SCK
-    PA7     ------> SPI1_MOSI
-    */
-    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;
-    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
-    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
-    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-  }
-#if 0    
-    /* SPI1 DMA Init */
-    /* SPI1_TX Init */
-    hdma_spi1_tx.Instance = DMA1_Channel3;
-    hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
-    hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
-    hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE;
-    hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
-    hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
-    hdma_spi1_tx.Init.Mode = DMA_NORMAL;
-    hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW;
-    if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK)
+    if (hspi->Instance == SPI2)
     {
-      Error_Handler();
-    }
-
-    __HAL_LINKDMA(hspi,hdmatx,hdma_spi1_tx);
-
-    /* SPI1 interrupt Init */
-    HAL_NVIC_SetPriority(SPI1_IRQn, 5, 0);
-    HAL_NVIC_EnableIRQ(SPI1_IRQn);
-  /* USER CODE BEGIN SPI1_MspInit 1 */
+        __HAL_RCC_SPI2_CLK_ENABLE();
+        __HAL_RCC_GPIOB_CLK_ENABLE();
 
-  /* USER CODE END SPI1_MspInit 1 */
-  }
-  else if(hspi->Instance==SPI2)
-  {
-  /* USER CODE BEGIN SPI2_MspInit 0 */
-
-  /* USER CODE END SPI2_MspInit 0 */
-    /* Peripheral clock enable */
-    __HAL_RCC_SPI2_CLK_ENABLE();
-
-    __HAL_RCC_GPIOB_CLK_ENABLE();
-    /**SPI2 GPIO Configuration
-    PB13     ------> SPI2_SCK
-    PB14     ------> SPI2_MISO
-    PB15     ------> SPI2_MOSI
-    */
-    GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
-    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
-    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
-    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+        // SPI SCK
+        GPIO_InitStruct.Pin = OLED_SPI_SCK_PIN;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_NOPULL;
+        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+        GPIO_InitStruct.Alternate = OLED_SPI_SCK_AF;
+        HAL_GPIO_Init(OLED_SPI_SCK_PORT, &GPIO_InitStruct);
+        
+        // SPI MOSI
+        GPIO_InitStruct.Pin = OLED_SPI_MOSI_PIN;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_PULLDOWN;
+        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+        GPIO_InitStruct.Alternate = OLED_SPI_MOSI_AF;
+        HAL_GPIO_Init(OLED_SPI_MOSI_PORT, &GPIO_InitStruct);
+        
+        // SPI MISO
+        GPIO_InitStruct.Pin = OLED_SPI_MISO_PIN;
+        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+        GPIO_InitStruct.Pull = GPIO_NOPULL;
+        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
+        GPIO_InitStruct.Alternate = OLED_SPI_MISO_AF;
+        HAL_GPIO_Init(OLED_SPI_MISO_PORT, &GPIO_InitStruct);
+        
+        // SPI CS
+        GPIO_InitStruct.Pin = OLED_SPI_CS_PIN;
+        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+        GPIO_InitStruct.Pull = GPIO_NOPULL;
+        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+        HAL_GPIO_Init(OLED_SPI_CS_PORT, &GPIO_InitStruct);
+    }
+}
 
-    GPIO_InitStruct.Pin = GPIO_PIN_14;
-    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
-    GPIO_InitStruct.Pull = GPIO_NOPULL;
-    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
-#endif    
+//
+void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
+{
+    if (spiHandle->Instance == SPI2)
+    {
+        __HAL_RCC_SPI2_CLK_DISABLE();
+        
+        HAL_GPIO_DeInit(OLED_SPI_SCK_PORT, OLED_SPI_SCK_PIN);
+        HAL_GPIO_DeInit(OLED_SPI_MISO_PORT, OLED_SPI_MISO_PIN);
+        HAL_GPIO_DeInit(OLED_SPI_MOSI_PORT, OLED_SPI_MOSI_PIN);
+    }
 }

+ 1 - 1
desk/modules/ssd_1327/spi_bridge.h

@@ -8,7 +8,7 @@
 void spi_bridge_init(void);
 
 //
-//I2C_HandleTypeDef* i2c_get_bridge(void);
+SPI_HandleTypeDef *spi_get_bridge(void);
 
 
 #endif // __SPI_BRIDGE_H

BIN
output/desk.bin


+ 3 - 0
project/ewarm/desk/desk.ewp

@@ -2537,6 +2537,9 @@
             <file>
                 <name>$PROJ_DIR$\..\..\..\desk\modules\ssd_1327\oled_common.cpp</name>
             </file>
+            <file>
+                <name>$PROJ_DIR$\..\..\..\desk\modules\ssd_1327\oled_config.h</name>
+            </file>
             <file>
                 <name>$PROJ_DIR$\..\..\..\desk\modules\ssd_1327\spi_bridge.cpp</name>
             </file>

+ 3 - 0
project/ewarm/desk/desk.ewt

@@ -3236,6 +3236,9 @@
             <file>
                 <name>$PROJ_DIR$\..\..\..\desk\modules\ssd_1327\oled_common.cpp</name>
             </file>
+            <file>
+                <name>$PROJ_DIR$\..\..\..\desk\modules\ssd_1327\oled_config.h</name>
+            </file>
             <file>
                 <name>$PROJ_DIR$\..\..\..\desk\modules\ssd_1327\spi_bridge.cpp</name>
             </file>

Разница между файлами не показана из-за своего большого размера
+ 2 - 1
project/ewarm/settings/tuber.wsdt


Некоторые файлы не были показаны из-за большого количества измененных файлов