1#
发表于 2015-06-21 21:58:22
QSPI 线性模式例子只能运行一次,设置为IO模式可以反复运行
14.4带有一个QSPI工作在线性模式的例子,xqspips_flash_lqspi_example.c。它先假设QSPI工作在IO模式,读取QSPI的ID,再向QSPI写入数据,然后设置QSPI工作在线性模式,读取数据,并和写入的数据做校验。第一次运行正常。
如果单板不下电,第二次运行时,QSPI还工作在线性模式,读取ID的操作就不能完成,一直在循环,测试就会失败。
为了让QSPI测试程序可以多次运行,最好在程序结束前,重新设置其工作模式。设置工作模式的代码是:
XQspiPs_SetOptions(QspiInstancePtr, XQSPIPS_FORCE_SSELECT_OPTION |
XQSPIPS_MANUAL_START_OPTION |
XQSPIPS_HOLD_B_DRIVE_OPTION );
u32Option = XQspiPs_GetOptions( QspiInstancePtr );
xil_printf("QSPI option: 0x%x before exit.\n\r", u32Option );
ControlReg = XQspiPs_ReadReg(QspiInstancePtr->Config.BaseAddress,
XQSPIPS_CR_OFFSET);
LinearControlReg = XQspiPs_ReadReg(QspiInstancePtr->Config.BaseAddress,
XQSPIPS_LQSPI_CR_OFFSET);
xil_printf("ControlReg: 0x%08x, LinearControlReg: 0x%08x, .\r\n", ControlReg, LinearControlReg);
或者在进入测试时,检查QSPI的工作模式。如果没有工作在IO模式,则强制设置成IO模式。代码如下:
ControlReg = XQspiPs_ReadReg(QspiInstancePtr->Config.BaseAddress,
XQSPIPS_CR_OFFSET);
LinearControlReg = XQspiPs_ReadReg(QspiInstancePtr->Config.BaseAddress,
XQSPIPS_LQSPI_CR_OFFSET);
xil_printf("ControlReg: 0x%08x, LinearControlReg: 0x%08x, .\r\n", ControlReg, LinearControlReg);
if ((LinearControlReg & XQSPIPS_LQSPI_CR_LINEAR_MASK) != 0) {
xil_printf("QSPI works as linear mode before.\r\n");
LinearControlReg &= 0x7fffffff;
XQspiPs_WriteReg(QspiInstancePtr->Config.BaseAddress,
XQSPIPS_LQSPI_CR_OFFSET, LinearControlReg);
}
|