-
Notifications
You must be signed in to change notification settings - Fork 0
/
spi.c
106 lines (80 loc) · 2.83 KB
/
spi.c
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
//
// COMP-GENG 421 - Tom Lupfer
//
// SPI module
//
#include "main.h"
#include "spi.h"
// Software SPI interface signal definitions
#define SCK_CLR() (LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_5))
#define SCK_SET() (LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_5))
#define RST_DIS() (LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_6))
#define RST_ENA() (LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_6))
#define MOSI_CLR() (LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_7))
#define MOSI_SET() (LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_7))
#define CMD_ENA() (LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_8))
#define DAT_ENA() (LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_8))
#define CS_DIS() (LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_6))
#define CS_ENA() (LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_6))
void SpiInit(void)
{
// Enable the clocks for the PAx, PBx GPIO pins
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
// PA5 -> LCD SCK (MOSI valid on rising edge)
// Init PA5 high, configure as an output
LL_GPIO_SetOutputPin(GPIOA, LL_GPIO_PIN_5);
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_OUTPUT);
// PA6 -> LCD RESET# (active low)
// Init PA6 low, configure as an output
LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_6);
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_6, LL_GPIO_MODE_OUTPUT);
// PA7 -> LCD MOSI (active high)
// Init PA7 low, configure as an output
LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_7);
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_7, LL_GPIO_MODE_OUTPUT);
// PA8 -> LCD A0 - 0: command, 1: data
// Init PA8 low, configure as an output
LL_GPIO_ResetOutputPin(GPIOA, LL_GPIO_PIN_8);
LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_8, LL_GPIO_MODE_OUTPUT);
// PB6 -> LCD CS# (active low)
// Init PB6 high, configure as an output
LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_6);
LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_6, LL_GPIO_MODE_OUTPUT);
}
void SpiCmdWrite(UInt8 Val)
{
UInt BitMask;
CMD_ENA(); // configure LCD A0 for a command
CS_ENA(); // assert the LCD SPI chip select
// Write each bit of the command byte with the rising edge of SCK, msb first
for (BitMask = 0x80; BitMask > 0; BitMask >>= 1)
{
SCK_CLR();
Val & BitMask ? MOSI_SET() : MOSI_CLR();
SCK_SET();
}
CS_DIS(); // deassert the LCD SPI chip select
}
void SpiDataWrite(UInt8 Val)
{
UInt BitMask;
DAT_ENA(); // configure LCD A0 for data
CS_ENA(); // assert the LCD SPI chip select
// Write each bit of the data byte with the rising edge of SCK, msb first
for (BitMask = 0x80; BitMask > 0; BitMask >>= 1)
{
SCK_CLR();
Val & BitMask ? MOSI_SET() : MOSI_CLR();
SCK_SET();
}
CS_DIS(); // deassert the LCD SPI chip select
}
void SpiResetAssert(void)
{
RST_ENA();
}
void SpiResetDeassert(void)
{
RST_DIS();
}