请选择 进入手机版 | 继续访问电脑版
查看: 3033|回复: 1

i.MX RT1170揭秘之SRAM/8080/6800接口应用

[复制链接]
  • TA的每日心情
    开心
    前天 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3296

    主题

    6541

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31904
    最后登录
    2024-3-28
    发表于 2021-1-28 11:24:09 | 显示全部楼层 |阅读模式
    i.MX RT1170揭秘之SRAM/8080/6800接口应用
    一、概述
    i.MX RT1170 SEMC支持SRAM/8080/6800接口。SRAM、8080、6800接口有很多相似的地方,所以可以拿到一起来讨论。


    小编列了一个表来展示这些接口的联系和区别,这个表格是小编根据自己的经验和理解来写的,如果大家接触到不同的器件手册,可能结论会略有偏差。
    21.png
    由于这些接口有很多相似性,本文中仅以SRAM为例进行较为深入的探讨。

    二、典型的SRAM接口时序

    时序是指为了完成一次读写操作,地址线、数据线以及控制线必须按照一定的时间顺序严格相互配合,才能完成该功能。


    本文以IS62WV102416为例,典型的SRAM读时序为:
    22.png
    典型的SRAM写时序为:
    23.png
    通过配置SEMC,我们可以实现对应的时序来和SRAM器件对接。

    三、SEMC-SRAM同步模式

    同步模式主要是指数据的读写通过时钟(DQS)的边沿进行同步,这样可以快速连续的进行数据读写。


    在下图中可以看到,当地址信息传递完成后,在后面每一个DQS的时钟就能吞吐一次数据,效率非常高。
    25.png
    上图介绍的是同步模式中的数据/地址复用的场景,地址线A[15:0]是与数据线分时复用的。


    数据/地址非复用的情况本文不赘述,有兴趣的读者请参阅i.MX RT1170 RM。

    四、SEMC-SRAM异步模式

    异步模式同样也分为地址复用模式和非地址复用模式。


    复用模式


    所谓复用就是全部/部分的数据/地址线使用同一组管脚。


    在较早时期,复用管脚用作地址线输出地址,需要通过外置的锁存器保持住地址信息,然后锁存器的输出再连接到目标芯片。后面复用管脚会切到数据模式用于数据的输入/输出。使用复用模式的好处就在于节省管脚,缺点在于需要在片外使用锁存器,增加了BOM成本。


    需要注意的是,此模式下,只有低16位地址是与数据复用的。


    地址复用模式read的时序图:
    复用模式的硬件连接:
    26.png
    非复用模式
    而非复用模式的优点和缺点与复用模式刚好相反,使用的管脚数多,但是不需要外接器件。


    地址非复用read模式的时序:
    27.png


    非复用方式的硬件连接:
    28.png
    还有一种特殊的地址复用模式AADM,由于这种模式很特殊,也不常用,小编这里就不赘述了。


    写模式的讨论这里也不赘述,理解了读,写模式也很容易理解。


    对这部分有兴趣的读者请参阅i.MX RT1170的RM。

    总体概述


    Ready/Wait是一个增强的功能,主要考虑的应用场景是,设备的响应时间可能是不一样的,这样总线主机需要知道设备准备好了,才能结束当前访问周期。


    举个栗子:
    某一次访问,设备在控制信号就绪20ns就能准备好,而在其它时候,可能需要200ns。这样,我们无法为主机配置一个通用而固定的等待时间值。


    配小了,可能会出错,配大了,会浪费带宽。那怎么解决这个问题呢? 这种场景下就可以使用ready/wait的方式。所谓ready/wait就是设备在总线访问开始后,通过一个信号线指示自己是否已经完成了内部的读/写操作,这样主机在看到设备ready后,才会结束当前的总线访问周期。


    下图展示了一个带ready/wait的时序图,其中WAIT信号是由设备来驱动的。


    从图中可见,主机会一直等到WAIT信号拉高,才会终止当前的访问周期,否则会一直等。
    29.png

    那这样会有一个问题,就是如果设备坏了,WAIT信号一直是低怎么办呢?这样主机不就是永远也不能结束当前的访问周期了吗?所以这里就需要一个超时机制,当主机等待达到时间上限时,无论WAIT信号的状态是啥,主机就会终止当前的访问操作,同时给出错误标志。在i.MX RT1170上,这个标志(bit 2 in INTR, AXICMDERR)可以用来触发对应的中断。
    六、SEMC的时钟源


    SEMC的IP时钟源列表如下所示:


    000 - OSC_RC_48M_DIV2
    001 - OSC_24M
    010 - OSC_RC_400M
    011 - OSC_RC_16M
    100 - SYS_PLL1_DIV5
    101 -SYS_PLL2_CLK
    110 - SYS_PLL2_PFD1
    111 -SYS_PLL3_PFD0


    而实际应用中,这个参数是由ROM+DCD(对于 boot mode)或者调试脚本(对于debug mode)完成配置的,所以我们一般并不需要去做这个配置。


    在i.MX RT1170上,NXP官方默认给出的配置为最大值198MHz。
    七、SEMC-SRAM的管脚分配


    关于管脚分配,请参考RM的SEMC相关章节。手册上面SEMC提供了两个table,对于SRAM,请参考table - SEMC Pin Mux for NOR and SRAM。


    此处小编也整理了一下相关的具体的配置信息给大家参考。
    30.png
    31.png
    八、SEMC-SRAM特性总结


    这里总结一下i.MX RT1170 SEMC – SRAM接口的一些关键特性供大家参考。

    九、基于SDK实现SEMC-SRAM访问

    实现SRAM访问需要考虑的问题以及在SDK层面的实现,这里主要讨论在SDK的层面对应的实现,因为从应用的层面考虑,使用SDK会是应用变得更加的快捷。
    当前的讨论基于SDK 2.8.1 PRC3 version,如果后期SDK相关驱动出现变动请以新的SDK相关代码为准。
    需要考虑的问题
    实现方法
    备注
    如何设定工作模式sram_config.syncMode  =  kSEMC_AsyncMode; 
    – 同步/异步
    如何设定工作模式sram_config.addrMode  =  kSEMC_AddrDataNonMux; 
    – 复用/非复用
    如何设定工作模式sram_config.portSize  =  kSEMC_PortSize16Bit; 
    –  8 bit / 16 bit
    使用哪个片选
    sram_config.cePinMux  =  kSEMC_MUXCSX2;
    如何设定片选对应的地址空间
    #define SRAM_BASE  0x90000000
    注意这里的单位是KB, 1024代表1MB。
    sram_config.address  = SRAM_BASE;
    sram_config.memsize_kbytes  =  1024*1;
    如何使能ready/wait
    sram_config.waitEnable  = true;
    如果使能read/wait,waitSample需要配置为1
    sram_config.waitSample  = 1;
    访问周期/时序参数如何设定
    sram_config.tCeSetup_Ns  = 20; //  CS setup and hold
    为了简单起见,小编这里把所有参数都配置成20ns,
    sram_config.tCeHold_Ns  = 20;
    只是为了做基础的时序测试。
    sram_config.tCeInterval_Ns  = 20;  // CS interval
    实际应用中,如果对访问的带宽要求比较高,这些参数
    sram_config.readHoldTime_Ns  = 20;  // Only for sync mode
    需要进行具体的调教。
    sram_config.tAddrSetup_Ns  = 20;  // ADDR setup and hold
    后继如果小编有在具体的器件上实现了进一步的参数调校,
    sram_config.tAddrHold_Ns  = 20;
    小编会在后继的软件中进行更新。
    sram_config.tWeLow_Ns  = 20; //  WRITE feature
    sram_config.tWeHigh_Ns  = 20;
    sram_config.tReLow_Ns  = 20; //  READ feature
    sram_config.tReHigh_Ns  = 20;
    sram_config.tTurnAround_Ns  = 20;  // TA, do not set it to be 0
    sram_config.tAddr2WriteHold_Ns  =  20; // ?
    sram_config.tWriteSetup_Ns  = 20;  // For sync mode.
    sram_config.tWriteHold_Ns  = 20;  // For sync mode.
    sram_config.latencyCount  = 20; //  For sync mode.
    sram_config.readCycle  = 20; //  For sync mode.
    sram_config.delayChain  = 20; //  typically not used in SRAM.
    如何启动读访问周期
    char * p0;
    SEMC – SRAM配置完成后,通过地址访问进行读/写操作
    char c;
    p0 = (char *)0x91000000;
    c = p0[0];
    如何启动写访问周期
    char * p0;
    SEMC – SRAM配置完成后,通过地址访问进行读/写操作
    char c;
    p0 = (char *)0x91000000;
    p0[0] = 0;
    最后,基于IAR的完整例程可以从以下链接


    https://github.com/jiaguonxpcom/rt1170_semc_sram


    进行下载。


    由于目前测试条件有限,该代码目前并未进行完整的全功能测试,仅测试了一部分关键信号。如使用者有发现问题请反馈给小编jia.guo@nxp.com 进行分析,谢谢!

    24.png
    签到签到
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    2

    帖子

    0

    新手上路

    Rank: 1

    积分
    18
    最后登录
    2021-7-5
    发表于 2021-7-2 21:45:22 | 显示全部楼层
    你好,请问SEMC-SRAM异步模式 16位复用模式需要外加锁存器是吗
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-28 22:21 , Processed in 0.119061 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表