#include "gd32f3x0.h"
#include "stdint.h"
#include "private_drives_gpio.h"
#define SPI_MODE_0 SPI_CK_PL_LOW_PH_1EDGE
#define SPI_MODE_1 SPI_CK_PL_LOW_PH_2EDGE
#define SPI_MODE_2 SPI_CK_PL_HIGH_PH_1EDGE
#define SPI_MODE_3 SPI_CK_PL_HIGH_PH_2EDGE
typedef struct
{
uint32_t spi;
rcu_periph_enum rcu_spi;
rcu_periph_enum rcu_gpio;
uint32_t gpio_periph_sck;
uint32_t pin_sck;
uint32_t gpio_periph_miso;
uint32_t pin_miso;
uint32_t gpio_periph_mosi;
uint32_t pin_mosi;
uint32_t spi_mode;
} private_drives_spi_struct_spi_config;
static private_drives_spi_struct_spi_config private_drives_spi_struct_spi0_config =
{
.spi = SPI0,
.rcu_spi = RCU_SPI0,
.rcu_gpio = RCU_GPIOA,
.gpio_periph_sck = GPIOA,
.pin_sck = GPIO_PIN_5,
.gpio_periph_miso = GPIOA,
.pin_miso = GPIO_PIN_6,
.gpio_periph_mosi = GPIOA,
.pin_mosi = GPIO_PIN_7,
.spi_mode = SPI_MODE_1
};
static private_drives_spi_struct_spi_config private_drives_spi_struct_spi1_config =
{
.spi = SPI1,
.rcu_spi = RCU_SPI1,
.rcu_gpio = RCU_GPIOB,
.gpio_periph_sck = GPIOB,
.pin_sck = GPIO_PIN_13,
.gpio_periph_miso = GPIOB,
.pin_miso = GPIO_PIN_14,
.gpio_periph_mosi = GPIOB,
.pin_mosi = GPIO_PIN_15,
.spi_mode = SPI_MODE_1
};
static void private_packs_spi_init(private_drives_spi_struct_spi_config spi_config)
{
spi_parameter_struct spi_init_struct;
rcu_periph_clock_enable(spi_config.rcu_spi);
rcu_periph_clock_enable(spi_config.rcu_gpio);
gpio_af_set(spi_config.gpio_periph_sck, GPIO_AF_0, spi_config.pin_sck);
gpio_af_set(spi_config.gpio_periph_miso, GPIO_AF_0, spi_config.pin_miso);
gpio_af_set(spi_config.gpio_periph_mosi, GPIO_AF_0, spi_config.pin_mosi);
gpio_mode_set(spi_config.gpio_periph_sck, GPIO_MODE_AF, GPIO_PUPD_NONE, spi_config.pin_sck);
gpio_mode_set(spi_config.gpio_periph_miso, GPIO_MODE_AF, GPIO_PUPD_NONE, spi_config.gpio_periph_miso);
gpio_mode_set(spi_config.gpio_periph_mosi, GPIO_MODE_AF, GPIO_PUPD_NONE, spi_config.gpio_periph_mosi);
gpio_output_options_set(spi_config.gpio_periph_sck, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, spi_config.pin_sck);
gpio_output_options_set(spi_config.gpio_periph_miso, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, spi_config.gpio_periph_miso);
gpio_output_options_set(spi_config.gpio_periph_mosi, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, spi_config.gpio_periph_mosi);
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_config.spi_mode;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_32;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(spi_config.spi, &spi_init_struct);
spi_enable(spi_config.spi);
}
void private_drives_spi_init_spi0()
{
private_packs_spi_init(private_drives_spi_struct_spi0_config);
}
void private_drives_spi_init_spi1()
{
private_packs_spi_init(private_drives_spi_struct_spi1_config);
}
static uint8_t spi_write_byte(uint32_t spi_periph, uint8_t byte)
{
while(RESET == (SPI_STAT(spi_periph)&SPI_FLAG_TBE));
SPI_DATA(spi_periph) = byte;
while(RESET == (SPI_STAT(spi_periph)&SPI_FLAG_RBNE));
return(SPI_DATA(spi_periph));
}
static void private_drives_spi_send(uint32_t spi_periph, uint8_t *send_buf, uint8_t *recv_buf, int len)
{
for(int i = 0; i < len; i++)
{
recv_buf[i] = spi_write_byte(spi_periph, send_buf[i]);
}
}
void private_drives_spi0_send(uint8_t *send_buf, uint8_t *recv_buf, int len)
{
private_drives_spi_send(SPI0, send_buf, recv_buf, len);
}
void private_drives_spi1_send(uint8_t *send_buf, uint8_t *recv_buf, int len)
{
private_drives_spi_send(SPI1, send_buf, recv_buf, len);
}