Przeglądaj źródła

Merge pull request #9009 from Bob-the-Kuhn/Due-RRDFG-power-up-garbage

[2.0.x] Due - fix power up garbage on RRDFG LCD
Bob-the-Kuhn 7 lat temu
rodzic
commit
016e46a3c0
No account linked to committer's email address

+ 11
- 9
Marlin/src/HAL/HAL_DUE/u8g_com_HAL_DUE_st7920_sw_spi.cpp Wyświetl plik

@@ -55,7 +55,7 @@
55 55
 
56 56
 */
57 57
 
58
-#ifdef __SAM3X8E__
58
+#ifdef ARDUINO_ARCH_SAM
59 59
 
60 60
 #include <U8glib.h>
61 61
 #include <Arduino.h>
@@ -106,10 +106,10 @@ static void spiSend_sw_DUE(uint8_t val) { // 800KHz
106 106
       MOSI_pPio->PIO_SODR = MOSI_dwMask;
107 107
     else
108 108
       MOSI_pPio->PIO_CODR = MOSI_dwMask;
109
-    val = val << 1;
110
-    __delay_4cycles(2);
109
+    __delay_4cycles(1);
111 110
     SCK_pPio->PIO_SODR = SCK_dwMask;
112
-    __delay_4cycles(22);
111
+    __delay_4cycles(19); // 16 dead, 17 garbage, 18/0 900kHz, 19/1 825k, 20/1 800k, 21/2 725KHz
112
+    val <<= 1;
113 113
     SCK_pPio->PIO_CODR = SCK_dwMask;
114 114
   }
115 115
 }
@@ -129,8 +129,8 @@ static void u8g_com_DUE_st7920_write_byte_sw_spi(uint8_t rs, uint8_t val) {
129 129
        /* data */
130 130
       spiSend_sw_DUE(0x0fa);
131 131
 
132
-    for( i = 0; i < 4; i++ )   // give the controller some time to process the data
133
-      u8g_10MicroDelay();      // 2 is bad, 3 is OK, 4 is safe
132
+    for (i = 0; i < 4; i++)   // give the controller some time to process the data
133
+      u8g_10MicroDelay();     // 2 is bad, 3 is OK, 4 is safe
134 134
   }
135 135
 
136 136
   spiSend_sw_DUE(val & 0x0f0);
@@ -151,9 +151,13 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
151 151
       u8g_SetPILevel_DUE(u8g, U8G_PI_SCK, 0);
152 152
       u8g_SetPIOutput_DUE(u8g, U8G_PI_SCK);
153 153
       u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 0);
154
-      u8g_SetPILevel_DUE(u8g, U8G_PI_MOSI, 1);
155 154
       u8g_SetPIOutput_DUE(u8g, U8G_PI_MOSI);
155
+      
156
+      SCK_pPio->PIO_CODR = SCK_dwMask;   //SCK low - needed at power up but not after reset
157
+      MOSI_pPio->PIO_CODR = MOSI_dwMask; //MOSI low - needed at power up but not after reset
158
+      
156 159
       u8g_Delay(5);
160
+
157 161
       u8g->pin_list[U8G_PI_A0_STATE] = 0;       /* inital RS state: command mode */
158 162
       break;
159 163
 
@@ -199,6 +203,4 @@ uint8_t u8g_com_HAL_DUE_ST7920_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_va
199 203
   return 1;
200 204
 }
201 205
 
202
-#pragma GCC reset_options
203
-
204 206
 #endif  //ARDUINO_ARCH_SAM

+ 23
- 0
Marlin/src/lcd/dogm/u8g_dev_st7920_128x64_HAL.cpp Wyświetl plik

@@ -89,6 +89,27 @@ static const uint8_t u8g_dev_st7920_128x64_HAL_init_seq[] PROGMEM = {
89 89
   U8G_ESC_END                /* end of sequence */
90 90
 };
91 91
 
92
+void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev){
93
+  u8g_SetChipSelect(u8g, dev, 1);
94
+  u8g_Delay(1);
95
+  u8g_SetAddress(u8g, dev, 0);         // cmd mode
96
+  u8g_WriteByte(u8g, dev, 0x08);       //display off, cursor+blink off
97
+  u8g_WriteByte(u8g, dev, 0x3E);       //extended mode + GDRAM active
98
+  for (uint8_t y = 0; y < (HEIGHT) / 2; y++) { //clear GDRAM
99
+    u8g_WriteByte(u8g, dev, 0x80 | y); //set y
100
+    u8g_WriteByte(u8g, dev, 0x80);     //set x = 0
101
+    u8g_SetAddress(u8g, dev, 1);                  /* data mode */
102
+    for (uint8_t i = 0; i < 2 * (WIDTH) / 8; i++) //2x width clears both segments
103
+      u8g_WriteByte(u8g, dev, 0);
104
+    u8g_SetAddress(u8g, dev, 0);           /* cmd mode */
105
+  }
106
+
107
+  u8g_WriteByte(u8g, dev, 0x0C); //display on, cursor+blink off
108
+
109
+  u8g_SetChipSelect(u8g, dev, 0);
110
+
111
+}
112
+
92 113
 uint8_t u8g_dev_st7920_128x64_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg)
93 114
 {
94 115
   switch(msg)
@@ -96,6 +117,7 @@ uint8_t u8g_dev_st7920_128x64_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo
96 117
     case U8G_DEV_MSG_INIT:
97 118
       u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS);
98 119
       u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_HAL_init_seq);
120
+      clear_graphics_DRAM(u8g, dev);
99 121
       break;
100 122
     case U8G_DEV_MSG_STOP:
101 123
       break;
@@ -143,6 +165,7 @@ uint8_t u8g_dev_st7920_128x64_HAL_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg,
143 165
     case U8G_DEV_MSG_INIT:
144 166
       u8g_InitCom(u8g, dev, U8G_SPI_CLK_CYCLE_400NS);
145 167
       u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7920_128x64_HAL_init_seq);
168
+      clear_graphics_DRAM(u8g, dev);
146 169
       break;
147 170
 
148 171
     case U8G_DEV_MSG_STOP:

Ładowanie…
Anuluj
Zapisz