|
试验目的:芯片采用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]; $ ]: E$ z/ P0 b' X" g 然后主程序中使能SPI端口:HAL_SPI_MspInit(&hspi1); 最后就是读取ID命令了,如下图
此时Rxdata=0xEF14,这个就是W25X16的ID号。 读取ID正确了,剩下的就是对Flash的操作了。 . U8 C4 W. Q. e3 A( {8 C |
微信公众号
手机版
void SPI_FLASH_WriteEnable(void)$ I6 _6 l0 ?2 J5 H+ @: t
{, D! A# A. P4 q, V
SPI_FLASH_CS_LOW();/ k5 K# w2 [! f6 ?5 G* Y8 R4 R/ ~
HAL_SPI_Transmit(&hspi1, &W25X_WriteEnable, 1, 100);. i* ]. t/ J( W6 U
SPI_FLASH_CS_HIGH();* i, E5 l9 z' G9 O0 X3 |
}6 A5 E& m& `5 J% x9 E+ _7 t! f8 M
uint8_t SPI_FLASH_SendByte(uint8_t byte)
{- a0 I z# o }3 `2 c9 [: s
uint8_t temp;/ e2 k6 Q: @8 k5 j) `
uint8_t temp1[1];) a2 l( S# p( n0 H1 I s
HAL_SPI_TransmitReceive(&hspi1, &byte, &temp1[0], 1,100);
temp=temp1[0];) E3 B3 d) g* r% g% X4 T: d
return temp;
}0 y6 s$ b2 v5 `- l
void SPI_FLASH_WaitForWriteEnd(void) - A3 A7 G3 p9 m
{ " h9 a/ o/ Q# Z0 G- h. p y1 m
uint8_t FLASH_Status=0;
uint8_t temp1[1];! [6 M# C6 F- x+ i$ m! I
SPI_FLASH_CS_LOW();7 D* \" @9 @. \/ {) d0 Q1 ]
HAL_SPI_Transmit(&hspi1, &W25X_ReadStatusReg, 1, 100); " _# Q9 K3 Z! N v3 {- G$ P( p
do
{
HAL_SPI_TransmitReceive(&hspi1, &Dummy_Byte, &temp1[0], 1,100);
FLASH_Status = temp1[0];
}
while ((FLASH_Status & WIP_Flag) == SET);
SPI_FLASH_CS_HIGH();
}
这是用调用到的函数
SPI的引脚配置可以这样设置吗? /**SPI1 GPIO Configuration ' u6 H8 g. f9 N( K
PB3 ------> SPI1_SCK
PB4 ------> SPI1_MISO# x% x5 }1 ^5 |* d! [( j
PB5 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;: [; B4 {. v+ Q3 y* E: K
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)
{' p( X9 X2 E; A! x+ x: y9 m% ]( G
SPI_FLASH_WriteEnable();& L+ l6 s' m5 y- I
SPI_FLASH_CS_LOW();
SPI_FLASH_SendByte(W25X_SectorErase);
SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);% G0 `9 E3 q/ R d0 }
SPI_FLASH_SendByte(SectorAddr & 0xFF);9 h1 Y# l B. @; j/ W
SPI_FLASH_CS_HIGH();
SPI_FLASH_WaitForWriteEnd();
}
äºååèæ°ï½å¤§éª
一般不应该是0,如果读不到,应该是FF