13 #define SPI_STD_TIMEOUT_MS 10
24 return ERROR_NOT_YET_IMPLEMENTED;
35 switch ((uint32_t)spi->
ctrl)
38 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
42 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
46 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
54 SPI_InitStruct.
SPI_Direction = SPI_Direction_2Lines_FullDuplex;
55 SPI_InitStruct.
SPI_Mode = SPI_Mode_Master;
60 SPI_InitStruct.
SPI_CPOL = SPI_CPOL_Low;
61 SPI_InitStruct.
SPI_CPHA = SPI_CPHA_1Edge;
64 SPI_InitStruct.
SPI_CPOL = SPI_CPOL_Low;
65 SPI_InitStruct.
SPI_CPHA = SPI_CPHA_2Edge;
68 SPI_InitStruct.
SPI_CPOL = SPI_CPOL_High;
69 SPI_InitStruct.
SPI_CPHA = SPI_CPHA_1Edge;
72 SPI_InitStruct.
SPI_CPOL = SPI_CPOL_High;
73 SPI_InitStruct.
SPI_CPHA = SPI_CPHA_2Edge;
77 SPI_InitStruct.
SPI_NSS = SPI_NSS_Soft | SPI_NSSInternalSoft_Set;
80 SPI_Init(spi->
ctrl, &SPI_InitStruct);
82 SPI_Cmd(spi->
ctrl, ENABLE);
90 return ERROR_NOT_YET_IMPLEMENTED;
101 while (!(spi->
ctrl->
SR & SPI_I2S_FLAG_TXE))
110 while (!(spi->
ctrl->
SR & SPI_I2S_FLAG_RXNE))
119 while (spi->
ctrl->
SR & SPI_I2S_FLAG_BSY)
133 static status_e writeread(
const struct heivs_bus_t *bus, uint32_t address,
const uint8_t *src,
size_t src_len, uint8_t *dst,
size_t dst_len,
size_t *rlen)
147 for (i = 0 ; i <
max(src_len, dst_len) ; i++)
150 uint8_t dummy = 0xff;
151 const uint8_t *l_src = &dummy;
152 uint8_t *l_dst = &dummy;
167 status = write_read_one(spi, l_src, l_dst);
191 return writeread(bus, 0, NULL, 0, data, len, &dont_care);
198 return writeread(bus, 0, data, len, NULL, 0, &dont_care);
203 #if BSP_SPI_BUS_COUNT > 0
216 #if BSP_SPI_BUS_COUNT > 1
218 .ctrl = BSP_SPI_BUS1_CTRL,
222 BSP_SPI_BUS1_GPIO_MISO,
223 BSP_SPI_BUS1_GPIO_MOSI,
224 BSP_SPI_BUS1_GPIO_SCK,
225 BSP_SPI_BUS1_GPIO_CS,
229 #if BSP_SPI_BUS_COUNT > 2
231 .ctrl = BSP_SPI_BUS2_CTRL,
235 BSP_SPI_BUS2_GPIO_MISO,
236 BSP_SPI_BUS2_GPIO_MOSI,
237 BSP_SPI_BUS2_GPIO_SCK,
238 BSP_SPI_BUS2_GPIO_CS,
248 #if BSP_SPI_BUS_COUNT > 0
249 #ifndef BSP_SPI_BUS0_NAME
250 #define BSP_SPI_BUS0_NAME "bus_spi[0]"
253 .
name = BSP_SPI_BUS0_NAME,
254 .priv = &bus_priv[0],
261 ._writeread = writeread,
264 #if BSP_SPI_BUS_COUNT > 1
265 #ifndef BSP_SPI_BUS1_NAME
266 #define BSP_SPI_BUS1_NAME "bus_spi[1]"
269 .name = BSP_SPI_BUS1_NAME,
270 .priv = &bus_priv[1],
277 ._writeread = writeread,
280 #if BSP_SPI_BUS_COUNT > 2
281 #ifndef BSP_SPI_BUS2_NAME
282 #define BSP_SPI_BUS2_NAME "bus_spi[2]"
285 .name = BSP_SPI_BUS2_NAME,
286 .priv = &bus_priv[2],
293 ._writeread = writeread,
296 #if BSP_I2C_BUS_COUNT > 3
297 #error this CPU has no 4 SPI buses
This file contains all the functions prototypes for the RCC firmware library.
SPI_TypeDef * ctrl
Controller.
BSP - Board Support Package.
const struct heivs_bus_t bus_spi[BSP_SPI_BUS_COUNT]
All SPI busses.
#define BSP_SPI_BUS_COUNT
Number of SPI buses.
ssize_t read(int fd, void *buf, size_t count)
uint16_t SPI_BaudRatePrescaler
This file contains all the functions prototypes for the SPI firmware library.
Variable part of the bus description.
enum spi_option_e options
Options.
static uint32_t time_elapsed(timeout_t timeout)
Is this time passed?
#define BSP_SPI_BUS0_CTRL
On this controller.
static void gpio_set(const struct gpio_t *gpio, uint32_t value)
Set a gpio.
Mode 3 : CPOL = 1, CPHA = 1.
#define max(a, b)
Maximum between a and b.
#define BSP_SPI_BUS0_GPIO_MOSI
MOSI on this pin.
Mode 2 : CPOL = 1, CPHA = 0.
SPI Init structure definition.
#define BSP_SPI_BUS0_GPIO_MISO
MISO on this pin.
const struct gpio_t gpios[4]
Gpios.
Mode 0 : CPOL = 0, CPHA = 0.
ssize_t write(int fd, const void *buf, size_t count)
timeout_t time_set_timeout_ms(uint32_t ms)
Set an obscure time at least ms milliseconds in the future.
status_e gpio_setup_list(const struct gpio_t gpio[], size_t len)
Setup an array of gpio.
#define ARRAY_SIZE(x)
Number of elements in the array.
#define BSP_SPI_BUS0_GPIO_CS
CS on this pin.
#define BSP_SPI_BUS0_GPIO_SCK
SCK on this pin.
Mode 1 : CPOL = 0, CPHA = 1.