天天看点

使用FSMC驱动LCD以及数据线偏移的问题

FSMC的理解

使用FSMC功能将8080接口的LCD当外部RAM来使用(数据传给LCD时没经过内部SRAM,所以一帧图片很大也可以直接传),根据STM的地址分配图可以看出外部RAM的地址由0x60000000开始到0x9FFFFFFF结束,一共1G内存,将其平分为了4个块,每个块256M字节,其中每个块的时序不同来支持多种外部存储器。8080接口的LCD时序和第一块的时序相接近,第一个块里面又分为4个区,每个区大小为64M字节,都有独立的寄存器对所连接的存储器进行配置,每个区的32位地址中的低28位[27:0]不同,其中的高位[27:26]是来区分4个区的,低位[25:0]有个名字叫HADDR[25:0],外部RAM的地址就是通过HADDR[25:0]来给的,可是LCD写数据之后其内部地址是自动递增的,所以不需要发地址给LCD,则地址线目前不使用,8080接口与FSMC的第一个块的接口之间的差别只有一个数据/命令线和地址线,所以我们可以使用地址线中的一根线来代替数据/命令线,然后通过FSMC给不同的地址写数据来改变地址线上的那根数据/命令线的高低电平,达到读写数据或者读写命令的要求,在通过FSMC给地址时,地址就是按区的地址或上被改变的其中一根地址线(数据/命令线),来决定FSMC的时序和数据或命令。

这是将外部RAM地址分为4个块的图:

使用FSMC驱动LCD以及数据线偏移的问题

这是将第一个块分为4个区的图:

使用FSMC驱动LCD以及数据线偏移的问题

关于A0对齐A1或者A0对齐A2的问题:

这是FSMC驱动LCD的规定:

使用FSMC驱动LCD以及数据线偏移的问题

这是三星公司的ARM芯片s3c2440与1片128KB的SRAM芯片的连接原理图:

使用FSMC驱动LCD以及数据线偏移的问题

初学者可能会有几个疑问,为什么SRAM芯片的A0地址引脚连接的是ARM芯片的A1引脚呢?那什么情况下SRAM芯片的A0连接ARM芯片的A0引脚呢?

首先,我们分析一下图中的 SRAM芯片,该芯片有A0-A15一共16根地址线,有D0-D15一共16根数据线,故其存储空间为 2^16 * 16 bit = 2^17 * 8 bit = 2^17 byte = 128KB

我们知道,要寻址 128KB 需要 17 根地址线(128 = 2^17 ),然而SRAM芯片的地址引脚却只有16根,ARM端该如何给地址线呢?

由图可以看出,SRAM芯片的数据总线是16位宽,即一次传输2个字节的数据。因此,我们可以这样理解,即一个地址空间其实对应着2个字节的数据,实际上真正的寻址空间只有64KB而已,16根地址线足够。这样ARM端并不需要将17根地址线全部连接到SRAM芯片上,只需要给出高16位地址(A1~A16),然后,SRAM芯片即根据这16根地址找到对应的地址空间,将该地址空间的2个字节发送到数据总线上,然后ARM端根据未连接到SRAM芯片的A0的电平,来决定具体是取高字节,还是低字节。

由这些分析可以推出一个规律,即 ARM端的地址线到底是 A0 、A1 还是 A2 连接 存储芯片的 A0,取决于存储系统的数据总线位宽,如果是 8位则A0->A0,如果是16位则A1->A0,如果是32位则A2->A0。(这段话这在别处看到搬过来的)

8080接口

FSMC接口