spi nor flash使用汇总

Posted ph-one

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spi nor flash使用汇总相关的知识,希望对你有一定的参考价值。

Overview

SPI flash, 分为spi flash, DUAL spi flash, QUAD spi flash,

3-wire spi, 4-wire spi, 6-wire spi. 在clock一定的情况下, 理论上线数越多速度越快

技术分享图片

 

NOR flash和Nand flash相比 

  • NOR缺点: 价格贵, 容量小, 擦除块大, 擦除速度慢, NOR flash擦出寿命为100,000次, 远小于NAND flash的一百万次. NOR可以单字节编程, 也就是说一次只更新一个byte
  • NOR优点: 读速度快, 稳定不会出现位反转, 不需要EDC和ECC,  不需要坏块管理
  • NOR flash通常一次可以写一个字节, NAND flash内存必须一次写多个字节(通常为512字节)

NOR flash的优缺点决定了它的应用场: 适合存储关键很少修改的数据, 比如bootloader kernel等代码;不适合尺寸较大经常修改的数据,比如用户地图, 库文件等

 

3 wire SPI

正常的SPI使用四根线: clock, cs, MOSI, MISO. 可以把MOSI MISO合并为一根线(slave out/slave in SISO)上实现半双工. 主要用来实现低速传输

DUAL SPI

对于SPI flash来说, 全双工并不常用, 因此扩展这两根数据线, 使得他们支持半双工传输, 加倍数据传输速度. 可以发送一个命令字节请求进入dual mode, 然后MOSI就变成了SIO0(Serial I/O 0), MISO变成了SIO1.

这种模式主要是针对SPI ROM, SPI flash设备, 需要进行大数据量传输

QUAD SPI

quad SPI又增加了两根I/O线(SIO2 SIO3), 可以在一个时钟周期传送四个data bits. 通过使用特殊的命令, 使能quad mode.

Double data rate

除了使用多根I/O线, 某些设备还通过DDR技术增加传输速率

 

SPI NOR flash文件系统支持

NOR flash和普通机械硬盘, SSD, EMMC的最大区别就是NOR flash在写之前,需要确保写的位置是已经擦除过的, 因此并不适合使用传统的Ext2/3/4, FAT/NTFS等文件系统

甚至YAFFS类的文件系统也不适合NOR flash

 

JFFS和JFFS2

这两个文件系统都可以支持NOR flash, 并且提供了垃圾回收, 坏块管理, 磨损平衡. 二者都存在文件系统mount速度较慢的问题, 不适合大容量flash

YAFFS/YAFFS2

已经被踢出主线内核了, 基本废弃了.

 

Cramfs/Squashfs

常规的只读文件系统, 都支持数据压缩, 实现简单, 速度快, 如果NOR flash存放的文件系统是只读的, 尽量使用他们. 这些常规文件系统工作在传统块设备上, 需要内核支持

CONFIG_MTD_BLKDEVS=y
CONFIG_MTD_BLOCK=y

 

Ext2/3/4 FAT/NTFS

支持读写的块设备文件系统不适合工作用在NOR flash上, 因为NOR flash写操作会导致擦除操作, 速度慢, 影响寿命.

 

MTD模拟block device

打开CONFIG_MTD_BLOCK和CONFIG_MTD_BLKDEVS

启动后/dev/下会增加几个block设备

 

[cpp] view plain copy
 
  1. [email protected]:~# ls /dev/mtd  
  2. mtd0       mtd1       mtd2       mtd3       mtdblock0  mtdblock2    
  3. mtd0ro     mtd1ro     mtd2ro     mtd3ro     mtdblock1  mtdblock3  


 

 

使用mkfs.ext4, 格式化mtdblock,

 

[cpp] view plain copy
 
  1. [email protected]:~# mkfs.ext4 /dev/mtdblock3  
  2. mke2fs 1.42.9 (28-Dec-2013)  
  3. Filesystem label=  
  4. OS type: Linux  
  5. Block size=1024 (log=0)  
  6. Fragment size=1024 (log=0)  
  7. Stride=0 blocks, Stripe width=0 blocks  
  8. 1856 inodes, 7424 blocks  
  9. 371 blocks (5.00%) reserved for the super user  
  10. First data block=1  
  11. Maximum filesystem blocks=7602176  
  12. 1 block group  
  13. 8192 blocks per group, 8192 fragments per group  
  14. 1856 inodes per group  
  15.   
  16. Allocating group tables: done                              
  17. Writing inode tables: done                              
  18. Creating journal (1024 blocks): done  
  19. Writing superblocks and filesystem accounting information: done  

 

使用dd命令, 写入cramfs镜像

首先, 在Host创建cramefs镜像

 

[cpp] view plain copy
 
  1. mkfs.cramfs rootfs/ cramfs.img  

 

dd命令导入镜像

 

[cpp] view plain copy
 
  1. [email protected]:~# dd if=/dev/mtdblock3 of=cramfs.img     
  2. 14848+0 records in  
  3. 14848+0 records out  
  4. [email protected]:~# ls -l  
  5. -rw-r--r--    1 root     root       7602176 Jan  1 00:24 kaka.img  
  6. [email protected]:~#   

 

 

NOR flash使用JFFS2

NOR flash上运行JFFS2, JFFS2通过MTD接口操作NOR flash

创建JFFS2镜像

mkfs.jffs2工具在mtd-utils工具包中

 

[cpp] view plain copy
 
  1. sudo apt-get install mtd-utils  
  2.   
  3. mkfs.jffs2 -r rootfs/ -o jffs2.img --pad=0x800000  

--pad=0x800000 如果不加这个参数, 生成的镜像尺寸(文件系统大小)是按照rootfs/小内容大小决定的;通过这个参数我们可以强制指定文件系统大小

 

烧写JFFS2镜像

有两种烧写方法:

1. 在uboot中把jffs2.img下载到DRAM中, 然后使用sf write命令把DRAM内容烧写到nor flash上

2. 进入系统后使用 dd if=jffs2.img of=/dev/mtdblock4

二者性质上实际相同, 都是直接把镜像烧到NOR flash某段内存中

 

挂载JFFS2文件系统

首先kernel要支持jffs2文件系统, 执行如下命令

 

[cpp] view plain copy
 
  1. mount -t jffs2 /dev/mtdblock4 /mnt  

 

 

文件系统挂载速度

由于JFFS2在挂载过程中需要执行扫描, 构造文件系统, 因此在同样大小的mtdblock上, JFFS2挂载时间远大于EXT4文件系统

 

文件系统尺寸为0x740000(7.25MB)

 

[cpp] view plain copy
 
  1. Ext4挂载时间  
  2.   
  3. [email protected]:~# time mount -t ext4 /dev/mtdblock3 /mnt                                                                                                                
  4. real    0m 0.06s  
  5. user    0m 0.00s  
  6. sys     0m 0.00s  

 

 

 

[cpp] view plain copy
 
  1. JFFS2挂载时间  
  2.   
  3. [email protected]:~# time mount -t jffs2 /dev/mtdblock3 /mnt  
  4. real    0m 0.34s  
  5. user    0m 0.00s  
  6. sys     0m 0.33s  



 





以上是关于spi nor flash使用汇总的主要内容,如果未能解决你的问题,请参考以下文章

SPI FLASH与NOR FLASH的区别?

转SPI FLASH与NOR FLASH的区别 详解SPI FLASH与NOR FLASH的不一样

SPI FLASH与NOR FLASH的区别?

宏旺半导体科普SPI NAND Flash和SPI NOR Flash的区别

SPI Nor Flash多核程序烧写

嵌入式开发之hi3519---spi nor flash启动