embox

Форк
0
/
stm32_spi1_l0x0.c 
122 строки · 2.6 Кб
1
/**
2
 * @file stm32_spi_l0x0.c
3
 * @brief
4
 * @author Vadim Deryabkin <Vadimatorikda@gmail.com>
5
 * @version
6
 * @date 20.02.2021
7
 */
8

9
#include <string.h>
10
#include <assert.h>
11

12
#include "stm32_spi_l0x0.h"
13

14
#include <drivers/spi.h>
15
#include <kernel/irq.h>
16
#include <util/log.h>
17
#include <drivers/gpio/gpio.h>
18

19
static struct stm32_spi stm32_spi1 = {0};
20

21
static int stm32_spi_setup(struct stm32_spi *dev, bool is_master) {
22
	dev->is_master = is_master;
23

24
	if (!dev->is_master) {
25
		log_error("SPI slave mode is not supported!");
26
		return -1;
27
	}
28

29
	set_spi1_pwr();
30

31
	// Doc: RM0451, 699/774
32
	static const uint32_t br =
33
#if OPTION_GET(NUMBER,dev) == 2
34
		0
35
#elif OPTION_GET(NUMBER,dev) == 4
36
		1
37
#elif OPTION_GET(NUMBER,dev) == 8
38
		2
39
#elif OPTION_GET(NUMBER,dev) == 16
40
		3
41
#elif OPTION_GET(NUMBER,dev) == 32
42
		4
43
#elif OPTION_GET(NUMBER,dev) == 64
44
		5
45
#elif OPTION_GET(NUMBER,dev) == 128
46
		6
47
#elif OPTION_GET(NUMBER,dev) == 256
48
		7
49
#else
50
#error "SPI param <<dev>> has not set!"
51
#endif
52
	;
53

54
	SPI1->CR1 = (OPTION_GET(NUMBER,spha) << 0) |
55
			(OPTION_GET(NUMBER,spol) << 1) |
56
			(1 << 2) | (br << 3);
57
	SPI1->CR2 = (1 << 2); // Without OVR flag.
58
	SPI1->CR1 |= (1 << 6);
59

60
	return 0;
61
}
62

63
int stm32_spi_init(struct stm32_spi *dev) {
64
	return stm32_spi_setup(dev, true);
65
}
66

67
static int stm32_spi_select(struct spi_device *dev, int cs) {
68
	return 0;
69
}
70

71
static int stm32_spi_set_mode(struct spi_device *dev, bool is_master) {
72
	struct stm32_spi *s = dev->priv;
73
	return stm32_spi_setup(s, is_master);
74
}
75

76
static int stm32_spi_transfer(struct spi_device *dev, uint8_t *inbuf,
77
		uint8_t *outbuf, int count) {
78
	uint32_t tx_byte = count;
79
	uint32_t rx_bute = count;
80

81
	while(tx_byte) {
82
		if (SPI1->SR & (1 << 0)) {
83
			*outbuf = SPI1->DR;
84
			outbuf++;
85
			rx_bute--;
86
		}
87

88
		while(!(SPI1->SR & (1 << 1))) {};
89
		SPI1->DR = *inbuf;
90
		inbuf++;
91
		tx_byte--;
92
	}
93

94
	while(rx_bute) {
95
		while (!(SPI1->SR & (1 << 0)));
96
		*outbuf = SPI1->DR;
97
		outbuf++;
98
		rx_bute--;
99
	}
100

101
	return 0;
102
}
103

104
struct spi_ops stm32_spi_ops = {
105
	.select   = stm32_spi_select,
106
	.set_mode = stm32_spi_set_mode,
107
	.transfer = stm32_spi_transfer
108
};
109

110
static int stm32_spi1_init(void) {
111
	gpio_setup_mode(OPTION_GET(NUMBER,port_mosi), 1 << OPTION_GET(NUMBER,pin_mosi), GPIO_MODE_OUT_ALTERNATE | GPIO_ALTERNATE(0));
112
	gpio_setup_mode(OPTION_GET(NUMBER,port_miso), 1 << OPTION_GET(NUMBER,pin_miso), GPIO_MODE_OUT_ALTERNATE | GPIO_ALTERNATE(0));
113
	gpio_setup_mode(OPTION_GET(NUMBER,port_sck), 1 << OPTION_GET(NUMBER,pin_sck), GPIO_MODE_OUT_ALTERNATE | GPIO_ALTERNATE(0));
114

115
	stm32_spi_init(&stm32_spi1);
116
	return 0;
117
};
118

119
#define SPI_DEV_NAME      stm32_spi_1
120

121
SPI_DEV_DEF(SPI_DEV_NAME, &stm32_spi_ops, &stm32_spi1, 1);
122
EMBOX_UNIT_INIT(stm32_spi1_init);
123

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.