EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2009/10/29 22:15:43

3

关于投票

SF-EP1C玩出新花样

        利用2个20pin的扩展接口,给SF-EP1C加了个子板。夏普的一款3.5寸320*240的真彩屏,驱动电路在子板上。SF-EP1C上的FPGA读取SD卡中图片,循环显示10幅图片。

原始10幅图片:

 

 

点击看大图

子板显示:

点击看大图

 

点击看大图

 

点击看大图

 

点击看大图

 

点击看大图

 

 

 

 

 

系统分类: CPLD/FPGA  |  用户分类: VGA数码相框DIY  |  标签: SF-EP1C FPGA 液晶  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(595) | 回复(10)

发表于 2009/5/24 8:31:53

0

关于投票

SDRAM页操作模式

SDRAM页操作模式

 

         之前折腾了好久没搞定SDRAM的页模式下进行读写,当时利用在FPGA内部设计一个数据产生模块,用于产生0-255的数据分别写入SDRAM的一个页(正好256字节)内。但是读出来的串口上传数据却相当怪异。当时就放下了,搞不定硬撑着也不是办法。

         前天又在看不同厂家的类似型号SDRAMdatasheet,结果不经意看到一句话,说是SDRAM在页操作模式下必须使用突发停止命令停止其操作。否则,根据后来推断,我觉得在页操作模式下,如果不发出突发停止命令,那么地址会不停的从0-255翻转,而我们的本意是在第一次0-255地址递增期间会分别送0-255的数据到数据总线上,但是如果不发突发停止命令,那么在下一次命令到来之前,地址总线会重新不停的在0-255之前变化,而最后写入SDRAM的数据则取决于你最后一个0-255地址变化周期内的数据。可想而知,如果我不发停止命令,而假设其操作完成回到IDEL状态,那么最后写入的数据肯定就是一串FF或者00,再或者是最后一个写入的一个数据(如果在写入后数据总线不释放的话)。实践证明,结果正式如此。

         呵呵,问题找到了,那么解决问题就是小case了。这回要发挥页模式的灵活性和高效性,那么就要做成一个由外部输入数据控制其一次性操作的字节数,也就是说,外部在读写数据前事先控制一个寄存器,往寄存器写入需要操作的字节数,而进入读写操作后,SDRAM控制器根据外部给出的字节数在适当的时候发出突发停止命令,这样做到了SDRAM的读写操作的字节可以在1-256范围内灵活调整,增强了通用性。

         呵呵,问题终归是要解决的!

 

 

 

系统分类: CPLD/FPGA  |  用户分类: VGA数码相框DIY  |  标签: SDRAM 页操作 突发停止  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(837) | 回复(1)

发表于 2009/5/20 21:21:35

1

关于投票

伪彩数码相框

伪彩数码相框

 

         最近手头的活多起来了,有点忙不开了。这个数码相框DIY就只能暂时先放一放吧。

目前用手头的资源实现了128色的效果,可以在不涉及文件系统管理的前提下循环的显示SD卡里存放的10幅图片。

         呵呵,看看效果发现其实伪彩也不是想象中的那么不堪入目。

 点击看大图

 

点击看大图

 

点击看大图

 

特权同学绝对是个铁竿球迷,呵呵,都翻出了当年雪藏起来的800X600的老照片。

 点击看大图

 

         很难想象吧,上面的图片还真真确确的是128色拼出来的。

 

系统分类: CPLD/FPGA  |  用户分类: VGA数码相框DIY  |  标签: 伪彩 VGA  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(749) | 回复(6)

发表于 2009/5/19 8:37:07

1

关于投票

SD卡里的BMP

SD卡里的BMP

 

         本以为SDRAM+232调试完成,加上之前的SD+232完成。也就是说单模块完成,粘合在一块应该也不是难事。但是调试中还是比较费尽周折的。

         首先单说这个BMP,之前的文章归纳里漏提了BMP数据的第三部分应该是色彩表。比如我的图片是8位色即256色的,那么这个色彩表应该是有256个色彩单元的数据,而每一个色彩单元数据是由4个字节即R一个字节、G一个字节、B一个字节、另一字节保留。就是说单单我的256色位图的色彩表数据应该是1024字节,所以加上之前提到的54个字节的位图头数据,那么8位图的BMP数据的起始1078个字节以后的数据才是真正意义上的色彩信息。那么这个色彩信息和色彩表有怎样一种关系呢,其实也比较简单,只有根据色彩数据对应找到色彩表里以4个字节为单位的单元里的数据就是其相应的色彩信息了。个人感觉这个对于本人的应用,即RGB的位数固定时像是有点多此一举。

         此外,色彩信息数据的存放也不是想当然的从第一个有效数据开始对应的是屏幕左上角的第一个像素点,最后一个对应右下角最后一个点。不是这样,而是第一个有效数据对应右下角第一个像素,最后一个数据对应右上角最后一个像素,呵呵,和常理恰恰相反!也让特权同学蒙了好一阵子。

         最后出现的问题当数原本以为SDRAM的一次8个数据读取足够VGA显示需要了,结果调试中回头再细算了一下,还是发现了一些问题,因为这个SDRAM的控制器做的读取效率不是很高,基本是230ns读取8个字节(有待优化),所以满足不了在50M800*600分辨率的VGA刷新,降到200ns读取8个字节后一切OK了。呵呵,同时测试SD卡的SPI读速率50Mb也很正常。

         下面看看实际的一个800*600256色位图和特权同学通过读取SD卡缓存到SDRAM里再送VGA显示的图片。

实际图片:

 点击看大图

显示效果:

点击看大图 

         色彩有些丢失是因为在XP下位图的B3bit的,而特权同学用电阻搭了B色彩只有2bit

 

        做到这一步了,基本的数码相框的雏形算是出来了,下一步就是不断的优化代码以及完善功能。

 

 

系统分类: CPLD/FPGA  |  用户分类: VGA数码相框DIY  |  标签: BMP SD SDRAM  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(815) | 回复(1)

发表于 2009/5/14 22:49:00

2

关于投票

SDRAM初步调试

SDRAM初步调试

 

         还是用的以前的64Mbit三星K4S641632K-UC60,以为之前调试过,虽然时序分析什么的研究没那么透,但是代码移植过来重新整理一下应该能够比较顺利,结果从周一搞到现在,头疼了我好几个晚上,这下换换思路换换实现方式终于是有点眉目了。

点击看大图 

         目前实现暂时也是为了调试,PLL部分就是产生100M内部SDRAM工作时钟和外部驱动SDRAM的时钟,并且还有其它外设工作的25M时钟。简单的有一个测试用的从0地址到最大地址写入递增数据到SDRAM的模块,SDRAM的控制模块(包括SDRAM的上电初始化、以及正常工作后的各种命令、地址以及数据流的控制),另外还有一个读写数据的两个FIFO控制的模块,最后是一个简单的和之前SD卡一样的串口发送模块,用于把从SDRAM读出来的数据上传到调试终端查看。

 点击看大图

         本来是想用page write/page read的方式操作,但是实际调试起来发现实在搞不定。从众多datasheet里来看,这个K系列应该也是支持Page操作的,不过上传的数据一直都是在末尾出现8个数据,感觉就像是突发数据为8的操作,所以最后实在没辙了,退而求其次还是8个数据操作吧。不过好好再处理一下内部的读写控制,应该也是能够满足这个项目的数据流控制的吧。

         和以前不同的是这次使用了cyclonePLL达到了sdram时钟和内部数据读写的可控,时序分析上也下了写功夫,对于这个单沿的SDR SDRAM模型相对还是比较简单的。此外用FIFO作为数据流转移控制也比较容易控制,对于连续批量的数据传输而言也是比较合适的做法。

         下一步继续完善这个SDRAM控制器,然后和SD整合起来调试……

 

系统分类: CPLD/FPGA  |  用户分类: VGA数码相框DIY  |  标签: SDRAM 调试  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1101) | 回复(3)

发表于 2009/5/10 15:56:54

0

关于投票

BMP格式解析

BMP格式解析

 

         参考文章:位图文件(BMP)格式分析以及程序实现

 

         本来应该先着手把SDRAM模块再整理包装一下,但是今天没法静心整理代码,所以就干脆趁着周末上网方便好好对BMP格式的图片数据结构做一些深入的了解。之所以先从位图(Bitmap)入手,当然是因为位图简单,更因为它是Windows显示图片的基本格式。在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图的时候才能显示出来。关于这点,做过一些液晶驱动器的特权同学还是深有体会的。不过以前做过的驱动部分大都是人家送数据过来我放到RAM里,然后每次显示从RAM搬数据这样的活,相对比较简单,没什么真正意义上的图片结构的成分,只是自己定义好了起始和结束地址就OK了。这样的数据也很容易得到,用字模或者图片取模软件转一下就可以。那么就开始好好学习一下BMP吧。

 

一、下面我们来看看位图文件(*.BMP)的格式。

位图文件主要分为如下3个部分:

块名称

对应Windows结构体定义

大小(Byte

文件信息头

BITMAPFILEHEADER

14

位图信息头

BITMAPINFOHEADER

40

RGB颜色阵列

BYTE*

由图像长宽尺寸决定

1   文件信息头BITMAPFILEHEADER

结构体定义如下:

typedef struct tagBITMAPFILEHEADER {                 /* bmfh */

UINT bfType;   

DWORD bfSize;

UINT bfReserved1;

UINT bfReserved2;

DWORD bfOffBits;

} BITMAPFILEHEADER;

其中:

bfType

说明文件的类型,该值必需是0x4D42,也就是字符'BM'

bfSize

说明该位图文件的大小,用字节为单位

bfReserved1

保留,必须设置为0

bfReserved2

保留,必须设置为0

bfOffBits

说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。

 

         看完理论不够,看看实际的Winhex里的数据是什么吧:

点击看大图 

         直接找的图片的开始簇。偏移地址0-14D42H,即‘BM’;偏移地址2-500300036H,即该图片大小为十六进制的300036Byte,换算一下3M左右,和winhex里的根目录的数值是一样的;偏移地址6-78-9都是0000H;偏移地址a-d00000036H也就是说从图片开始字节地址41000H往后的偏移量为36H字节的数据才是真正的图片数据。你算一下会发现这前36H地址即存放54个字节数据正好是文件信息头(14B)和位图信息头(40B)的数据。

 

2、位图信息头BITMAPINFOHEADER

结构体定义如下:

typedef struct tagBITMAPINFOHEADER {               /* bmih */

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount;

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER;

其中:

biSize

说明BITMAPINFOHEADER结构所需要的字数。

biWidth

说明图象的宽度,以象素为单位。

biHeight

说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。

biPlanes

为目标设备说明位面数,其值将总是被设为1

biBitCount

说明比特数/象素,其值为1481624、或32。但是由于我们平时用到的图像绝大部分是24位和32位的,所以我们讨论这两类图像。

biCompression

说明图象数据压缩的类型,同样我们只讨论没有压缩的类型:BI_RGB

biSizeImage

说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0

biXPelsPerMeter

说明水平分辨率,用象素/米表示。

biYPelsPerMeter

说明垂直分辨率,用象素/米表示。

biClrUsed

说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。

biClrImportant

说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。

 

点击看大图 

         再来看偏移地址0E开始的信息头的数据。偏移地址0e-11H00000028H,即BITMAPINFOHEADER结构所需要的字数为28H,具体是个什么含义就不得而知了;偏移地址12-15H00000400H(即1024),偏移地址16-19H00000300H(即768),这两个参数对应图片的像素是1024*768;偏移地址1AH-1BH0001H,即biPlanes=1;偏移地址1CH-1DH0020H,即该32bit/像素;偏移地址1eH-21H00000000H,应该是表示没有压缩的图像;偏移地址22H-25H00300000H;表示图像大小为3MB;偏移地址26H-29H00000000H,偏移地址2aH-2dH00000000H;偏移地址2eH-31H00000000H;偏移地址32H-35H00000000H

 

3RGB颜色阵列

有关RGB三色空间我想大家都很熟悉,这里我想说的是在Windows下,RGB颜色阵列存储的格式其实BGR。也就是说,对于24位的RGB位图像素数据格式是:

蓝色B

绿色G

红色R

对于32位的RGB位图像素数据格式是:

蓝色B

绿色G

红色R

透明通道A

透明通道也称Alpha通道,该值是该像素点的透明属性,取值在0(全透明)到255(不透明)之间。对于24位的图像来说,因为没有Alpha通道,故整个图像都不透明。

 

         这么看来,BPM还真是原滋原味的表现出了图片的所有数据,不带任何压缩的。

 

系统分类: 消费电子  |  用户分类: VGA数码相框DIY  |  标签: BMP 数据 格式  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1281) | 回复(0)

发表于 2009/5/9 20:37:51

1

关于投票

SD卡初步调试

SD卡初步调试

 

         还是计划不如变化快,本想着简单的在软件平台上先实现SD卡的初步调试。郁闷的是IAR for ARM那会死活装不上,最怕折腾人的事,惹不起咱还躲不起吗。于是狠狠心软件平台咱就不试了,况且前人写的程序满天飞,一搜一箩筐,没什么挑战性,挑几个顺眼的静心研究一下也就差不多了。

         我的Verilog工程启动了,在潜心研究SDSPI协议后,初步调试是希望通过串口把读出的SD数据上传。于是搬了个串口模块,精心包装定制一番;再写个和SD卡通信的SPI协议控制模块,能收能发全双工,速率12.5Mb,最大速度的一半。SD模块里除了SPI,当然还得用几个又臭又长的状态机来控制SD的上电初始化以及扇区读取控制以及以后的简单文件系统的控制。一上来不理清思路状态机写得还挺让人恶心的,想起那会的SDRAM也差不多的样子,这也只能说是verilog的局限的,灵活性差了点(软硬各有利弊)。对于这样的外设控制,有时还真不一定非得是可编程器件管用。

         初步测试模块划分:

点击看大图 

         忘提一下,SD接收来的数据要送给串口模块发出去,这期间的数据交换就都交给FIFO来处理了,还是蛮管用的。

         昨晚其实就用EP1C最小系统板子搭个简单的SD控制电路调试了,郁闷的是没板载串口折腾半天数据发不出来,索性睡个大觉今天的新板子也到了(为逻辑分析仪量身打造的EP1C),一中午时间立马把板子焊上。

点击看大图 

         如此一番,调试起来还真是事半功倍。不过还是出了一些问题,目前能够读出物理0扇区的内容,用Winhex比对无误。但是除了0扇区以外再要读取别的扇区,送完CMD17和扇区号状态机就等8’hfe等死了,不知道为什么,网上一搜有一样问题的,只是没看到问题答案。不过这期间对整个SD卡的扇区结构什么的还是有更深入认识,问题出现了终究是要被解决的,重要的不是问题本身,是这个寻找答案的过程!呵呵,继续努力……

  点击看大图

 

 

         后记:问题解决,其实是因为CMD后面跟的arg地址是字节地址,而之前写入地址时特权同学一直把这个地址假想成是扇区数了。如果设置每次读512B数据,那么这个地址只能是以扇区为单位,即512B的倍数,如果不是,结果只能是等不到读数据的其实数据8’hfe了。

 

系统分类: CPLD/FPGA  |  用户分类: VGA数码相框DIY  |  标签: SD Verilog  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(810) | 回复(4)

发表于 2009/5/5 18:50:51

0

关于投票

SPI协议定义

SPI协议定义

         SD卡手册第5章节学习笔记

 

5.1 SPI总线协议

         SD卡是基于命令和数据流的传输,开启于一个起始位并结束于一个停止位,SPI是基于字节进行传输的。每个命令或者数据是8bit即一个字节,并与CS信号对齐(多次的8个时钟)。

         SPI信息由命令、响应和数据传输组成。所有主机和从机之间的通信由主机控制。主机通过拉低CS信号开始每个总线传输。

         SPI总线模式的响应不同于SD总线模式有如下三点:

被选中的卡总是对命令做出响应;

使用8或者16位的响应结果;

当卡遇到数据恢复问题,它将会产生一个错误响应,而不是像SD总线模式下的超时响应。

 

5.1.1 模式选择

         SD卡在总线模式中唤醒。在接收复位命令时如果CS信号有效(拉低),那么将进入SPI模式。如果SD卡认为SD总线模式是必须的,那么它不会对命令做出响应并继续保持SD总线模式。如果是需要SPI模式,SD卡将切换到SPI模式并发出SPI模式下的R1响应。

         返回SD总线模式唯一的方法是重新给SD卡上电。在SPI模式下,SD卡协议状态机不被检测。所有在SD总线模式支持的命令在SPI模式也是可用的。

         SPI模式下缺省的命令结构/协议是CRC检测关闭。随着SD卡在SD总线模式下上电,CMD0必须紧跟着一个有效的CRC字节。一旦在SPI模式下,默认将关闭CRC

         CMD0命令通常是顺次发送:40 00 00 00 00 9516进制)。

 

5.1.2 总线传输保护

         SPI接口在非保护模式下初始化。主机可以通过CRC_ON_OFF命令(CMD59)开启或关闭保护模式。

 

5.1.3 数据读取

         SPI模式支持单块和多块的数据读取操作(CMD17CMD18)。当SD卡接收到一个有效的读命令时,它将发出响应并随之发送完成早先定义在SET_BLOCK_LENGTH(CMD16)命令里的相应长度数据。

点击看大图 

         最大块长度如定义在READ_BL_LEN(CSD参数)512字节。块长度可以定义在1READ_BL_LEN之间的任何数。

         起始地址可以定义为SD卡有效地址范围内的任意地址。然而,每个块必须被包含在一个单一的物理卡断里。

 

5.1.4 数据写入

         SPI模式下,SD卡支持单块或者多块写入操作。在接收到一个有效的写命令(CMD24或者CMD25)后,SD卡将做出响应并等待从主机传输过来的数据块。有效的块长度是512字节。设置一个更小的块长度将会导致下一个写命令出错。

点击看大图 

         每个数据块有个start block的传输(一个字节)。SD卡接收到数据块后将会发出一个数据响应并且如果数据接收无误,那么它将被写入。只要SD卡忙于数据写入,一个持续的忙信号将会发送给主机(有效保持dataout线为低)。

         一旦写入操作完成,主机必须使用SENT_STATUSCMD13)命令检测写入结果。一些错误(地址溢出、写保护违规等等)只会在写入期间被检测到。

         在多块写入操作中,停止写入将发生在下一个块写入开始时发送“Stop Tran”取代“Start Block”。

点击看大图 

         SD卡忙时,复位CS信号并不会终止写入操作。SD卡释放dataout线并继续写入。如果在写入完成前不再片选SD卡,dataout线将会被强制拉低并拒绝所有命令。

         SD卡复位(CMD0)将会终止任何悬挂着或者激活操作。这将会SD卡的数据格式。主机有责任包含SD卡。

 

5.1.5 擦除和保护管理

 

5.1.6 CID/CSD寄存器

         SD总线协议不同(发送的寄存器内容包含命令响应),SPI模式下读CIDCSD寄存器是纯粹的读块传输。SD卡将会发出一个标准的响应,随后发送一个末尾包含16CRC16字节字节数据块。

 

5.1.7 复位顺序

         SD卡需要一个预定好的复位顺序。上电复位后或发送完CMD0命令(软件复位命令),SD卡进入IDLE状态。这个状态下主机合法的命令只有CMD1(SEND_OP_COND)ACMD41(SD_SEND_OPCND)CMD59(CRC_ON_OFF)CMD58(READ_OCR)

         主机必须不断查询SD卡(通过不断发送CMD1命令)直到SD卡响应的“in-idle-state”位(被设置为0)指示SD卡完成初始化步骤并准备好进入下一个命令。

         然而,在SPI模式下CMD1没有操作数并且不返回OCR寄存器的内容。取而代之的,主机可以使用CMD58(仅用于SPI模式)读取OCR寄存器。主机有职责阻止在SD卡不支持的电压范围内被访问。

 

5.1.8 时钟控制

         SPI主机可以使用SPI总线时钟信号使得SD卡进入低功耗模式或者或者控制总线的数据流(以避免过慢或过快传输)。允许主机改变时钟频率或关闭时钟。

         以下是SPI主机必须遵守的一些约定:

1.       总线频率可以在任何时候被改变(低于SD卡本身所限定的最大数据传输率);

2.       SD卡的数据输出和响应明显都是需要时钟的运行的。在SPI总线传输的最后,主机需要给SD卡操作完成提供8个周期的时钟信号。在这8个时钟周期内,CS信号值是不相关的,它可以有效也可以无效。以下是各种SPI总线传输需要的额外时钟罗列:

  命令及响应后。SD卡响应结束位后8个时钟,在这8个时钟周期内CS信号值可以有效也可以无效。

  读数据传输。最后一个数据块的读取后的8个时钟周期。

  写数据传输。CRC状态后的8个时钟周期。

 

5.2 SPI命令设置

5.2.1 命令格式

         所以的SD卡命令是6个字节长,并且高位在前传输。

点击看大图 

5.2.2 命令分类

        

 

 

 

 

 

 

 

 

 

 

系统分类: 接口电路  |  用户分类: VGA数码相框DIY  |  标签: SD SPI 协议  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1062) | 回复(2)

发表于 2009/5/3 13:14:28

3

关于投票

解析FAT16文件系统

解析FAT16文件系统

 

引导扇区的信息如下:

点击看大图 

1.  偏移地址00H,长度3内容:EB 3C 90 跳转指令。

2.  偏移地址03H,长度8,内容:4D 53 44 4F 53 35 2E 30 厂商标志和os 版本号,这里是MSDOS5.0

3.  偏移地址0BH,长度2,内容:00 02。注意这里数据的布局,高地址放高字节,低地址放低字节(数据为小端格式组织),所以数据应该是0200,即512。表示的意思是,该磁盘每个扇区有512个字节。有的可能是102420484096

4.  偏移地址0DH,长度1,内容:01。表示的意思是每个簇有1个扇区。这个值不能为0,而且必须是2的整数次方,比如1248163264128。但是这个值不能使每个簇超过32KB字节。

5.  偏移地址0EH,长度2,内容:08 00。转换一下,就是00 08,意思是保留区域中的保留扇区数为8个。那么就可以知道下面的FAT1区的开始的地址就是:0x08*0x200(每个扇区的字节数)=0x1000

6.  偏移地址10H,长度1,内容:02。表示此卷中的FAT结构的份数为2,另外一个是备份的。

7.  偏移地址11H,长度2,内容:00 02。转换一下,就是0200H,表示根目录项数(Root Entries) 能够保存在该分区的根目录文件夹中的32个字节长的文件和文件夹名称项的总数。在一个典型的硬盘上,本字段的值为512

8.  偏移量地址13H,长度2,内容:4D ED。转换一下就是ED4DH,即大约32MBSD卡存储量。表示小扇区数(Small Sector) 。该分区上的扇区数,表示为16(<65536)。对大于65536个扇区的分区来说,本字段的值为0,而使用大扇区数来取代它。

9.  偏移地址16H,长度2,内容:EC 00。转换一下为00EC,表示每个FAT占用的扇区数。那么每个扇区占用的字节数就是0x00EC*0x200=0x1D800。根据启动区、FAT1FAT2、根目录、数据区的次序,可以依次计算出它们的地址了。(教程中给出的偏移地址为24H,但是根据实际的FAT1/FAT2地址的推算,应该是16H地址)

10. 偏移量地址20H,长度2,内容:00 00。表示大扇区数(Large Sector) 。如果小扇区数字段的值为0,本字段就包含该FAT16分区中的总扇区数。如果小扇区数字段的值不为0,那么本字段的值为0

11. 偏移量地址36H,长度为8,内容:46 41 54 31 36 20 20 20,对于ASCII码为“FAT16”,表示文件系统类型(File System Type) 根据该磁盘格式,该字段的值可以为FATFAT12FAT16

启动区:理所当然是0x00

FAT10x1000

FAT20x1000 + 0x1D800 = 0x1E800

根目录区:0x1E800 + 0x1D800 = 0x3C000

数据区的地址,等等再计算。这个只是计算,可以看看是不是和实际的一致。

 

点击看大图

 

点击看大图

 

点击看大图 

 

怎么样,是不是和计算的很一致。

为什么要计算SD数据的读取要给出地址,而且每次读取都是一个整扇区,512个字节。找出这些地址后,可以很方便的找到数据。

 

 

现在分析下根目录区的内容:

点击看大图

 

这里使用的是FAT16短文件目录项,每32个字节表示一个文件(文件夹也是),32个字节的表示定义分别如下:

FAT16目录项32个字节的表示定义

字节偏移(16进制)

字节数

定义

0x0~0x7

8

文件名

0x8~0xA

3

扩展名

0xB

1

属性字节

00000000(读写)

00000001(只读)

00000010(隐藏)

00000100(系统)

00001000(卷标)

  00010000(子目录)

00100000(归档)

0xC~0x15

10

系统保留

0x16~0x17

2

文件的最近修改时间

0x18~0x19

2

文件的最近修改日期

0x1A~0x1B

2

表示文件的首簇号

0x1C~0x1F

4

表示文件的长度

 

1.  偏移地址00H,长度8,内容:驱动器的名称,8个字节。这里的CCD8对应国标码“特”,而C8A8对应国标码“权”,即特权同学给该SD卡起的“特权”一名。

2.  偏移地址20H,长度8,内容:54 45 53 54 20 20 20 20。表示第一个文件名:TEST (空缺部分是空格)

偏移地址80H,长度8,内容:4E 45 58 54 20 20 20 20。表示第二个文件名:NEXT (空缺部分是空格)

3.  偏移地址28H88H也一样),长度3,内容:54 58 54。表示文件类型,为ASCII字符表示。

4.  偏移地址2BH8BH也一样),长度1,内容:20。表示文件属性,00000000(读写)00000001(只读)00000010(隐藏)00000100(系统)00001000(卷标)00010000(子目录)00100000(归档)

5.  偏移地址36H,长度2,内容为BA 49。表示时间=小时*2048+分钟*32+/2。得出的结果换算成16进制填入即可。也就是:36H字节的0~4位是以2秒为单位的量值;36H字节的5~7位和37H字节的0~2位是分钟;37H字节的3~7位是小时。

6.  偏移地址38H,长度2,内容为A3 3A。表示日期=(年份-1980)*512+月份*32+日。得出的结果换算成16进制填入即可。也就是:38H字节0~4位是日期数;38H字节5~7位和39H字节0位是月份;39H字节的1~7位为年号,原定义中0~119分别代表1980~2099,目前高版本的Windows允许取0~127,即年号最大可以到2107年。

7.  偏移地址3AH,长度2,为该文件开始簇号,这里也是用了小端格式组织。转换下为00 02,根据这个就可以找到文件TEST.txt下一个簇号在FAT1中的位置了。1000H+02H*02H(因为2个字节存一个簇号)= 1004H

偏移地址3AH,长度2,为该文件开始簇号,这里也是用了小端格式组织。转换下为00 62,根据这个就可以找到文件NEXT.txt下一个簇号在FAT1中的位置了。1000H+62H*02H(因为2个字节存一个簇号)= 10C4H

8.  偏移地址3CH,长度4,内容:59 BE 00 00。表示文件长度,转换后为00 00 BE 59就是48729字节。

偏移地址9CH,长度4,内容:32 00 00 00。表示文件长度,转换后为00 00 00 32就是50字节。

 

点击看大图 

TEST.txt占用了48KB的空间,NEXT占用了512B的空间。文件是按照整簇来存放的,不够一个簇的大小(由上面算得,一个簇为一个扇区即512B),也要给一个簇的空间。

 

 

计算出该文件放置空间。

从文件的大小可以计算出,需要占用多少个簇。根据前面的数据,每个簇放1个扇区,每个扇区512个字节,那么一个簇的空间就是512字节了。那么48729字节需要96个簇,这96个簇的开始的地址就可以计算出来了。

 

点击看大图

 

    首先要提一点,这个地方也是特权同学找了很多资料才发现的,就是根目录中根文件夹占有3220H)个扇区应该是固定的(至少对于FAT16应该是这样),所以真正的用户数据存放应该是从根目录地址的32个扇区偏移量后开始算的。

上面已经知道TEST.txt开始簇地址存放在FAT1中的偏移量了:02H,由此可以先计算出TEST.txt的第一簇数据存放地址为:3C000H(根目录地址)+20H*200H(前面提到的用户数据偏移量)+(02H-02H)*01H(1个簇有1个扇区)*200H=40000H。把偏移量-02H意思是簇号在FAT1中存储都是从02H开始的。

而第一个簇地址存放在FAT1中的:1000HFAT1起始地址)+02H*02H=1004H。而1004H地址上的数据为:03 00,转换后为0003H,那么我们可以计算出TEST.txt第二个簇的地址为:3C000H(根目录区地址)+20H*200H(前面提到的用户数据偏移量)+ (03H-02H)*01H(1个簇有1个扇区)*200H=40200(第一个簇开始地址)。依此类推,一直到FAT1中偏移量为C2处出现了FF FF,这表示TEST.txt文件存储结束,那么前面的0061H就是文件最后一个簇偏移量。我们可以由此算一下文件大小为:(0061H-0002H+0001H(补偿)=96个簇,和实际相符。

    同样的道理可以算出NEXT.txt文件的存放地址。首先起首地址偏移量为62H,由此可以先计算出NEXT.txt的第一簇数据存放地址为:3C000H(根目录地址)+20H*200H(前面提到的用户数据偏移量)+(62H-02H)*01H(1个簇有1个扇区)*200H=4C000H而第一个簇地址存放在FAT1中的:1000HFAT1起始地址)+62H*02H=10C4H。而10C4H地址上的数据为:FF FF,即结束了,也就是说由于NTXT.txt不满一个簇,那么只能分配到一个簇的地址空间。

 

点击看大图

 

 

 点击看大图

 

系统分类: 嵌入式  |  用户分类: VGA数码相框DIY  |  标签: FAT16 文件系统  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1449) | 回复(3)

发表于 2009/5/2 16:08:59

0

关于投票

VGA数码相框DIY计划

VGA数码相框DIY计划

 

前言

         特权同学的新想法比起之前的DIY逻辑分析仪有难度多了,也更加有挑战性。因为这次要完成的任务需要面对不少之前没有接触过的知识,现在需要先给自己定个计划和目标,充分利用有限的业余时间。当然也希望和感兴趣的朋友一起探讨,共同进步。

 

目标:

         VGA数码相框大体需要实现如下的功能:

1.    使用alteracyclone器件或cyclone II器件为载体;

2.    VGA 32位真彩色显示存储在SD卡中的图片;

3.    FPGA中实现jpg的解码;

4.    使用SDRAM作为当前显示图片缓存;

5.    实现一些简单的人机交互式的按键功能,比如开关显示,上下图片调整;

6.    其它的一些扩展功能,做着看,想到什么做什么(毕竟咱这是DIY,摸索着前进);

7.    希望最后能够做一块像模像样的板子出来。

 

计划:

         VGA的显示驱动乃至SDRAM的控制都是比较熟悉的,这次的挑战主要来自SD卡及其文件系统、jpg的解码都是特权同学未解除过的,所以后者都是重点,所以前期的工作估计是花在软件上熟悉SD卡操作。大概希望花3-5个月的时间完成这样一个任务吧,大体的工作安排如下:

1.       使用手头现有的LPC2103板子:

1)  ARM环境下先熟悉SD卡的读写;

2)  熟悉SD卡的文件系统;

3)  使用LPC2103接口BJ-VGA08驱动板显示图片,初步使用软件实现SD卡图片数据的显示;

2.       移植在C下的代码,使其实现成verilog来操作SD卡,实现简单未压缩图片的VGA现实,同时进行SDRAM模块的设计;

3.       学习jpg解码的一些理论,实现jpg图片解码后的现实;

4.       丰富其它功能,在SF-EP1C6板子上充分实现基本功能后,考虑制板加AD模块做成真彩色;

5,画板,制板,调试,完善。

 

         今天是52日,希望一个月、两个月、三个月后回头看看,能够每走一步都有所收获。

 

系统分类: CPLD/FPGA  |  用户分类: VGA数码相框DIY  |  标签: VGA 数码相框 DIY  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1152) | 回复(4)

Total , Page /