【GD32】SPI学习笔记

void rcu_config(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOC);
    rcu_periph_clock_enable(RCU_SPI0);
    rcu_periph_clock_enable(RCU_SPI2);
    rcu_periph_clock_enable(RCU_AF);
}
void gpio_config(void)
{
    /* SPI0 GPIO config: SCK/PA5, MISO/PA6, MOSI/PA7 */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7);
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    /* PA3 as NSS */
    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3);

    gpio_pin_remap_config(GPIO_SPI2_REMAP, ENABLE);
    /* SPI2 GPIO config: NSS/PA4, SCK/PC10, MISO/PC11, MOSI/PC12 */
    gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_12);
    gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
}
static void spi_config(uint32_t SPIx)
{
    spi_parameter_struct spi_init_struct;

    /* w25qxx_SPI parameter config */
    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;      /*!< SPI transtype */
    spi_init_struct.device_mode          = SPI_MASTER;                    /*!< SPI master or slave */
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;            /*!< SPI frame size */
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;//SPI_CK_PL_HIGH_PH_2EDGE;       /*!< SPI clock phase and polarity */
    spi_init_struct.nss                  = SPI_NSS_SOFT;                  /*!< SPI nss control by handware or software */
    spi_init_struct.prescale             = SPI_PSC_4;                     /*!< SPI prescale factor */
    spi_init_struct.endian               = SPI_ENDIAN_MSB;                /*!< SPI big endian or little endian */
    spi_init(SPIx, &spi_init_struct);
}
void spi_gpio_config(void)
{
	rcu_config();
	gpio_config();
	spi_config(SPI2);
	spi_enable(SPI2);
}
//SPI5 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
uint8_t SPIx_ReadWriteByte(uint32_t SPIx,uint8_t TxData)
{
	uint32_t retry=0;	
	uint16_t RxData=0;
	
	while((SPI_STAT(SPIx)&1<<1)==0)		//等待发送区空	
	{
		retry++;
		if(retry>=0XFFFE)return 0; 	//超时退出
	}			  
	SPI_DATA(SPIx) = (uint32_t)TxData;//发送一个byte 
	retry=0;
	while((SPI_STAT(SPIx)&1<<0)==0) 		//等待接收完一个byte  
	{
		retry++;
		if(retry>=0XFFFE)return 0;	//超时退出
	}	  			
	RxData = SPI_DATA(SPIx);
	
	return (uint8_t)RxData;          		//返回收到的数据	    
}

你可能感兴趣的:(GD32,单片机,stm32,gd32)