神舟IV学习笔记(十)SPI存储W25X16
2020-12-21 来源:eefocus
SPI是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在 EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为 PCB 的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,STM32 也有 SPI 接口。
SPI 接口一般使用 4 条线:
MISO 主设备数据输入,从设备数据输出。
MOSI 主设备数据输出,从设备数据输入。
SCLK 时钟信号,由主设备产生。
CS 从设备片选信号,由主设备控制。
SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。SPI总线四种工作方式SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果 CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果 CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI 主模块和与之通信的外设备时钟相位和极性应该一致。
STM32 的 SPI 功能很强大,SPI 时钟最多可以到 18Mhz,支持 DMA,可以配置为 SPI 协议或者 I2S 协议。
SPI1的使用就介绍到这里,接下来介绍一下 W25X16。W25X16是华邦公司推出的继W25X10/20/40/80(从 1Mb~8Mb)后容量更大的 FLASH 产品,W25X16 的容量为 16Mb,还有容量更大的 W25X32/64,ALIENTEK 所选择的 W25X16 容量为 16Mb,也就是 2M 字节,同AT45DB161 是一样大小的。 W25X16 将 2M 的容量分为 32 个块(Block),每个块大小为 64K 字节,每个块又分为 16个扇区(Sector),每个扇区4K个字节。W25X16 的最少擦除单位为一个扇区,也就是每次必须擦除 4K 个字节。这样我们需要给 W25X16 开辟一个至少 4K 的缓存区,这样对 SRAM 要求比较高(相对于 AT45DB161 来说),但是它有价格及供货上的优势。 W25X16 的差些周期为10000 次,具有20 年的数据保存期限,支持电压为2.7~3.6V,W25X16支持标准的 SPI,还支持双输出的 SPI,最大 SPI 时钟可以到 75Mhz(双输出时相当于 150Mhz),更多的 W25X16 的介绍,请参考 W25X16 的 DATASHEET。
软件我把W25X16需要调用的函数封装到一个文件中
void W25X16_Configuration(void);
void SPI_FLASH_SectorErase(u32 SectorAddr);
void SPI_FLASH_BulkErase(void);//Erases the entire FLASH
void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite);
void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite);
void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead);
u32 SPI_FLASH_ReadID(void);//是常量0XEF3015,可以用于判断是否存在W32X16芯片
u32 SPI_FLASH_ReadDeviceID(void);
void SPI_FLASH_StartReadSequence(u32 ReadAddr);
void SPI_Flash_PowerDown(void);
void SPI_Flash_WAKEUP(void);
我们实现写一些数据到FLASH里,再读出来看看是不是一样的,测试结果
看出能够检测到FLASH,写入一些字符串,也能读出。