在N32WB031的例程中提供了基于W25Q128的读写测试程序,但对于W25Q系列的不同存储芯片,其芯片识别ID是不同的。
为了测试手头的W25Q16模块,需多例程进行相应的修改。
例如对于W25Q128的定义为:
#define sFLASH_W25Q128_ID 0x00EF4014
而对于W25Q16来说需进行如下的修改:
#define sFLASH_M25Q16_ID 0xEF4015
#define sFLASH_ID sFLASH_M25Q16_ID
W25Q16模块与开发板的连接关系为:
CS---PA0
CLK---PA1
DO---PA3
DI---PA2
为便于以LED来指示测试的结果,对LED的定义为:
#define LED1_PORT GPIOB
#define LED1_PIN GPIO_PIN_0
#define LED2_PORT GPIOA
#define LED2_PIN GPIO_PIN_6
对W25Q16模块进行读写的测试主程序为:
int main(void)
{
LedInit(LED1_PORT, LED1_PIN);
LedInit(LED2_PORT, LED2_PIN);
LedOff(LED1_PORT, LED1_PIN);
LedOff(LED2_PORT, LED2_PIN);
sFLASH_Init();
FlashID = sFLASH_ReadID();
if (FlashID == sFLASH_ID)
{
sFLASH_EraseSector(FLASH_SectorToErase);
sFLASH_WriteBuffer(Tx_Buffer, FLASH_WriteAddress, BufferSize);
sFLASH_ReadBuffer(Rx_Buffer, FLASH_ReadAddress, BufferSize);
TransferStatus1 = Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);
sFLASH_EraseSector(FLASH_SectorToErase);
sFLASH_ReadBuffer(Rx_Buffer, FLASH_ReadAddress, BufferSize);
for (Index = 0; Index < BufferSize; Index++)
{
if (Rx_Buffer[Index] != 0xFF)
{
TransferStatus2 = FAILED;
}
}
if((TransferStatus1 == SUCCESS) && (TransferStatus2 == SUCCESS))
{
/* OK: Turn on LED1 */
LedOn(LED1_PORT, LED1_PIN);
}
else
{
/* Error: Turn on LED2 */
LedOn(LED2_PORT, LED2_PIN);
}
/* TransferStatus2 = PASSED, if the specified sector part is erased */
/* TransferStatus2 = FAILED, if the specified sector part is not well erased */
}
else
{
/* Error: Turn on LED2 */
LedOn(LED2_PORT, LED2_PIN);
}
while (1)
{
}
}
在编译下载程序后,其测试效果如图所示,由于LED1被点亮说明测试成功;反之若去掉W25Q16模块的电源,则LED2被点亮说明测试失败。
有了W25Q16模块这样的外挂存储器,可以有效地对存储空间进行扩展。
图1 读写状态
图2 未连接状态