按照良许嵌入式的代码引用,需要了解详细请移步良许嵌入式32部分良许嵌入式。
引脚定义:
首先是头文件部分声明以及定义
1.1头文件
#ifndef __W25Q128_H
#define __W25Q128_H
#include "sys.h"
//定义片选信号,1为选中,0为未选中
#define W25Q128_CS(X) do{X? \
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET):\
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);\
}while(0)
//下面是W25Q128的指令表,在W25Q128官方手册第八章可以找到
#define FLASH_ManufactDeviceID 0x90 //查询厂商设备号:16位
#define FLASH_WriteEnable 0x06 //开启写使能
#define FLASH_ReadStatusReg1 0x05 //读取SPI状态寄存器1
#define FLASH_ReadData 0x03 //读取数据
#define FLASH_PageProgram 0x02 //页
#define FLASH_SectorErase 0x20 //扇区擦除
#define FLASH_DummyByte 0xFF //写入指令
void w25q128_init(void); //初始化
uint16_t w25q128_read_id(void); //读取芯片ID
void w25q128_read_data(uint32_t address, uint8_t *data, uint32_t size); //读取spi接收缓冲区数据
void w25q128_write_page(uint32_t address, uint8_t *data, uint16_t size); //写页
void w25q128_erase_sector(uint32_t address); //擦除扇区
#endif
2.1 SPI的初始化(void spi1_init(void))
SPI_HandleTypeDef SPI_HandleInitStructure={0}; //定义spi句柄并且初始化
void spi1_init(void)
{
SPI_HandleInitStructure.Instance=SPI1; //当前模块使用的是spi1
SPI_HandleInitStructure.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256; //SPI波特率分频 256
SPI_HandleInitStructure.Init.CLKPhase=SPI_PHASE_1EDGE; //奇数边沿触发
SPI_HandleInitStructure.Init.CLKPolarity=SPI_POLARITY_LOW; //CPOL,低电平为空闲
SPI_HandleInitStructure.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE; //关闭crc校验
SPI_HandleInitStructure.Init.CRCPolynomial=7; //CRC校验多项式 4+2+1=7,spi默认
SPI_HandleInitStructure.Init.DataSize=SPI_DATASIZE_8BIT; //8位数据传输模式
SPI_HandleInitStructure.Init.Direction=SPI_DIRECTION_2LINES; //双工模式
SPI_HandleInitStructure.Init.FirstBit=SPI_FIRSTBIT_MSB; //高位先行
SPI_HandleInitStructure.Init.NSS=SPI_NSS_SOFT; //从模式选择,软件
SPI_HandleInitStructure.Init.Mode=SPI_MODE_MASTER; //主机模式
SPI_HandleInitStructure.Init.TIMode=SPI_TIMODE_DISABLE; //关闭
HAL_SPI_Init(&SPI_HandleInitStructure);
}