该QFlash是32MB的,而ZYNQ的控制器是16MB的,所以想使用后半部分时,必须要使用4byte地址模式或者扩展模式。
先调试扩展模式
在QFlash手册里面有一个写扩展模式命令(C5),写命令的时候,然后再读扩展模式寄存器(C8),就可以看到扩展模式寄存器会置一。这样操作flash的时候,就会跳转到16-32MB断读写数据。
但是手册里面有一个没有写清楚的地方,就是写C5的时候,需要先执行写使能,再写入该命令。而4byte地址模式的命令(B7)并不需要先执行写使能。
最开始一直没有执行写使能,就一直没有调试成功。
void FlashEAREnable(XQspiPs *QspiPtr)
{
u8 WriteEnableCmd = {WRITE_ENABLE_CMD};
u8 EARCmd[2] = {WRITE_EAR_CMD, 255};
u8 ReadEarCmd[] = {READ_EAR_CMD, 0xff};
u8 FlashStatus[2] = {0xff, 0xff};
XQspiPs_PolledTransfer(QspiPtr, ReadEarCmd, FlashStatus, sizeof(ReadEarCmd));
xil_printf("EARCmd ReadConfigCmd [0x%02X],[0x%02X], size %d\r\n",FlashStatus[0],FlashStatus[1],sizeof(EARCmd));
XQspiPs_PolledTransfer(QspiPtr, &WriteEnableCmd, NULL, sizeof(WriteEnableCmd));
XQspiPs_PolledTransfer(QspiPtr, EARCmd, NULL, sizeof(EARCmd));
XQspiPs_PolledTransfer(QspiPtr, ReadEarCmd, FlashStatus, sizeof(ReadEarCmd));
xil_printf("EARCmd ReadConfigCmd [0x%02X],[0x%02X]\r\n",FlashStatus[0],FlashStatus[1]);
}
void FlashEARDisable(XQspiPs *QspiPtr)
{
u8 WriteEnableCmd = {WRITE_ENABLE_CMD};
u8 EARCmd[2] = {WRITE_EAR_CMD, 0};
u8 ReadEarCmd[] = {READ_EAR_CMD, 0};
u8 FlashStatus[2];
XQspiPs_PolledTransfer(QspiPtr, ReadEarCmd, FlashStatus, sizeof(ReadEarCmd));
xil_printf("EARCmd ReadConfigCmd [0x%02X],[0x%02X], size %d\r\n",FlashStatus[0],FlashStatus[1],sizeof(EARCmd));
XQspiPs_PolledTransfer(QspiPtr, &WriteEnableCmd, NULL, sizeof(WriteEnableCmd));
XQspiPs_PolledTransfer(QspiPtr, EARCmd, NULL, sizeof(EARCmd));
XQspiPs_PolledTransfer(QspiPtr, ReadEarCmd, FlashStatus, sizeof(ReadEarCmd));
xil_printf("EARCmd ReadConfigCmd [0x%02X],[0x%02X]\r\n",FlashStatus[0],FlashStatus[1]);
}
四字节地址模式后续再尝试