打印

STM32关于FSMC连接LCD 例程:怎么确定片外的寄存器地址?

[复制链接]
楼主: huhu2009
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 huhu2009 于 2010-3-8 09:32 编辑

Keil4自带的demo: STM32F103VE用FSMC驱动LCD AM-240320L8TNQW00H(ILI9320),在lcd.c里有:
typedef struct
{
  __IO uint16_t LCD_REG;
  __IO uint16_t LCD_RAM;
} LCD_TypeDef;

#define LCD_BASE    ((uint32_t)(0x60000000 | 0x0C000000))
#define LCD         ((LCD_TypeDef *) LCD_BASE)

第一个define好理解:LCD连接的是FSMC_Bank1_NOR/SRAM4,映射到FSMC的memory为0x6C00 0000 - 0x6FFF FFFF,共64MByte。
但第二个define该怎么理解呢,为什么LCD_REG(寄存器序号)地址为0x6C00 0000、LCD_RAM(该寄存器的值)地址为0x6C00 0001?

对于写寄存器,代码里有:
#define R1             0x01
LCD_WriteReg(R1, 0x0100);
uint16_t LCD_ReadReg(uint8_t LCD_Reg)
{
  LCD->LCD_REG = LCD_Reg;
  return (LCD->LCD_RAM);
}
MCU和LCD的通讯,从ILI9320 DS里的时序图可知是:先CS=0,RS=0,WR=0写IR,然后使CS=0,RS=1,WR=0再写index是IR值的寄存器(RS=1时不时写RAM么?不懂),而对于上面的LCD_WriteReg()语句,就是先往地址为0x6C00 0000的地方写0x01、再往地址为0x6C00 0001的地方写0x0100,中间也没有CS/RS/WR的设置,LCD_REG怎么就成了IR寄存器呢、LCD_RAM怎么就成了IR索引的那个寄存器呢?

请高手指教。
附图:问题中提到的demo所用的电路图:  





评分
参与人数 1威望 +2 收起 理由
商朕 + 2
沙发
huhu2009|  楼主 | 2010-3-8 11:22 | 显示全部楼层
香版主、列为大虾兄,给个话3
我知道之前有个帖子和我这个问题相似,但说的不是一个事

使用特权

评论回复
板凳
huhu2009|  楼主 | 2010-3-8 13:11 | 显示全部楼层
对于LCD_WriteReg(R1, 0x0200);过程应该是:MCU先通过interface将R1(0x01)写入LCD控制器的IR寄存器,然后MCU再通过interface将值0x0200写入LCD控制器中索引值为0x01的寄存器。
对于MCU的片内各外设的寄存器,每个都有确定地址,在datasheet里查得到,访问它们就是对某地址的读写。但这里,IR寄存器和索引值为0x01的寄存器都在MCU外,如何访问它们呢,对于FSMC来说,是把他们的统统映射到0x6C00 0000 - 0x6FFF FFFF区域,但这片区域怎么对应LCD控制器的一堆寄存器和RAM呢?看起来IR是对应0x6C00 0000,这依据的是什么呢?0x6C00 0002又是依据什么映射哪个寄存器呢?

使用特权

评论回复
地板
huhu2009|  楼主 | 2010-3-8 13:14 | 显示全部楼层
4楼说的太浓缩,能稀释一下吗

使用特权

评论回复
5
huhu2009|  楼主 | 2010-3-8 13:35 | 显示全部楼层
MCU往0x6C00 0000地址写0x01,片外的LCD从接口数据线的16bit收到这个值,但它怎么就知道该把这个值送给IR寄存器呢,FSMC只把0x6C00 0000 - 0x6FFF FFFF映射给了LCD,但也没说0x6C00 0000就是IR寄存器呀

使用特权

评论回复
6
huhu2009|  楼主 | 2010-3-8 13:47 | 显示全部楼层
0x6C00 0000、0x6C00 0001不是通过D[0...15]这16bit发给LCD的么,RS接的A0,MCU对A0没有明显的设置呀,A0怎么就知道把自己置高、低电平呢……

使用特权

评论回复
7
huhu2009|  楼主 | 2010-3-8 13:59 | 显示全部楼层
gwb721123和版主说的对,对于单片机来说,我的确是菜鸟。我还是先去翻翻书再回来理解吧。

使用特权

评论回复
8
huhu2009|  楼主 | 2010-3-8 14:24 | 显示全部楼层
本帖最后由 huhu2009 于 2010-3-8 14:26 编辑

16楼的地址说的不对吧,应该是“RS=0就对应于地址0x6C00 0000、0x6C00 0002、0x6C00 0004... RS=1就对应于地址0x6C00 0001、0x6C00 0003、0x6C00 0005...”吧

使用特权

评论回复
9
huhu2009|  楼主 | 2010-3-8 14:59 | 显示全部楼层
谢谢楼主各位兄台的关注和解答。
我有个别问题问的有点白,一时糊涂了,让大家笑话了 :dizzy:

使用特权

评论回复
10
huhu2009|  楼主 | 2010-3-18 14:55 | 显示全部楼层
IJK, 你说的我不能理解,能解释一下吗
还有,假如MCU要去写LCD,那么它把0x6C00 0002放在地址线上,把数据放在数据线上,发“写端口”命令。但是LCD是如何做到接收、执行该命令的呢?LCD控制器上没有地址线啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

163

帖子

1

粉丝