-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathu8g_com_stm32duino_st7920_hw_spi.cpp
114 lines (96 loc) · 3.08 KB
/
u8g_com_stm32duino_st7920_hw_spi.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*
u8g_com_stm32duino_st7920_hw_spi.cpp
communication interface for ST7920 4 wire SPI
*/
#if defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)
#include "u8g.h"
#include "SPI.h"
static SPISettings spiConfig;
static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT
static void u8g_stm32_st7920_hw_spi_shift_out(u8g_t *u8g, uint8_t val) U8G_NOINLINE;
static void u8g_stm32_st7920_hw_spi_shift_out(u8g_t *u8g, uint8_t val)
{
/* send data */
SPI.beginTransaction(spiConfig);
SPI.send(val);
SPI.endTransaction();
}
static void u8g_com_stm32_st7920_write_byte_hw_spi(u8g_t *u8g, uint8_t rs, uint8_t val) U8G_NOINLINE;
static void u8g_com_stm32_st7920_write_byte_hw_spi(u8g_t *u8g, uint8_t rs, uint8_t val)
{
uint8_t i;
if (rs == 0)
{
/* command */
u8g_stm32_st7920_hw_spi_shift_out(u8g, 0x0f8);
}
else if (rs == 1)
{
/* data */
u8g_stm32_st7920_hw_spi_shift_out(u8g, 0x0fa);
}
u8g_stm32_st7920_hw_spi_shift_out(u8g, val & 0x0f0);
u8g_stm32_st7920_hw_spi_shift_out(u8g, val << 4);
for (i = 0; i < 4; i++)
u8g_10MicroDelay();
}
uint8_t u8g_com_stm32duino_st7920_hw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr)
{
if (msgInitCount)
{
if (msg == U8G_COM_MSG_INIT)
msgInitCount--;
if (msgInitCount)
return -1;
}
switch(msg)
{
case U8G_COM_MSG_STOP:
break;
case U8G_COM_MSG_INIT:
u8g_SetPIOutput(u8g, U8G_PI_CS);
//u8g_SetPIOutput(u8g, U8G_PI_A0);
//u8g_SetPIOutput(u8g, U8G_PI_RESET);
u8g_SetPILevel(u8g, U8G_PI_CS, 0);
spiConfig = SPISettings(SPI_CLOCK_DIV128, MSBFIRST, SPI_MODE3, DATA_SIZE_8BIT); //modify for ST7920 display
SPI.begin();
u8g->pin_list[U8G_PI_A0_STATE] = 0; /* inital RS state: command mode */
break;
case U8G_COM_MSG_ADDRESS: /* define cmd (arg_val = 0) or data mode (arg_val = 1) */
u8g->pin_list[U8G_PI_A0_STATE] = arg_val;
//u8g_SetPILevel(u8g, U8G_PI_A0, arg_val);
break;
case U8G_COM_MSG_CHIP_SELECT: /* arg_val == 0 means HIGH level of U8G_PI_CS */
if ( arg_val == 0 ) {
/* disable */
u8g_SetPILevel(u8g, U8G_PI_CS, 0);
} else {
/* enable */
u8g_SetPILevel(u8g, U8G_PI_CS, 1); /* CS = 1 (high active) */
}
break;
case U8G_COM_MSG_RESET:
u8g_SetPILevel(u8g, U8G_PI_RESET, arg_val);
break;
case U8G_COM_MSG_WRITE_BYTE:
u8g_com_stm32_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], arg_val);
break;
case U8G_COM_MSG_WRITE_SEQ:
/*
SPI.beginTransaction(spiConfig);
SPI.send((uint8_t *)arg_ptr, arg_val);
SPI.endTransaction();
*/
register uint8_t *ptr = (uint8_t *)arg_ptr;
while (arg_val > 0)
{
u8g_com_stm32_st7920_write_byte_hw_spi(u8g, u8g->pin_list[U8G_PI_A0_STATE], u8g_pgm_read(ptr));
//u8g->pin_list[U8G_PI_A0_STATE] = 2;
ptr++;
arg_val--;
}
break;
}
return 1;
}
#endif // defined(STM32F1) || defined(STM32F1xx) || defined(STM32F4) || defined(STM32F4xx)