|
试验目的:芯片采用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的操作了。 / r8 C6 {8 |1 F( q |
微信公众号
手机版
void SPI_FLASH_WriteEnable(void)9 S9 {6 e' a" g7 |
{1 O3 f" [0 P9 |
SPI_FLASH_CS_LOW();8 j) u0 o0 t/ |0 g
HAL_SPI_Transmit(&hspi1, &W25X_WriteEnable, 1, 100);2 d, x d% m! Y2 U0 o
SPI_FLASH_CS_HIGH();
}3 c/ R9 L( e& {. W* m0 |3 I& e1 R
uint8_t SPI_FLASH_SendByte(uint8_t byte)4 l) r" S$ j: e. D
{, c0 ]6 `$ E. O- k8 z) I. V6 e
uint8_t temp;
uint8_t temp1[1];: T x! g* j; d: a$ W' C- K" _
HAL_SPI_TransmitReceive(&hspi1, &byte, &temp1[0], 1,100); O7 L o4 W- A5 b, T+ `
temp=temp1[0];; L, `9 L9 w0 f5 V7 [
return temp;
}
void SPI_FLASH_WaitForWriteEnd(void) , t% s4 R; L, a1 B
{ & {; K1 F! Q( W" ~$ b v
uint8_t FLASH_Status=0;: C- F2 z1 p2 V1 Q
uint8_t temp1[1];4 y( ]. ^9 S- |& z/ `
SPI_FLASH_CS_LOW();8 E* C1 `+ k* y0 n. V
HAL_SPI_Transmit(&hspi1, &W25X_ReadStatusReg, 1, 100); : s. W. [- B2 Q. N; L+ O
do8 Q0 N" T" `7 u" D$ ^) n3 C
{* _9 b! M, ]% E& F5 k
HAL_SPI_TransmitReceive(&hspi1, &Dummy_Byte, &temp1[0], 1,100); ]0 ?" |6 g+ r' P) d$ _
FLASH_Status = temp1[0];+ k4 v0 A( i( p+ n6 i
}
while ((FLASH_Status & WIP_Flag) == SET);
SPI_FLASH_CS_HIGH();
}
这是用调用到的函数
SPI的引脚配置可以这样设置吗? /**SPI1 GPIO Configuration
PB3 ------> SPI1_SCK
PB4 ------> SPI1_MISO
PB5 ------> SPI1_MOSI 1 _6 j2 Y6 N5 c+ G% p& l: k3 F
*/
GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;5 n% m; v$ X; [4 p
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;! U( d7 _# n& o( \. a
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
void SPI_FLASH_SectorErase(uint32_t SectorAddr)9 \8 ^9 t: N( i/ I
{
SPI_FLASH_WriteEnable();
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);. m# M. J* D9 ]; O! z" R6 n2 d
SPI_FLASH_CS_HIGH();0 g* B- z0 q+ L! k# Q9 P$ z" K
SPI_FLASH_WaitForWriteEnd();
}
äºååèæ°ï½å¤§éª
一般不应该是0,如果读不到,应该是FF