mirror of
https://github.com/arabine/open-story-teller.git
synced 2025-12-06 17:09:06 +01:00
74 lines
1.9 KiB
C
74 lines
1.9 KiB
C
|
|
#include "gd32vf103.h"
|
|
#include "spi0.h"
|
|
|
|
#define CS_PIN BIT(4)
|
|
#define CS_GPIO_PORT GPIOA
|
|
#define CS_GPIO_CLK RCU_GPIOA
|
|
|
|
void spi0_set_fclk_slow()
|
|
{
|
|
SPI_CTL0(SPI0) = (SPI_CTL0(SPI0) & ~0x38) | 0x38;
|
|
}
|
|
|
|
void spi0_set_fclk_fast()
|
|
{
|
|
SPI_CTL0(SPI0) = (SPI_CTL0(SPI0) & ~0x38) | 0x00;
|
|
}
|
|
|
|
void spi0_cs_high()
|
|
{
|
|
GPIO_BOP(CS_GPIO_PORT) = CS_PIN;
|
|
}
|
|
|
|
void spi0_cs_low()
|
|
{
|
|
GPIO_BC(CS_GPIO_PORT) = CS_PIN;
|
|
}
|
|
|
|
|
|
void spi0_initialize()
|
|
{
|
|
spi_parameter_struct spi_init_struct;
|
|
|
|
rcu_periph_clock_enable(RCU_GPIOA);
|
|
rcu_periph_clock_enable(RCU_SPI0);
|
|
|
|
/* SPI0_SCK(PA5) and SPI0_MOSI(PA7) GPIO pin configuration */
|
|
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);
|
|
/* SPI0_MISO(PA6) GPIO pin configuration */
|
|
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); // MISO
|
|
/* SPI0_CS(PA4) GPIO pin configuration */
|
|
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
|
|
|
|
/* chip _select invalid*/
|
|
spi0_cs_high();
|
|
|
|
/* SPI0 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(SPI0, &spi_init_struct);
|
|
|
|
/* set crc polynomial */
|
|
// spi_crc_polynomial_set(SPI0, 7);
|
|
/* enable SPI1 */
|
|
spi_enable(SPI0);
|
|
}
|
|
|
|
|
|
/* Exchange a byte */
|
|
uint8_t xchg_spi0 (
|
|
uint8_t dat /* Data to send */
|
|
)
|
|
{
|
|
while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE));
|
|
spi_i2s_data_transmit(SPI0, dat);
|
|
while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE));
|
|
return(spi_i2s_data_receive(SPI0)); /* Return received byte */
|
|
}
|