在存储空间有限的情况下,可以外挂的形式加以扩展,这里所用的一款W25Q16存储模块。
该存储模块与开发板的连接关系为:
W25Q16:
PA10 -- FLASH SCK
PA11 -- FLASH DO
PA12 -- FLASH DI
PA4 -- FLASH CS
为用串口来输出测试信息,需外挂USB转TTL模块,它与开发板的连接关系为:
PA08 -- PC_RX
PA09 -- PC_TX
在读写测试过程中,可通过板载LED来指示测试结果。
在未连接W25Q16模块的情况下,其测试结果如图1所示。
图1 未连接状态
在连接W25Q16模块的情况下,其测试结果如图2所示。
说明线路连接正确,且可以读出该模块的识别ID。
图2 连接状态
但测试结果为什么并不成功呢?
这主要是因为所用的W25Q16与W25Q64其识别ID并不相同,故导致了测试的失败。
那该如何进行修改呢?
原定义的识别信息为:
#define sDeviceID 0x16
#define sManufactDeviceID 0xEF16
#define sJedecID 0xEF4017
这里需将定义信息修改为:
#define sDeviceID 0x14
#define sManufactDeviceID 0xEF14
#define sJedecID 0xEF4015
这样就可以得到图3所示的测试结果,说明测试是成功的。
图3 测试成功
为了以LED2指示测试成功,以LED4指示测试失败,需对主程序加以修改,修改后的内容为:
int32_t main(void)
{
RCC_Configuration();
GPIO_Configuration();
UART_Configuration();
SPI_FLASH_Init();
printf("\r\nCW32F030 SPI FLASH Example\r\n");
DeviceID = SPI_FLASH_DeviceID();
ManufactDeviceID = SPI_FLASH_ManufactDeviceID();
JedecID = SPI_FLASH_JedecID();
SPI_FLASH_UniqueID(UniqueID);
printf("\r\nDeviceID = 0x%X\r\nManufactDeviceID = 0x%X\r\nJedecID =0x%X", DeviceID, ManufactDeviceID, JedecID);
printf("\r\nUniqueID = 0x ");
for(uint8_t i = 0;i<8;i++)
{
printf("%X ", UniqueID[i]);
}
if(JedecID == sJedecID)
{
printf("\r\n\nFLASHDetected\r\n");
SPI_FLASH_SectorErase(FLASH_SectorToEraseAddress);
SPI_FLASH_BufferWrite(TxBuffer,FLASH_WriteAddress, BufferSize);
printf(("\r\n写入的数据为:%s\r\n",TxBuffer);
SPI_FLASH_BufferRead(RxBuffer,FLASH_ReadAddress, BufferSize);
printf("\r\n读出的数据为:%s\r\n",RxBuffer);
TransferStatus = Buffercmp(TxBuffer,RxBuffer, BufferSize);
SPI_FLASH_SectorErase(FLASH_SectorToEraseAddress);
SPI_FLASH_BufferRead(RxBuffer,FLASH_ReadAddress, BufferSize);
if(TransferStatus == PASSED)
{
PA07_SETLOW();
printf("\r\nFLASHSuccess\r\n");
}
else
{
PC13_SETLOW();
printf("\r\nFLASH Error 1\r\n");
}
for(uint8_t j = 0; j < BufferSize; j++)
{
if(RxBuffer[j] != 0xFF)
{
PC13_SETLOW();
printf("\r\nFLASH Error2\r\n");
}
}
}
else
{
PC13_SETLOW();
printf("\r\nFLASHError 3\r\n");
}
while(1)
{
}
}
在编译下载程序后,其测试效果如图4所示。
图4 测试效果
此外,将W25Q16模块与TFT屏显示相结合,则可实现图像的显示,见图5所示。若将多幅图片存放到W25Q16中,则可实现数码相框的功能。
常规的图像显示函数为:
void showimage(const unsigned char *p)
{
int i,j,k;
unsignedchar picH,picL;
Lcd_Clear(RED);
Lcd_SetRegion(0,0,127,159);
for(i=0;i<128*160;i++)
{
picL=*(p+i*2+1);
picH=*(p+i*2);
LCD_WriteData_16Bit(picH<<8|picL);
}
}
从W25Q16读取数据来再现图像的主要程序为:
for(k=0;k<2560;k++)
{
SPI_FLASH_BufferRead(Buffer,Addr, 16);
for(j=0;j<8;j++)
{
picL=Buffer[j*2+1];
picH=Buffer[j*2];
LCD_WriteData_16Bit(picH<<8|picL);
}
Addr=Addr+0x00010;
}
图4 图像显示效果