系统供电3.3V,该驱动主要应用在WQ25QXX芯片驱动,NSS选择软件控制,配合WQ25QXX芯片片选CS时序应用。芯片官网DEMO程序有相关的SPI例程,但所用IO口可能不同,设置参数,端口复用也略不相同,为了以后直接应用,仅做记录,方便以后移植应用,同样,前面是头文件代码,后面是应用代码,代码已测试。
#ifndef __SPI2_H__
#define __SPI2_H__
#include "main.h"
#define SPI2_CS(n) (n?GPIO_SetBits(GPIOC, GPIO_PIN_6):GPIO_ResetBits(GPIOC, GPIO_PIN_6))
void spi2Init(void); //spi2 gpio and mode initial
uint8_t spi2ReadWriteByte(uint8_t byte); //SPI2 read and write a byte.
#endif
#include "spi2.h"
void spi2Init(void) //spi2 gpio and mode initial
{
//SPI2 GPIO initial
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE); //PORT C CLK ENABLE
//RCC_EnableAPB2PeriphClk(sFLASH_SPI_CLK, ENABLE);
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_SPI2, ENABLE);//SPI2 CLK ENABLE APB1
GPIO_ConfigPinRemap(GPIO_RMP1_SPI2,ENABLE); //IO 复用AFIO_RMP_CFG3
GPIO_InitStructure.Pin = GPIO_PIN_7; //SCK
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitPeripheral(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_9; //MOSI Master Output/Slave Input
GPIO_InitPeripheral(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_8; //MISO Master Input Slave Output 主机输入从机输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitPeripheral(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_6; //CS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitPeripheral(GPIOC, &GPIO_InitStructure);
SPI2_CS(1); //sFLASH_CS_HIGH();
SPI_InitType SPI_InitStructure;
SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX; //SPI direction: double
SPI_InitStructure.SpiMode = SPI_MODE_MASTER; //SPI MODE master
SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS; //SPI DATA MODE
SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH; //SPI CLE idle mode is HIGH
SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI_InitStructure.NSS = SPI_NSS_SOFT; //CS soft control
SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_2;
// SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_4; //Baud rate predivision: SPI_BR_PRESCALER_4 APB1 = 36MHZ SPC CLE = 36/4 = 9MHZ
// SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_16;
// SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_64; //Baud rate predivision: SPI_BR_PRESCALER_4 APB1 = 36MHZ SPC CLE = 36/4 = 9MHZ
SPI_InitStructure.FirstBit = SPI_FB_MSB; //FirstBit :MSB most significant bit
SPI_InitStructure.CRCPoly = 7; //CRC
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Enable(SPI2, ENABLE);
}
uint8_t spi2ReadWriteByte(uint8_t byte) //SPI2 read and write a byte.
{
while (SPI_I2S_GetStatus(SPI2, SPI_I2S_TE_FLAG) == RESET){}
SPI_I2S_TransmitData(SPI2, byte);
while (SPI_I2S_GetStatus(SPI2, SPI_I2S_RNE_FLAG) == RESET){}
return SPI_I2S_ReceiveData(SPI2);
}