外部存储控制器EMC 与norflash
嵌入式芯片本身的ram和rom都很小,但有时需要处理的数据有很大,于是出现了EMC,EMC可以外接norflash,sdram等来增加存储区域。 CPU可以通过AHB从机寄存器接口对EMC寄存器进行编程.为了避免可能发生的字顺序问题,操作EMC寄存器的过程中,所有数据的床上必须是32位宽的字. 访问外部存储器需要注意几点: 1.数据传输的字节顺序 2.数据产生的宽度 3.对写保护的存储器区域进行写操作. EMC与NOR_FLASH接线方式。 EMC_OE输出使能,EMC_WE写使能,EMC_CS片选 EMC操作norflash用到的寄存器
我们再看看EMC的基本操作过程: 1.首先是使能EMC: ? lpc1788为例 ? ?在使用EMC前一定要先在功率控制寄存器中将其使能: ??有的芯片不需要这两步操作,本身就开启的 ??LPC_SC->SCS?????|=?(0x01?<<?0); ??LPC_SC->PCONP???|=?0x00000800;??????????????????/*?使能EMC功率控制?????????*/ ? 接下来,设置EMC控制寄存器EMCControl的第0位置1,使能EMC: ??LPC_EMC->Control?=?0x00000001; ??????????????/*?使能EMC?????????????????*/ ??LPC_EMC->Config??=?0x00000000; ??????????????/*小端模式,ROP复位????????*/ 2.引脚连接: ? 将相关的引脚连接到EMC模块. ??LPC_IOCON->P3_0?=?1;????????????????????????????/*?D0?@?P3.0???????????????*/ ??LPC_IOCON->P3_1?=?1;????????????????????????????/*?D1?@?P3.1???????????????*/ ??LPC_IOCON->P3_2?=?1;????????????????????????????/*?D2?@?P3.2???????????????*/ ??LPC_IOCON->P3_3?=?1;????????????????????????????/*?D3?@?P3.3???????????????*/ ??LPC_IOCON->P3_4?|=?1;???????????????????????????/*?D4?@?P3.4???????????????*/ ??LPC_IOCON->P3_5?=?1;????????????????????????????/*?D5?@?P3.5???????????????*/ ??LPC_IOCON->P3_6?=?1;????????????????????????????/*?D6?@?P3.6???????????????*/ ??LPC_IOCON->P3_7?=?1;????????????????????????????/*?D7?@?P3.7???????????????*/ ?? ??LPC_IOCON->P3_8??=?1;???????????????????????????/*?D8?@?P3.8???????????????*/ ??LPC_IOCON->P3_9??=?1;???????????????????????????/*?D9?@?P3.9???????????????*/ ??LPC_IOCON->P3_10?=?1;???????????????????????????/*?D10?@?P3.10?????????????*/ ??LPC_IOCON->P3_11?=?1;???????????????????????????/*?D11?@?P3.11?????????????*/ ??LPC_IOCON->P3_12?=?1;???????????????????????????/*?D12?@?P3.12?????????????*/ ??LPC_IOCON->P3_13?=?1;???????????????????????????/*?D13?@?P3.13?????????????*/ ??LPC_IOCON->P3_14?=?1;???????????????????????????/*?D14?@?P3.14?????????????*/ ??LPC_IOCON->P3_15?=?1;???????????????????????????/*?D15?@?P3.15?????????????*/ ??LPC_IOCON->P4_0?=?1;????????????????????????????/*?A0?@?P4.0???????????????*/ ??LPC_IOCON->P4_1?=?1;????????????????????????????/*?A1?@?P4.1???????????????*/ ??LPC_IOCON->P4_2?=?1;????????????????????????????/*?A2?@?P4.2???????????????*/ ??LPC_IOCON->P4_3?=?1;????????????????????????????/*?A3?@?P4.3???????????????*/ ??LPC_IOCON->P4_4?=?1;????????????????????????????/*?A4?@?P4.4???????????????*/ ??LPC_IOCON->P4_5?=?1;????????????????????????????/*?A5?@?P4.5???????????????*/ ??LPC_IOCON->P4_6?=?1;????????????????????????????/*?A6?@?P4.6???????????????*/ ??LPC_IOCON->P4_7?=?1;????????????????????????????/*?A7?@?P4.7???????????????*/ ??LPC_IOCON->P4_8??=?1;???????????????????????????/*?A8?@?P4.8???????????????*/ ??LPC_IOCON->P4_9??=?1;???????????????????????????/*?A9?@?P4.9???????????????*/ ??LPC_IOCON->P4_10?=?1;???????????????????????????/*?A10?@?P4.10?????????????*/ ??LPC_IOCON->P4_11?=?1;???????????????????????????/*?A11?@?P4.11?????????????*/ ??LPC_IOCON->P4_12?=?1;???????????????????????????/*?A12?@?P4.12?????????????*/ ??LPC_IOCON->P4_13?=?1;???????????????????????????/*?A13?@?P4.13?????????????*/ ??LPC_IOCON->P4_14?=?1;???????????????????????????/*?A14?@?P4.14?????????????*/ ??LPC_IOCON->P4_15?=?1;???????????????????????????/*?A15?@?P4.15?????????????*/ ??? ??LPC_IOCON->P4_16?=?1;???????????????????????????/*?A16?@?P4.16?????????????*/ ??LPC_IOCON->P4_17?=?1;???????????????????????????/*?A17?@?P4.17?????????????*/ ??LPC_IOCON->P4_18?=?1;???????????????????????????/*?A18?@?P4.18?????????????*/ ??LPC_IOCON->P4_19?=?1;???????????????????????????/*?A19?@?P4.19?????????????*/ ??LPC_IOCON->P4_20?=?1;???????????????????????????/*?A20?@?P4.20?????????????*/ ??LPC_IOCON->P4_21?=?1;???????????????????????????/*?A21?@?P4.21?????????????*/ ??LPC_IOCON->P4_22?=?1;???????????????????????????/*?A22?@?P4.22?????????????*/ ??LPC_IOCON->P4_23?=?1;???????????????????????????/*?A23?@?P4.23?????????????*/ ??LPC_IOCON->P4_24?=?1;???????????????????????????/*?OEN?@?P4.24?????????????*/ ??LPC_IOCON->P4_25?=?1;???????????????????????????/*?WEN?@?P4.25?????????????*/ ??LPC_IOCON->P4_31?=?1;???????????????????????????/*?CSN[1]?@?P4.31??????????*/ 3.时序设置: LPC_EMC->StaticConfig1???=?0x00000081;????//配置外部总线,16bit宽度 LPC_EMC->StaticWaitWen1??=?0x00000000;?????????/*?(n+1)?->?1?clock?cycles??*/ LPC_EMC->StaticWaitOen1??=?0x00000001;?????????/*?(n)?->?1?clock?cycles????*/ LPC_EMC->StaticWaitRd1???=?0x00000004;?????????/*?(n+1)?->?5?clock?cycles??*/ LPC_EMC->StaticWaitPage1?=?0x00000000;?????????/*?(n+1)?->?1?clock?cycles??*/ LPC_EMC->StaticWaitWr1???=?0x00000002;?????????/*?(n+2)?->?4?clock?cycles??*/ LPC_EMC->StaticWaitTurn1?=?0x00000000;?????????/*?(n+1)?->?1?clock?cycles??*/ 一般不使用EMCStaticExtendedWait寄存器来计时读和写传输,而使用EMCStaticWaitRd和EMCStaticWaitWr寄存器,这样是为了灵活设置各种读写参数,可以尽量提高读和写的速度;当然用户也可简单地只使用EMCStaticExtendedWait寄存器来延时读和写传输时序,只是这样读写效率会比较低。?? 读的时序图 通常情况下,我们再操作外部存储器时分为读,写两个操作. ? 在读操作的过程中,我们需要配置下面的寄存器 ? a.静态存储器输出使能延时寄存器(EMCStaticWaitOen0-1); ? b.静态存储器读延时寄存器(EMCStaticWaitRd0-1); EMCStaticWaitOen(n) ?Tce max 70ns
EMCStaticWaitRd(n) ?从片选有效到从器件输出允许失效之间的延时时间 读时序图 EMCStaticWaitWen(n) Tcs min 0ns EMCStaticWaitWr(n)? EMCStaticWaitTurn(n)?总线翻转周期,即从片选信号无效到有效之间的时间 EMCStaticWaitPage?设置读取一页的等待时间t的长短 页模式下,一次片选有效期内可联系读/写4个字节,在这过程中,-WE和-OE信号保持不变,只有地址信号发生变化 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |