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