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
#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/spi.h>
#include <libopencm3/stm32/gpio.h>

void clock_setup(void)
{
  rcc_clock_setup_in_hse_8mhz_out_72mhz();
  rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN);
  rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_AFIOEN);
  rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_SPI1EN);
}

void gpio_setup(void)
{
  gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ,GPIO_CNF_OUTPUT_ALTFN_PUSHPULL,GPIO_SPI1_SCK);
  gpio_set_mode(GPIOA, GPIO_MODE_INPUT,GPIO_CNF_INPUT_FLOAT,GPIO_SPI1_MISO);
  gpio_set_mode(GPIOA, GPIO_MODE_OUTPUT_50_MHZ,GPIO_CNF_OUTPUT_ALTFN_PUSHPULL,GPIO_SPI1_MOSI);
  gpio_set_mode(GPIOA, GPIO_MODE_INPUT,GPIO_CNF_INPUT_FLOAT,GPIO_SPI1_NSS);
}


int main(void)
{
  clock_setup();
  gpio_setup();
  
  spi_init_master(SPI1, SPI_CR1_BAUDRATE_FPCLK_DIV_256, SPI_CR1_CPOL, SPI_CR1_CPHA, SPI_CR1_DFF_16BIT, SPI_CR1_LSBFIRST); //spi_init_master(u32 spi, u32 br, u32 cpol, u32 cpha, u32 dff, u32 lsbfirst)
  spi_set_bidirectional_mode(SPI1);
    
  spi_enable(SPI1);  
  spi_set_nss_high(SPI1);
  
  while(1)
  {
    spi_send(SPI1, 0xFF);
    __asm__("nop");
    __asm__("nop");
    __asm__("nop");
    __asm__("nop");
    spi_send(SPI1, 0x00);
  }  
}