【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;          		//返回收到的数据	    
}

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值