ZYNQ-QSPI Flash读写操作(二)

简介: ZYNQ-QSPI Flash读写操作

工程系统框图


本次工程的系统框图如下:

image.png

在本次工程设计中,使用QSPI Flash控制器对ZYNQ的QSPI Flash进行读写操作。通过对比读取数据和写入数据是否相等验证读写功能是否正常。

硬件平台搭建


新建工程,创建 Block Design。添加ZYNQ7 ip,根据本次工程需要对IP进行配置。勾选本次工程使用的资源。

image.png

完成对所用资源的勾选,

image.png

在clock configuration这里可以查看对QSPI的时钟配置。

image.png

这里不需要对其他资源进行配置,所以可以使用默认配置。

整体硬件系统构建完成如下:

image.png

然后我们进行generate output product 然后生成HDL封装。这里用到了仅仅用到了PS部分的资源,所以不需要进行管脚分配。点击导出硬件资源(不用包含bit流文件),接着launch SDK,进入软件部分编写。

SDK软件部分


打开SDK后,新建application project。

在system.mss中可以打开相关参考文档辅助设计。

image.png

可以选择qspi的例程进行参考设计,导入例程模板,

image.png

根据提供的模板,主要使用的函数如下,这里对他的读写测试进行了简化,

int QspiFlashPolledExample(XQspiPs *QspiInstancePtr, u16 QspiDeviceId)
{
  int Status;
  u8 *BufferPtr;
  u8 UniqueValue;
  int Count;
  int Page;
  XQspiPs_Config *QspiConfig;
  //初始化QSPI
  QspiConfig = XQspiPs_LookupConfig(QspiDeviceId);
  XQspiPs_CfgInitialize(QspiInstancePtr, QspiConfig,QspiConfig->BaseAddress);
  //自测
  Status = XQspiPs_SelfTest(QspiInstancePtr);
  if (Status != XST_SUCCESS) {
    return XST_FAILURE;
  }
  //初始化读写BUFFER
  for (UniqueValue = UNIQUE_VALUE, Count = 0; Count < PAGE_SIZE;
       Count++, UniqueValue++) {
    WriteBuffer[DATA_OFFSET + Count] = (u8)(UniqueValue + Test);
  }
  memset(ReadBuffer, 0x00, sizeof(ReadBuffer));
  //设置手动启动和手动片选模式
  XQspiPs_SetOptions(QspiInstancePtr, XQSPIPS_MANUAL_START_OPTION |
      XQSPIPS_FORCE_SSELECT_OPTION |
      XQSPIPS_HOLD_B_DRIVE_OPTION);
  //设置QSPI时钟的分频系数
  XQspiPs_SetClkPrescaler(QspiInstancePtr, XQSPIPS_CLK_PRESCALE_8);
  //片选信号置为有效
  XQspiPs_SetSlaveSelect(QspiInstancePtr);
  //读FLASH ID
  FlashReadID();
  //使能FLASH Quad模式
  FlashQuadEnable(QspiInstancePtr);
  //擦除FLASH
  FlashErase(QspiInstancePtr, TEST_ADDRESS, MAX_DATA);
  //向FLASH中写入数据
  for (Page = 0; Page < PAGE_COUNT; Page++) {
    FlashWrite(QspiInstancePtr, (Page * PAGE_SIZE) + TEST_ADDRESS,
         PAGE_SIZE, WRITE_CMD);
  }
  //使用QUAD模式从FLASH中读出数据
  FlashRead(QspiInstancePtr, TEST_ADDRESS, MAX_DATA, READ_CMD);
  //对比写入FLASH与从FLASH中读出的数据
  BufferPtr = &ReadBuffer[DATA_OFFSET];
  for (UniqueValue = UNIQUE_VALUE, Count = 0; Count < MAX_DATA;
       Count++, UniqueValue++) {
    if (BufferPtr[Count] != (u8)(UniqueValue + Test)) {
      return XST_FAILURE;
    }
  }
  return XST_SUCCESS;
}

运行效果


读写测试正常,运行效果如下:

image.png

References


  1. ZYNQ正点原子开发视频
  2. UG585
目录
相关文章
|
存储
ZYNQ-pbuf操作指南(一)
ZYNQ-pbuf操作指南
547 0
ZYNQ-pbuf操作指南(一)
|
存储 芯片 内存技术
Jlink使用技巧之读写SPI Flash存储芯片
Jlink使用技巧之读写SPI Flash存储芯片
1054 0
Jlink使用技巧之读写SPI Flash存储芯片
|
6月前
NUC980修改内核支持spi-nand
NUC980修改内核支持spi-nand
78 2
|
存储 芯片
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
491 0
STM32入门开发: 采用IIC硬件时序读写AT24C08(EEPROM)
|
异构计算
nios ii小实验——SDRAM读写
nios ii小实验——SDRAM读写
244 0
nios ii小实验——SDRAM读写
|
存储 内存技术
W25Q16 存储器(Flash)
Flash:闪存-------作用是用于永久保存数据,掉电不会丢失数据,等同于电脑的硬盘和U盘、单片还有其他的存储设备
W25Q16 存储器(Flash)
嵌入式开发学习之--IIC读写EEPROM(上)
嵌入式开发学习之--IIC读写EEPROM(上)
嵌入式开发学习之--IIC读写EEPROM(上)
|
开发工具 内存技术 Perl
如何固化ZYNQ PL端程序到FLASH
ZYNQ7000板子上,PL端逻辑烧写到FLASH里面。怎么办?
|
存储 芯片 内存技术
Jlink使用技巧之烧写SPI Flash存储芯片
Jlink使用技巧之烧写SPI Flash存储芯片
456 0
Jlink使用技巧之烧写SPI Flash存储芯片
|
存储 开发工具 芯片
ZYNQ-QSPI Flash读写操作(一)
ZYNQ-QSPI Flash读写操作
1399 0
ZYNQ-QSPI Flash读写操作(一)