【>>>>>以下所写如果难以理解的部分或有什么建议,可留言交流<<<<<】
spi编程要点:
1 初始化spi结构体
2 功能操作函数
1主体函数部分main.c
uint8_t readbuff[4096];
uint8_t Writebuff[4096];
int main(void)
{
uint32_t id;
uint16_t i;
//串口
USART_Config();
//spi配置
SPI_FLASH_Config();
//读取设备id
id=SPI_Read_ID();
printf("0x%x\r\n",id);
//清除扇区
SPI_FLASH_SectorErase(0);
for(i=0;i<4096;i++)
{
Writebuff[i]=i;
}
//写数据
SPI_FLASH_BufferWrite(Writebuff,0,4096);
//从里面读取数据
SPI_Read_Data(0,readbuff,4096);
for(i=0;i<4096;i++)
{
printf("0x%x",readbuff[i]);
if(i%10==0)
{
printf("\n");
}
}
}
2 相关函数bsp_flash_spi.c
#include "bsp_spi.h"
uint16_t FLASH_ADDRESS;
static __IO uint32_t SPITimeout = SPIT_LONG_TIMEOUT;
static uint32_t SPI_TIMEOUT_UserCallback(uint8_t errorCode);
/*spi_flash 配置*/
void SPI_FLASH_Config(void){
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
// 打开SPI GPIO的时钟
FLASH_SPI_GPIO_APBxClkCmd(FLASH_SPI_GPIO_CLK, ENABLE);
// 打开SPI外设的时钟
FLASH_SPI_APBxClkCmd(FLASH_SPI_CLK, ENABLE);
// 将FLASH_SPI SCL 的GPIO配置为推挽复用模式
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_SCLK_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(FLASH_SPI_SCLK_GPIO_PORT, &GPIO_InitStructure);
// 将FLASH_SPI MOSI 的GPIO配置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MOSI_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(FLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
// 将FLASH_SPI MISO 的GPIO配置为浮空输入模式
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MISO_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(FLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
//初始化CS引脚,因为是用软件,所以为推挽输出模式
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_CS_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
G