网上有不少例子,都对,但对我来说碰到几个坑,避免以后再犯错,mark下。
目标:通过SPI接口,对Nor Flash进行读写
开发板上Nor Flash 是W25Q128, 128Mbit,也就是16MB样子
CubeMx端配置,配置要分两个:
- 一个SPI本身的(需要配置三个复用GPIO口)
- 还要单独配置一个CS口(也是GPIO,起到片选作用)
切记,要根据原理图来配置,千万不用使用默认
切记,要根据原理图来配置,千万不用使用默认
切记,要根据原理图来配置,千万不用使用默认
先来看下原理图:
由原理图得出结论:
SPI FLASH 是挂载在SPI1上面,这个要记住的
通过搜索:知道对应关系
|-----------|------|----------------|
| FLASH_CS | PB14 | 片选,要记住,代码里要自己改 |
| SPI1_SCK | PB3 | 时钟 |
| SPI1_MISO | PB4 | 发送 |
| SPI1_MOSI | PB5 | 输入 |
CubeMX端配置:
Connectivity - 选择SPI1,然后选择 Full-Duplex Master
此时,SPI1会默认关联三个IO口,好像是PA5~7,注意:默认跟原理图是不一致的!
这里还要手动再配一下,这个地方搞了好久,一开始没有注意到!!以为默认都是对的!!
找到PB3,然后选择SPI1_SCK。依次类推,把PB4、PB5都设置下!!!
片选那边IO,到还好,在GPIO里面配置。
接下去就是代码部分:
网上有不少驱动程序,可以去下载,大部分都可以用。实际上大部分SPI的操作,包括读写都是:
- 片选信号拉低
- 发送指令
- 操作写(顺便读)
- 片选信号拉高
所有操作都是以上套路,知道就好,网上down个驱动,就可以操作了。需要改动的地方就是
#define _W25QXX_CS_GPIO GPIOB
#define _W25QXX_CS_PIN GPIO_PIN_14
片选信号的IO信息要改成你自己的,其他好像不用怎么改
还有奇葩:
要想写入数据,必须先擦除(已擦除可以写入)