-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathpdnd_spi.c
More file actions
60 lines (48 loc) · 1.75 KB
/
Copy pathpdnd_spi.c
File metadata and controls
60 lines (48 loc) · 1.75 KB
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
#include "pdnd_spi.h"
#include "pico/stdlib.h"
#include "pio/pio_spi.h"
#include "pdnd.h"
pio_spi_inst_t pdnd_spi_initialize() {
// Initialize HOLD & WP
gpio_init(pdnd_out_pin(PDND_SPI_HOLD));
gpio_set_dir(pdnd_out_pin(PDND_SPI_HOLD), GPIO_OUT);
gpio_put(pdnd_out_pin(PDND_SPI_HOLD), 1);
gpio_init(pdnd_out_pin(PDND_SPI_WP));
gpio_set_dir(pdnd_out_pin(PDND_SPI_WP), GPIO_OUT);
gpio_put(pdnd_out_pin(PDND_SPI_WP), 1);
// Initialize CS
gpio_init(pdnd_out_pin(PDND_SPI_CS));
gpio_put(pdnd_out_pin(PDND_SPI_CS), 1);
gpio_set_dir(pdnd_out_pin(PDND_SPI_CS), GPIO_OUT);
// We use PIO 1
pio_spi_inst_t spi = {
.pio = pio1,
.sm = 0,
.cs_pin = pdnd_out_pin(PDND_SPI_CS)
};
uint offset = pio_add_program(spi.pio, &spi_cpha0_program);
pio_spi_init(spi.pio, spi.sm, offset,
8, // 8 bits per SPI frame
31.25f, // 1 MHz @ 125 clk_sys
false, // CPHA = 0
false, // CPOL = 0
pdnd_out_pin(PDND_SPI_CLK),
pdnd_out_pin(PDND_SPI_MOSI),
pdnd_in_pin(PDND_SPI_MISO)
);
return spi;
}
void pdnd_spi_read(const pio_spi_inst_t *spi, uint8_t *dst, size_t len) {
pio_spi_read8_blocking(spi, dst, len);
}
void pdnd_spi_write(const pio_spi_inst_t *spi, uint8_t *dst, size_t len) {
pio_spi_write8_blocking(spi, dst, len);
}
void pdnd_spi_write_read(const pio_spi_inst_t *spi, uint8_t *src, uint8_t *dst, size_t len) {
pio_spi_write8_read8_blocking(spi, src, dst, len);
}
void pdnd_spi_cs(const pio_spi_inst_t *spi, bool enable) {
asm volatile("nop \n nop \n nop"); // FIXME
gpio_put(spi->cs_pin, 1);
asm volatile("nop \n nop \n nop"); // FIXME
}