
试验目的:芯片采用F0芯片,通过配置SPI1完成W25X16的读写。片选CS为PA1,SCK为PB3,MISO为PB4,MOSI为PB5 具体配置: ![]() ![]() 由于没有使用中断和DMA,所以中断配置不选。 ![]() 程序分析: 首先要读取W25X16的ID号,需要发送0x90,加2个伪数据+0x00。同时由于ID号为2个8位数据构成,并且ST的F0芯片的SPI是要读取时需要先写,所以定义 uint8_t Data1[4] = {0x90,0x00,0x00,0x00} uint8_t Data2[2]= {0x00,0x00} uint8_t Rxdata[2]; 然后主程序中使能SPI端口:HAL_SPI_MspInit(&hspi1); 最后就是读取ID命令了,如下图 ![]() 此时Rxdata=0xEF14,这个就是W25X16的ID号。 读取ID正确了,剩下的就是对Flash的操作了。 , f) y: @' j) e: h8 F* \2 f |
void SPI_FLASH_WriteEnable(void)
{3 i( z; E" v; ?, b
SPI_FLASH_CS_LOW();. r: y! q& H: @. R: m, H1 t
HAL_SPI_Transmit(&hspi1, &W25X_WriteEnable, 1, 100);( o- T9 d6 s( e/ m3 W
SPI_FLASH_CS_HIGH();
}
uint8_t SPI_FLASH_SendByte(uint8_t byte)
{
uint8_t temp;
uint8_t temp1[1];: q0 |; @( m5 H1 `! F# P, `) f
HAL_SPI_TransmitReceive(&hspi1, &byte, &temp1[0], 1,100);
temp=temp1[0];
return temp;
}
void SPI_FLASH_WaitForWriteEnd(void)
{ 3 g4 C3 |; _. j! a% W. r6 L
uint8_t FLASH_Status=0;
uint8_t temp1[1];
SPI_FLASH_CS_LOW();* a6 K4 I: {1 V) a: L0 p$ z) |
HAL_SPI_Transmit(&hspi1, &W25X_ReadStatusReg, 1, 100);
do- F6 B) q5 i- H* f- a2 {" A5 s/ A
{4 r: `. T Z0 v* u
HAL_SPI_TransmitReceive(&hspi1, &Dummy_Byte, &temp1[0], 1,100);: ^9 m0 v8 X* Y) P' k/ z( z
FLASH_Status = temp1[0];- M# f3 f4 J* ?7 n- X3 d
}
while ((FLASH_Status & WIP_Flag) == SET);
SPI_FLASH_CS_HIGH();
}
这是用调用到的函数
SPI的引脚配置可以这样设置吗? /**SPI1 GPIO Configuration 9 @% T: b- q# u X1 D
PB3 ------> SPI1_SCK
PB4 ------> SPI1_MISO2 N8 j" x( m3 ?7 K1 y u
PB5 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;2 D5 r0 f: t4 p3 W, E
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
void SPI_FLASH_SectorErase(uint32_t SectorAddr)
{
SPI_FLASH_WriteEnable();9 B8 ^* r" T, n5 q" K5 |- u& Z0 F
SPI_FLASH_CS_LOW();
SPI_FLASH_SendByte(W25X_SectorErase);
SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);
SPI_FLASH_SendByte(SectorAddr & 0xFF);4 n5 J4 T! l0 B3 P9 b6 {; \
SPI_FLASH_CS_HIGH();
SPI_FLASH_WaitForWriteEnd();. L4 n$ C0 D* r# \( _5 T+ w
}
äºååèæ°ï½å¤§éª
一般不应该是0,如果读不到,应该是FF