SPI/* SPI1 init function */
#define SPI_TIME_OUT 100
void GD_SPI_Init(uint32_t spi_periph)
{
spi_parameter_struct spi_init_struct;
if(spi_periph == SPI0)
{
/* SPI 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_LOW_PH_1EDGE;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_8;
spi_init_struct.endian = SPI_ENDIAN_MSB;
GD_SPI_CsInit(SPI0);
GD_SPI_MspInit(SPI0);
spi_init(SPI0, &spi_init_struct);
spi_enable(SPI0);
}
}
void GD_SPI_MspInit(uint32_t spi_periph)
{
if(spi_periph == SPI0)
{
spi_disable(SPI0);
spi_i2s_deinit(SPI0);
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOB);
/**SPI0 GPIO Configuration
PA5 ------> SPI0_SCK
PA6 ------> SPI0_MISO
PB5 ------> SPI0_MOSI
*/
/* SPI0 clock enable */
rcu_periph_clock_enable(RCU_SPI0);
/* SPI0 GPIO config */
gpio_af_set(GPIOB, GPIO_AF_5, GPIO_PIN_5);
gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
gpio_af_set(GPIOA, GPIO_AF_5, GPIO_PIN_5 | GPIO_PIN_6);
gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_5 | GPIO_PIN_6);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6);
}
}
void GD_SPI_MspDeInit(uint32_t spi_periph)
{
if(spi_periph == SPI0)
{
spi_disable(SPI0);
spi_i2s_deinit(SPI0);
/* Peripheral clock disable */
rcu_periph_clock_disable(RCU_SPI0);
/**SPI0 GPIO Configuration
PA5 ------> SPI0_SCK
PA6 ------> SPI0_MISO
PB5 ------> SPI0_MOSI
*/
/* SPI0 GPIO config */
gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_5);
gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLDOWN, GPIO_PIN_5 | GPIO_PIN_6);
gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_6);
}
}
uint8_t SPI0_ReadWriteByte(uint8_t TxData)
{
uint8_t retry = 0;
while( spi_i2s_flag_get( SPI0, SPI_FLAG_TBE) == RESET )
{
retry++;
if( retry > SPI_TIME_OUT )
{
return 0;
}
}
spi_i2s_data_transmit( SPI0, TxData );
retry = 0;
while( spi_i2s_flag_get( SPI0, SPI_FLAG_RBNE) == RESET )
{
retry++;
if( retry > SPI_TIME_OUT )
{
return 0;
}
}
return spi_i2s_data_receive( SPI0 );
}
|