本帖最后由 jinglixixi 于 2021-10-31 15:27 编辑
在星空派的开发板上,配有FLASH 型存储器GD25Q40,利用它可以解决扩展内存的需要。 在使用例程进行测试的情况下,其结果如图1和图2所示。
图1 测试结果上部
图2 测试结果下部 经程序分析和数据对比可以发现,该程序的作用是通过收发2个数组来存储对应的数据以供收发处理和对比判别。由于是对一个扇区进行验证,故数组的大小取256 。 此外,进行测试的区域是GD25Q40的首个扇区,测试的数据是由0到255的256个数,即0x00~0xFF。 为了将其作为图库来使用,故将TFT屏的显示程序也添加进来。 实现是解决了在屏幕上显示GD25Q40的检测结果,见图3所示。
图3显示检测信息 随后,又解决了数据的显示问题,其显示如图4所示。
图4 显示检测数据 显示图4显示效果的关键程序如下:
- spi_flash_init();
- /* get chip serial number */
- get_chip_serial_num();
- /* get flash id */
- flash_id = spi_flash_read_id();
- printf("nrThe Flash_ID:0x%Xnr",flash_id);
- LCD_ShowString(0,120,"Flash_ID:",YELLOW);
- LCD_ShowNum(0,140,flash_id,6,YELLOW);
- /* flash id is correct */
- if(SFLASH_ID == flash_id){
- printf("nrnrWrite to tx_buffer:nrnr");
- LCD_ShowString(0,160,"Write to tx_buffer:",YELLOW);
- /* printf tx_buffer value */
- for(i = 0; i < 20; i ++){
- tx_buffer[i] = i;
- printf("0x%02X ",tx_buffer[i]);
- if(i<10) LCD_ShowNum(i*24,180,tx_buffer[i],2,WHITE);
- else LCD_ShowNum((i-10)*24,200,tx_buffer[i],2,WHITE);
- if(15 == i%16)
- printf("nr");
- }
- printf("nrnrRead from rx_buffer:nr");
- LCD_ShowString(0,220,"Read from rx_buffer:",YELLOW);
- /* erases the specified flash sector */
- spi_flash_sector_erase(FLASH_WRITE_ADDRESS);
- /* write tx_buffer data to the flash */
- spi_flash_buffer_write(tx_buffer,FLASH_WRITE_ADDRESS,TX_BUFFER_SIZE);
- delay_1ms(10);
- /* read a block of data from the flash to rx_buffer */
- spi_flash_buffer_read(rx_buffer,FLASH_READ_ADDRESS,RX_BUFFER_SIZE);
- /* printf rx_buffer value */
- for(i = 0; i < 20; i ++){
- printf("0x%02X ", rx_buffer[i]);
- if(i<10) LCD_ShowNum(i*24,240,tx_buffer[i],2,WHITE);
- else LCD_ShowNum((i-10)*24,260,tx_buffer[i],2,WHITE);
- if(15 == i%16)
- printf("nr");
- }
- if(ERROR == memory_compare(tx_buffer,rx_buffer,256)){
- printf("Err:Data Read and Write aren't Matching.nr");
- LCD_ShowString(0,280,"SPI-GD25Q40 Test Fail!",YELLOW);
- is_successful = 1;
- }
- /* spi flash test passed */
- if(0 == is_successful){
- printf("nrSPI-GD25Q16 Test Passed!nr");
- LCD_ShowString(0,280,"SPI-GD25Q40 Test Passed!",YELLOW);
- }
- }else{
- /* spi flash read id fail */
- printf("nrSPI Flash: Read ID Fail!nr");
- LCD_ShowString(0,140,"Read ID Fail!",YELLOW);
- }
复制代码
以此为基础,又继续添加了读写图片的显示程序,其结果如图5所示。
图5图片显示效果 注:上部的是读取数组所显示的图片,下部是读写W25Q40所显示的图片。 产生图5所示效果的程序为:
- spi_flash_init();
- /* get chip serial number */
- get_chip_serial_num();
- /* get flash id */
- flash_id = spi_flash_read_id();
- if(SFLASH_ID == flash_id){
- k=0;
- dz=0;
- Address_set(0,120,159,199);
- for(j = 0; j < 100; j++){
- for(i = 0; i < BUFFER_SIZE; i++){
- tx_buffer[i] = gImage_YX[k];
- k++;
- }
- spi_flash_sector_erase(j);
- spi_flash_buffer_write(tx_buffer,dz,TX_BUFFER_SIZE);
- spi_flash_buffer_read(rx_buffer,dz,RX_BUFFER_SIZE);
- for(i = 0; i < BUFFER_SIZE; i++){
- LCD_WR_DATA8(rx_buffer[i]);
- }
- dz=dz+0x0100;
- }
- delay_1ms(2000);
- }
复制代码
通过对图片显示效果的分析,可以看出图片上部的1/4图像是正常的,但其它部分则存在严重的异常,似乎读写出现了问题。 后经查询资料方知,W25Q40一次扇区擦除是4K 字节,再修改程序后终于实现了正常读写和图像的再现,相应的测试效果如图6所示,令人十分高兴!
图6 正常的显示效果
0
|
|
|
|