一.配置说明
设置为主模式,理解上(mcu对flash)的操作,mcu相当于主,flash相当于从设备。
下面的选项顾名思义,就是对spi主从设备的选项模式。
关于时钟极性和相位的设置(两者解决着对数据的接收方式)。
根据时钟极性(CPOL)及相位(CPHA)不同,
SPI有四种工作模式。
时钟极性(CPOL)定义了时钟空闲状态电平:
CPOL=0为时钟空闲时为低电平
CPOL=1为时钟空闲时为高电平
时钟相位(CPHA)定义数据的采集时间。
CPHA=0:在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。
CPHA=1:在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。
一般采取默认即可,如有特别需求可以进行调整
此处为片选硬件上的选择方式,
解读上来讲,就是从一个io口输入或输出电平,
从而决定片选对象的接收和发送数据,一般根据电路或自己的实际情况选择,如果硬件电路上出现了片选,就跟据硬件电路来。如果硬件上没有则,可以使能output或者input进行配置。
使用(disable),如此硬件电路,f_cs就是片选引脚,根据此引脚进行配置即可
2.代码补充
在spi.c初始化中添加
初始化函数中添加
__HAL_SPI_ENABLE(&hspi1); //使能SPI1
SPI1_ReadWriteByte(0Xff); //启动传输
//SPI速度设置函数
//SPI速度=fAPB1/分频系数
//@ref SPI_BaudRate_Prescaler:SPI_BAUDRATEPRESCALER_2~SPI_BAUDRATEPRESCALER_2 256
//fAPB1时钟一般为42Mhz:
void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性
__HAL_SPI_DISABLE(&SPI1_Handler); //关闭SPI
SPI1_Handler.Instance->CR1&=0XFFC7; //位3-5清零,用来设置波特率
SPI1_Handler.Instance->CR1|=SPI_BaudRatePrescaler;//设置SPI速度
__HAL_SPI_ENABLE(&SPI1_Handler); //使能SPI
}
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{
u8 Rxdata;
HAL_SPI_TransmitReceive(&SPI1_Handler,&TxData,&Rxdata,1, 1000);
return Rxdata; //返回收到的数据
}
flash.h文件中添加
//EN25X系列/Q系列芯片列表
#define EN25Q80 0XEF13
#define EN25Q16 0XEF14
#define EN25Q32 0XEF15
#define EN25Q64 0XEF16
#define EN25Q128 0XEF17
//#define EN25Q64 0XC816
//#define EN25Q64 0X1C16 //GD25QXX
//#define EN25Q64 0X2016 //XM25QHXX
#define EN25Q64 0XC216 //MXIC
//#define EN25Q128 0XC817
#define EN25Q256 0XEF18
extern u16 EN25QXX_TYPE; //定义EN25QXX芯片型号
#define EN25QXX_CS PBout(14) //EN25QXX的片选信号
//指令表
#define EN25X_WriteEnable 0x06
#define EN25X_WriteDisable 0x04
#define EN25X_ReadStatusReg1 0x05
#define EN25X_ReadStatusReg2 0x35
#define EN25X_ReadStatusReg3 0x15
#define EN25X_WriteStatusReg1 0x01
#define EN25X_WriteStatusReg2 0x31
#define EN25X_WriteStatusReg3 0x11
#define EN25X_ReadData 0x03
#define EN25X_FastReadData 0x0B
#define EN25X_FastReadDual 0x3B
#define EN25X_PageProgram 0x02
#define EN25X_BlockErase 0xD8
#define EN25X_SectorErase 0x20
#define EN25X_ChipErase 0xC7
#define EN25X_PowerDown 0xB9
#define EN25X_ReleasePowerDown 0xAB
#define EN25X_DeviceID 0xAB
#define EN25X_ManufactDeviceID 0x90
#define EN25X_JedecDeviceID 0x9F
#define EN25X_Enable