使用IP Command方式访问Flash 手册1673页

 

在以下步骤中,可以由IP命令触发闪存访问。

  1. 填充IP TX FIFO与编程数据,如果这是一个编程命令(编程flash数据,flash状态寄存器等)
  2. 设置flash访问起始地址,读取/程序数据大小,LUT中的序列索引和序列号。
  3. 通过向寄存器位IPCMDI[TRG]写入1来触发flash访问
  4. 命令轮询寄存器位INTR[IPCMDDONE]引发等待这个IP命令完成FlexSPI接口。

请注意

  1. IP TX FIFO可以在写入IPCRO/ IPCR1/IPCMD寄存器之前或之后填写。如果在IP TX FIFO为空的情况下启动SFM命令,FlexSPI将停止SCLK切换以自动等待TX数据就绪。
  2. IPCMD寄存器必须在写入IPCRO后写入PCRI 注册表。
  3. 一个IP命令可以发出多个命令序列(最多8个)。
  4. 在前一个IP命令完成之前,不允许发出另一个IP命令。在这种情况下,行为是未知的。

如果这是一个读取串行闪存命令,所有从闪存读取的数据将被放入IP RX FIFO。软件将需要读出数据从IP RX FIFO的AHB总线或IP总线。当IP RX FIFO是满的,有更多的数据要从闪存设备读取,FlexSPI将停止SCLK输出时钟切换,直到IP RX FIFO不是满的。有关更多细节,请参阅SCLK停止功能。

触发串行Flash命令的细节如下:

Flash访问开始地址:

由寄存器字段IPCRO[SFAR]确定

Flash芯片选择:

由闪存访问地址和闪存大小设置决定(FLSHxCRO[FLSHSZ)。

Flash命令序列索引和序列号:

序列索引从IPCR1 ISEQID]到(IPCRIISEQID] +在LUT中将由FlexSPI顺序执行。

Flash独立/并行访问模式:

由IPCR1IIPARENI决定

Flash读取/程序数据大小:

如果IPCR1[IDATSZ]值非零,flash读取/程序数据大小(字节)为IPCR1[IDATSZ]

如果IPCR1[IDATSZ]值为0,flash读取/程序数据大小(字节)是在读/写指令中操作数的值。

请注意

软件应确保最后的序列索引不超过LUT序列号(IPCRIIISEOIDI +)IPCRIiseonumi= 16)。

如果序列号大于1,则数据大小将被应用于每个命令序列。

如果命令序列中没有写/读指令,则忽略数据大小。

IP命令请求被软件触发后发送给仲裁器。它不会在FlexSPI接口上执行,直到被仲裁员批准。详情请参阅指挥仲裁。

从IP RX FIFO中读取数据

对IP command 方式来说,FlexSPI将从外部器件读到的数据放在IP RX FIFO中。这些数据可以通过访问以下两种存储空间的方式读出。

0x100-180 (IPS Bus)

0x7FC00000 – 0x7FC00080 (by AHB Bus)

如果MCR0[ARDFEN]被设置为1,在IP RX FIFO中的数据只能被AHB Bus 读出,IP Bus 访问的时只会返回0,且不会产生总线错误。

如果MCR0[ARDFEN]被设置为0,在IP RX FIFO中的数据只能被IPS Bus 读出,AHB BUS 访问的时只会返回0,并且会触发总线错误。

FlexSPI推送读取到的数据到IP RX FIFO,每次64位。当读取的数据位数不是64位对齐的,在最后一次推送时,FlexSPI将向IP RX FIFO中推送额外的零位(补零)。

IP RX FIFO可以被处理器或DMA读取。下面是处理器和DMA读取的详细流程:

为了使用处理器读取,以下寄存器需要被设置:

  1. 寄存器IPRXFCR[RXDMAEN]字段设置为0;
  2. 设置IPRXFCR[RWMARK](水印级别?)寄存器字段,水印级别 = ( IPRXFCR[RWMARK]+1)*8 bytes
  3. 设置寄存器字段INTEN[IPRXWA] 来使能IP RX FIFO 水平级别可用中断(可选)

在读IP RX FIFO之前,处理器需要轮询寄存器INTR[IPRXWA]或等待IP RX FIFO水印可用中断。这是为了确保在读取之前在IP RX FIFO中填充了水印级别的数据。

从IPRX FIFO读取水印水平数据后,软件需要设置INTEN[IPRXWA]位。这个设置操作将从IP RX FIFO弹出一个水印级别数据。

以下图形表示处理器从IP RX FIFO中读取数据

DMA方式读取

猜你喜欢

转载自blog.csdn.net/catshit322/article/details/108184279