-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsreg.cpp
95 lines (75 loc) · 2.96 KB
/
sreg.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
//----------------------------------------------------------------------------
//Модуль поддержки последовательного регистра
//----------------------- Используемые ресурсы: ------------------------------
//Используются 3 внешних регистра 74HC595, которые соединены цепочкой
//и подключены к порту SPI1:
//линия тактирования SCLK подключена к SCK (PB3, используется remap)
//линия данных SDATA подключена к MOSI (PB5, используется remap)
//линия загрузки LOAD подключена к пину PB6
//линия разрешения выхода OE подключена к пину PB7
//----------------------------------------------------------------------------
#include "main.h"
#include "sreg.h"
//----------------------------------------------------------------------------
//----------------------------- Класс TSreg: ---------------------------------
//----------------------------------------------------------------------------
//---------------------------- Инициализация: --------------------------------
void TSreg::Init(void)
{
Pin_SCLK.Init(AF_PP_50M);
Pin_SDATA.Init(AF_PP_50M);
Pin_LOAD.Init(OUT_PP_50M, OUT_HI);
Pin_OE.Init(OUT_OD_2M, OUT_HI);
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE | //JTAG disable
AFIO_MAPR_SPI1_REMAP; //remap выводов SPI1
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; //включение тактирования SPI1
SPI1->CR1 = //настройка SPI:
SPI_CR1_CPHA * 0 | //CPHA = 0
SPI_CR1_CPOL * 0 | //CPOL = 0
SPI_CR1_MSTR * 1 | //мастер
SPI_CR1_BR_0 * 0 | //тактовая частота APB2 / 2
SPI_CR1_BR_1 * 0 |
SPI_CR1_BR_2 * 0 |
SPI_CR1_LSBFIRST * 0 | //MSB first
SPI_CR1_SSI * 1 | //мастер
SPI_CR1_SSM * 1 | //программное управление NSS
SPI_CR1_RXONLY * 0 | //full duplex
SPI_CR1_DFF * 0 | //8 bit data frame
SPI_CR1_CRCNEXT * 0 | //CRC не используется
SPI_CR1_CRCEN * 0 |
SPI_CR1_BIDIOE * 1 | //TX only
SPI_CR1_BIDIMODE * 1 | //1-line mode
SPI_CR1_SPE * 1; //разрешение SPI
}
//----------------------- Запись байта через SPI1: ---------------------------
void TSreg::SpiWr(uint8_t d)
{
//ожидание освобождения буфера:
while(!(SPI1->SR & SPI_SR_TXE));
SPI1->DR = d;
}
//-------------------------- Загрузка регистров: -----------------------------
void TSreg::operator = (uint32_t Value)
{
Pin_LOAD = 0;
SpiWr(BYTE1(Value));
SpiWr(BYTE2(Value));
SpiWr(BYTE3(Value));
//ожидание окончания передачи:
while(SPI1->SR & SPI_SR_BSY);
TSysTimer::Delay_us(1); //задержка
Pin_LOAD = 1;
}
//--------------------- Разрешение выходов регистров: ------------------------
void TSreg::Enable(void)
{
Pin_OE = 0;
}
//--------------------- Запрещение выходов регистров: ------------------------
void TSreg::Disable(void)
{
Pin_OE = 1;
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------