QSPI Flash存储控制器(间接写访问控制器)
1. 间接写访问控制器
间接写操作是协助处理器或DMA将大量数据写入Flash存储。间接写传输可以尽可能减少对Flash设备的写次数,延长Flash设备的使用寿命。
从软件角度看,间接写操作是间接读操作的反过程。软件驱动通过专门的APB控制/配置寄存器来实现间接写操作。这些寄存器包括:
- 间接写传输控制器寄存器(偏移量0x70);
- 间接写传输水印寄存器(偏移量0x74);
- 间接写传输起始地址寄存器(偏移量0x78);
- 间接写传输字节数量寄存器(偏移量0x7C);
间接写访问控制器,首先会等待外部AHB总线主设备的写数据延迟,将数据放置到内部SRAM,然后与传统SPI逻辑通信,最终在外部SPI信号线上完成高效的、优化的Flash写突发操作。
间接写控制器默认状态下是关闭的。软件使能过程与间接读控制器类似(略)。
在间接写模式下,内部SRAM在AHB总线上的地址,参见间接读访问控制器,完全一样(略)。
外部AHB总线主设备只能用32位的AHB写操作,除了最后一个。最后一次,主设备可以做32/16/8位的写操作;如果最后一次少于32位,主设备依然可以做32位传输,间接写访问控制器会抛弃多余的字节。
当内部SRAM的字节数等于或超过Flash页长度(这个可编程设置的,默认256字节,Flash的页长度具体含义是什么呢?),或者SRAM中驻留了当前正在进行的间接传输操作的剩余字节,那么间接写访问控制器就会给命令发生器初始化一个“写突发”
好好看看间接读访问控制器,几乎一模一样。
2. 间接写传输过程(略)
3. 间接访问队列
驱动程序允许将两个间接传输操作给间接访问控制器(包括了读/写),最多两个间接读写操作。多于两个的话,就会触发中断。
驱动程序,通过两个寄存器,间接读/写传输控制寄存器(偏移量为0x60/0x70)的bit[0]将间接读写操作的命令发送给控制器。
SRAM可以同时支持两个间接传输操作,是因为:
- 在SRAM与AHB总线的数据通路上,允许一个间接传输操作
- 在SRAM与SPI总线的数据通路上,允许一个间接传输操作
这两个间接传输操作相互独立,各自占用不同的部件,类似流水线的两个阶段。
4.间接传输的读写交替
在间接写操作未完成之前,软件驱动可以发起一个间接读操作;反过来也一样,在间接读操作未完成之前,软件驱动可以发起一个间接写操作。但是间接写操作具有优先能力(我的理解,写的优先级高,如果发生资源冲突,可能会让当前未完成的读暂停下来)。
5.访问SRAM
内部SRAM是单端口访问的逻辑实现,但是分为两个部分:下半部分供间接读操作;上半部分供间接写操作。SRAM分区配置寄存器(偏移量0x18)具体描述了下部分的长度,上半部分就是剩余的;默认情况下,上下两个半部是平均分的。
访问SRAM有四种情况:
- 间接读操作,从QSPI总线向SRAM传输数据,这种情况优先级最高;
- 间接写操作,从SRAM向QSPI总线传输数据,这种情况优先级次之;
- 间接读操作,从SRAM向AHB总线传输数据,优先级第3,与下面4)情况互斥;
- 间接写操作,从AHB总线向SRAM传输数据,优先级第3,与上面3)情况互斥;
上面看到,SRAM虽然是单端口,但是同时最多可以有三条流来访问。