芯源半导体CW32
直播中

jennyzhaojie

3年用户 67经验值
擅长:测量仪表 嵌入式技术 模拟技术 处理器/DSP 控制/MCU
私信 关注
[经验]

【CW32饭盒派开发板试用体验】+W25Q16读写及应用

在存储空间有限的情况下,可以外挂的形式加以扩展,这里所用的一款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所示。
image.png

图1 未连接状态

在连接W25Q16模块的情况下,其测试结果如图2所示。

说明线路连接正确,且可以读出该模块的识别ID。

image.png

图2 连接状态

但测试结果为什么并不成功呢?

这主要是因为所用的W25Q16与W25Q64其识别ID并不相同,故导致了测试的失败。

那该如何进行修改呢?

原定义的识别信息为:

#define sDeviceID 0x16

#define sManufactDeviceID 0xEF16

#define sJedecID 0xEF4017

这里需将定义信息修改为:

#define sDeviceID 0x14

#define sManufactDeviceID 0xEF14

#define sJedecID 0xEF4015

这样就可以得到图3所示的测试结果,说明测试是成功的。

image.png

图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所示。
image.png

图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;
}

image.png

图4 图像显示效果

更多回帖

发帖
×
20
完善资料,
赚取积分