mirror of
https://github.com/arabine/open-story-teller.git
synced 2025-12-06 17:09:06 +01:00
82 lines
2 KiB
C
82 lines
2 KiB
C
|
|
#include "gd32vf103.h"
|
|
#include "spi1.h"
|
|
|
|
#define CS_PIN BIT(12)
|
|
#define CS_GPIO_PORT GPIOB
|
|
#define CS_GPIO_CLK RCU_GPIOB
|
|
|
|
|
|
/*
|
|
PB15 SPI1_MOSI
|
|
PB14 SPI1_MISO
|
|
PB13 SPI1_SCLK
|
|
PB12 SPI1_CS_TF
|
|
*/
|
|
|
|
|
|
void spi1_set_fclk_slow()
|
|
{
|
|
SPI_CTL0(SPI1) = (SPI_CTL0(SPI1) & ~0x38) | 0x38;
|
|
}
|
|
|
|
void spi1_set_fclk_fast()
|
|
{
|
|
SPI_CTL0(SPI1) = (SPI_CTL0(SPI1) & ~0x38) | 0x00;
|
|
}
|
|
|
|
void spi1_cs_high()
|
|
{
|
|
GPIO_BOP(CS_GPIO_PORT) = CS_PIN;
|
|
}
|
|
|
|
void spi1_cs_low()
|
|
{
|
|
GPIO_BC(CS_GPIO_PORT) = CS_PIN;
|
|
}
|
|
|
|
|
|
void spi1_initialize()
|
|
{
|
|
spi_parameter_struct spi_init_struct;
|
|
|
|
rcu_periph_clock_enable(RCU_GPIOB);
|
|
rcu_periph_clock_enable(RCU_SPI1);
|
|
|
|
/* SPI1_SCK(PB13), SPI1_MISO(PB14) and SPI1_MOSI(PB15) GPIO pin configuration */
|
|
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15);
|
|
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
|
|
/* SPI1_CS(PB12) GPIO pin configuration */
|
|
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
|
|
|
|
/* chip _select invalid*/
|
|
spi1_cs_high();
|
|
|
|
/* SPI1 parameter config */
|
|
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
|
|
spi_init_struct.device_mode = SPI_MASTER;
|
|
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
|
|
spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
|
|
spi_init_struct.nss = SPI_NSS_SOFT;
|
|
spi_init_struct.prescale = SPI_PSC_32; // SPI_PSC_32; (PCLK1=54MHz)
|
|
spi_init_struct.endian = SPI_ENDIAN_MSB;
|
|
spi_init(SPI1, &spi_init_struct);
|
|
|
|
/* set crc polynomial */
|
|
spi_crc_polynomial_set(SPI1, 7);
|
|
/* enable SPI1 */
|
|
spi_enable(SPI1);
|
|
}
|
|
|
|
|
|
/* Exchange a byte */
|
|
uint8_t xchg_spi1 (
|
|
uint8_t dat /* Data to send */
|
|
)
|
|
{
|
|
while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_TBE));
|
|
spi_i2s_data_transmit(SPI1, dat);
|
|
while(RESET == spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE));
|
|
return(spi_i2s_data_receive(SPI1)); /* Return received byte */
|
|
}
|