工程系统框图
本次工程的系统框图如下:
在本次工程设计中,使用QSPI Flash控制器对ZYNQ的QSPI Flash进行读写操作。通过对比读取数据和写入数据是否相等验证读写功能是否正常。
硬件平台搭建
新建工程,创建 Block Design。添加ZYNQ7 ip,根据本次工程需要对IP进行配置。勾选本次工程使用的资源。
完成对所用资源的勾选,
在clock configuration这里可以查看对QSPI的时钟配置。
这里不需要对其他资源进行配置,所以可以使用默认配置。
整体硬件系统构建完成如下:
然后我们进行generate output product 然后生成HDL封装。这里用到了仅仅用到了PS部分的资源,所以不需要进行管脚分配。点击导出硬件资源(不用包含bit流文件),接着launch SDK,进入软件部分编写。
SDK软件部分
打开SDK后,新建application project。
在system.mss中可以打开相关参考文档辅助设计。
可以选择qspi的例程进行参考设计,导入例程模板,
根据提供的模板,主要使用的函数如下,这里对他的读写测试进行了简化,
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; }
运行效果
读写测试正常,运行效果如下:
References
- ZYNQ正点原子开发视频
- UG585