安德鲁

[原创][连载].基于SOPC的简易数码相框 - Nios II SBTE部分(软件部分) - 从SD卡内读取图片文件,然后显示在TFT-LCD上

0
阅读(6253)

实在很抱歉,时间紧张,我只讲怎样从SD卡内读取bin文件(二进制文件),然后现在TFT-LCD上。

准备工具

1. 463754319081.zip

操作步骤

步骤1 寻找或制作240x320的图片

简单起见,我在谷歌图片里搜索240x320手机壁纸。随便选2张作为样本。


 

步骤2 使用Image2Lcd将图片转换为bin文件

我们先算一下,每个像素需要高8位+低8位,即16位数据,也就是2Byte;那么一张图片的话,就是240*320*2=15, 3600 Byte = 150 KB。

使用Image2Lcd依次打开图片,勾上如下所示的选项,保存为bin文件。


将生成的2个bin文件,拷贝到SD内的任意目录,比方说pic目录下。


步骤3 使用WinHex查找存放1.bin和2.bin的起始扇区及扇区内容

现在还不涉及文件系统,虽然我的sd卡被格式化为fat32。需要文件系统的朋友,请自行研究。

如何使用WinHex,我在前面的SD卡驱动一节有讲。在查看之前,我们先计算一下。1.bin是150KB,而每个扇区仅能存储512B,那么 1.bin需要连续存储300个扇区。2.bin紧随1.bin之后,其存储的起始扇区地址应该滞后1.bin的起始扇区地址300个偏移量。但是我们发 现 ,两者相距的扇区地址偏移量为304,那就意味着多出来4个扇区地址偏移量。我在这里提出这个问题,无意想解答为什么多了4个,而是想说明这个多出来扇区地址偏移量在FAT16和FAT32的文件系统中是不一样的。大家在做这个实验之前最好计算一下。


有了这个信息这后,我们就可以从1.bin的扇区起始地址连续读取300个扇区的数据,并同时将这些数据打到屏上,这就实现了显示SD内的数据的目的。当1.bin显示完毕,我们只需读扇区的起始地址递增304即可。

步骤4 测试

代码4.1 main.c

#include                     // printf()
	#include                    // usleep()
      #include "my_types.h"                 // 数据类型
	#include "debug.h"                    // debug
	#include "sd_card.h"                  // sd_card
	#include "ili932x.h"                  // ili9325
	 
	 
	#define ENABLE_APP_DEBUG // turn on debug message
	#ifdef ENABLE_APP_DEBUG
	    #define APP_DEBUG(x)    DEBUG(x)
	#else
	    #define APP_DEBUG(x)
	#endif
	 
	 
	#define PIC_NUM      2    // 图片数量
	#define START_SECTOR 7816 // 数据存储的起始扇区
	void DispPic_Demo(void)
	{
	  u16 i, j;
	  u8 pic_num=0;         // 照片数量
	  u8 sector_buf[512];
	  u32 sector_addr;
	 
	  sector_addr=START_SECTOR;
	  do
	  {
	    ili_nCS=0;
	    DB_o_EN;
 
	    ili_SetDispArea(0, 0, 240, 320, 0, 0);
	    for(j=0;j<300;j++)   //300表示一幅图片含有300x512字节的信息
	    {
	      SD_CARD_Read_Data_LBA(sector_addr+j, 512, sector_buf);//每次读出512字节放到缓冲区
	      for(i=0;i<256;i++) //然后写到液晶屏,可以显示256个像素,每个像素16位即2个字节
	        ili_WrData(sector_buf[2*i+1],sector_buf[2*i]);
	    }
	 
	    ili_nCS=1;
	 
	    sector_addr += 304;
	    pic_num++;
	    usleep(2*1000*1000); // 延时2s
	  }while(pic_num < PIC_NUM);
	}
	 
	 
	int main()
	{
	  ili_Initial();            // 初始化ILI9325
	  while(SD_CARD_Init() != 0x55);// 初始化SD卡
	  while(1)
	  {
	    DispPic_Demo();
	  }
	  return 0;
	}

在编译和运行之前,把sd_card.h里面的调试宏注释掉,以减少因打印信息而注释程序。

代码4.2 sd_card.h片段

//#define ENABLE_SD_CARD_DEBUG // turn on debug message

同样的道理,若其他模块也有调试开关宏,最好也关断。当然这样,比较麻烦。我们可以再debug.h里面统一关闭调试宏开关也行。

代码4.3 debug.h片段

//#define ENABLE_STDOUT_DEBUG // turn on all of debug message using standard in/out

测试效果如下:

  http://v.youku.com/v_show/id_XMjMyNzM0NTI4.html

源码下载

468782223930.zip

目录

[原创][连载].基于SOPC的简易数码相框 -  Quartus II部分(硬件部分)

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  配置工作

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  SD卡(SPI模式)驱动

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  TFT-LCD(控制器为ILI9325)驱动

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  从SD卡内读取图片文件,然后显示在TFT-LCD上

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  优化工作

[原创][连载].基于SOPC的简易数码相框 -  Nios II SBTE部分(软件部分)-  ADS7843触摸屏驱动测试