使用Platformio平台的libopencm3开发框架来开发STM32G0,下面介绍SPI接口的基本使用。

1 SPI配置

以下为设置SPI1,引脚映射为PA5\6\7,使用软件控制CS-PA4;

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
/* Enable SPI1 Periph and gpio clocks */
rcc_periph_clock_enable(RCC_SPI1);
rcc_periph_clock_enable(RCC_GPIOA);

/* Configure GPIOs:
*
* SCK=PA5
* MOSI=PA7
* MISO=PA6
*
* for SD card
* SDCS PA4
*/

//MOSI & SCK & MISO
gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO5|GPIO7|GPIO6);
gpio_set_af(GPIOA,GPIO_AF0,GPIO5|GPIO7|GPIO6);
gpio_set_output_options(GPIOA, GPIO_OTYPE_PP,GPIO_OSPEED_LOW,GPIO5|GPIO7|GPIO6);

//SDCS
gpio_mode_setup(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO4);
gpio_set(GPIOA,GPIO4);

/* Reset SPI, SPI_CR1 register cleared, SPI is disabled */
spi_reset(SPI1);

/* Set up SPI in Master mode with:
* Clock baud rate
* Clock polarity
* Clock phase
* Frame format MSB
*/
spi_init_master(SPI1, SPI_CR1_BAUDRATE_FPCLK_DIV_128,
SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE,
SPI_CR1_CPHA_CLK_TRANSITION_1,
SPI_CR1_MSBFIRST);

spi_set_data_size(SPI1,SPI_CR2_DS_8BIT);
spi_set_full_duplex_mode(SPI1);

/*
* Set NSS management to software.
*
* Note:
* Setting nss high is very important, even if we are controlling
* the GPIO
* ourselves this bit needs to be at least set to 1, otherwise the spi
* peripheral will not send any data out.
*/
spi_enable_software_slave_management(SPI1);
spi_set_nss_high(SPI1);

/* Enable SPI1 periph. */
spi_enable(SPI1);

设置流程:打开外设时钟-> 设置SPI引脚 -> CS引脚 -> 配置SPI模式包括SPI速度、CPOL\CPHA -> SPI传输数据位数 -> NSS配置 -> SPI使能;

2 SPI读写

  • 写入后读取
1
uint16_t spi_xfer(uint32_t spi, uint16_t data)
  • 发送
1
void spi_send(uint32_t spi, uint16_t data)
  • 接收
1
uint16_t spi_read(uint32_t spi)
  • 对于8bit的发送和接收在STM32G0上,libopencm3库需要使用如下接口:
1
2
spi_send8();
spi_read8();

3 说明

默认配置的SPI时钟是连续的,波形如下:

在某些时候需要在帧之间有些空隙,可以设置CR2寄存器的NSSP位或者直接在发送前进行延时:

1
SPI_CR2(SPI1) |= SPI_CR2_NSSP; //NSSP

波形如下: