简介

spi配置
void MX_SPI2_Init(void)
{
hspi2.Instance = SPI2;
hspi2.Init.Mode = SPI_MODE_MASTER;
hspi2.Init.Direction = SPI_DIRECTION_2LINES;
hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 7;
hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
Error_Handler();
}
}
读写代码接口示例
#include "spi.h"
#include "string.h"
#include "spi_flash.h"
#define SPI2_FLASH_NSS_PORT GPIOA
#define SPI2_FLASH_NSS_PIN GPIO_PIN_8
#define CMD_PAGE_PROGRAM 0x02
#define CMD_READ_DATA_BYTES 0x03
#define CMD_READ_STA_REG 0x05
#define CMD_WRITE_ENABLE 0x06
#define CMD_SECTOR_ERASE 0x20
#define GET_DEVICE_ID 0x90
#define GET_IDENTIFICATION 0x9f
#define DUMMY_BYTE 0xff
#define SFLASH_ID 0xC84018
#define SPI_FLASH_NSS_ENABLE HAL_GPIO_WritePin(SPI2_FLASH_NSS_PORT, SPI2_FLASH_NSS_PIN, GPIO_PIN_RESET)
#define SPI_FLASH_NSS_DISENABLE HAL_GPIO_WritePin(SPI2_FLASH_NSS_PORT, SPI2_FLASH_NSS_PIN, GPIO_PIN_SET)
#define SPI_FLASH_PAGE_SIZE 0x100
#define WIP_FLAG 0x01
#define DEVICE_SIZE 0x400000
#define BLOCK_SIZE 0x10000
#define SECTOR_SIZE 0x1000
#define PAGE_SIZE 0x100
static uint8_t gs_sectorBuf[SECTOR_SIZE] = {0};
union GD32_UINT32_DATA_TYPE
{
uint8_t b[4];
uint32_t Uint32_Data;
};
uint8_t spi_SendRcvByte(uint8_t TxData)
{
uint8_t Rxdata;
HAL_SPI_TransmitReceive(&hspi2, &TxData, &Rxdata, 1, 100);
return Rxdata;
}
uint16_t get_DeviceId(void)
{
uint16_t dev_id = 0;
SPI_FLASH_NSS_ENABLE;
spi_SendRcvByte(GET_DEVICE_ID);
spi_SendRcvByte(DUMMY_BYTE);
spi_SendRcvByte(DUMMY_BYTE);
spi_SendRcvByte(DUMMY_BYTE);
dev_id = spi_SendRcvByte(DUMMY_BYTE) << 8;
dev_id |= spi_SendRcvByte(DUMMY_BYTE);
SPI_FLASH_NSS_DISENABLE;
return dev_id;
}
void get_Identifica(uint8_t *data_out)
{
SPI_FLASH_NSS_ENABLE;
spi_SendRcvByte(GET_IDENTIFICATION);
data_out [0] = spi_SendRcvByte(DUMMY_BYTE);
data_out [1] = spi_SendRcvByte(DUMMY_BYTE);
data_out [2] = spi_SendRcvByte(DUMMY_BYTE);
SPI_FLASH_NSS_DISENABLE;
}
void get_ReadDataBytes(uint32_t dest_addr, uint8_t *data, uint32_t len)
{
SPI_FLASH_NSS_ENABLE;
spi_SendRcvByte(CMD_READ_DATA_BYTES);
spi_SendRcvByte((uint8_t)(dest_addr >> 16));
spi_SendRcvByte((uint8_t)(dest_addr >> 8));
spi_SendRcvByte((uint8_t)(dest_addr));
while(len--)
{
*data = spi_SendRcvByte(DUMMY_BYTE);
data++;
}
SPI_FLASH_NSS_DISENABLE;
}
void spi_flash_write_enable(void)
{
SPI_FLASH_NSS_ENABLE;
spi_SendRcvByte(CMD_WRITE_ENABLE);
SPI_FLASH_NSS_DISENABLE;
}
void spi_flash_wait_for_write_end(void)
{
uint8_t flash_status = 0;
SPI_FLASH_NSS_ENABLE;
spi_SendRcvByte(CMD_READ_STA_REG);
do
{
flash_status = spi_SendRcvByte(DUMMY_BYTE);
}while( (flash_status & WIP_FLAG) == SET );
SPI_FLASH_NSS_DISENABLE;
}
void spi_flash_sector_erase(uint32_t sector_addr)
{
union GD32_UINT32_DATA_TYPE addr;
addr.Uint32_Data=sector_addr;
spi_flash_write_enable();
SPI_FLASH_NSS_ENABLE;
spi_SendRcvByte(CMD_SECTOR_ERASE);
spi_SendRcvByte( addr.b[2] );
spi_SendRcvByte( addr.b[1] );
spi_SendRcvByte( addr.b[0] );
SPI_FLASH_NSS_DISENABLE;
spi_flash_wait_for_write_end();
}
static void spi_flash_page_write(uint8_t* pbuffer, uint32_t write_addr, uint16_t num_byte_to_write)
{
union GD32_UINT32_DATA_TYPE addr;
addr.Uint32_Data=write_addr;
spi_flash_write_enable();
SPI_FLASH_NSS_ENABLE;
spi_SendRcvByte(CMD_PAGE_PROGRAM);
spi_SendRcvByte( addr.b[2] );
spi_SendRcvByte( addr.b[1] );
spi_SendRcvByte( addr.b[0] );
while(num_byte_to_write--)
{
spi_SendRcvByte(*pbuffer);
pbuffer++;
}
SPI_FLASH_NSS_DISENABLE;
spi_flash_wait_for_write_end();
}
void spi_flash_buffer_write(uint8_t* pbuffer, uint32_t write_addr, uint16_t len)
{
uint8_t num_of_page = 0, num_of_single = 0, addr = 0, count = 0, temp = 0;
addr = write_addr % SPI_FLASH_PAGE_SIZE;
count = SPI_FLASH_PAGE_SIZE - addr;
num_of_page = len / SPI_FLASH_PAGE_SIZE;
num_of_single = len % SPI_FLASH_PAGE_SIZE;
if(0 == addr)
{
if(0 == num_of_page)
spi_flash_page_write(pbuffer,write_addr, len);
else
{
while(num_of_page--)
{
spi_flash_page_write(pbuffer,write_addr,SPI_FLASH_PAGE_SIZE);
write_addr += SPI_FLASH_PAGE_SIZE;
pbuffer += SPI_FLASH_PAGE_SIZE;
}
spi_flash_page_write(pbuffer,write_addr,num_of_single);
}
}
else
{
if(0 == num_of_page)
{
if(num_of_single > count)
{
temp = num_of_single - count;
spi_flash_page_write(pbuffer,write_addr,count);
write_addr += count;
pbuffer += count;
spi_flash_page_write(pbuffer,write_addr,temp);
}
else
spi_flash_page_write(pbuffer,write_addr,len);
}
else
{
len -= count;
num_of_page = len / SPI_FLASH_PAGE_SIZE;
num_of_single = len % SPI_FLASH_PAGE_SIZE;
spi_flash_page_write(pbuffer,write_addr, count);
write_addr += count;
pbuffer += count;
while(num_of_page--)
{
spi_flash_page_write(pbuffer,write_addr,SPI_FLASH_PAGE_SIZE);
write_addr += SPI_FLASH_PAGE_SIZE;
pbuffer += SPI_FLASH_PAGE_SIZE;
}
if(0 != num_of_single)
spi_flash_page_write(pbuffer,write_addr,num_of_single);
}
}
}