首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

C6000的EMIF做异步接口

C6000的EMIF做异步接口

由于我使用的是C6713的片子,所以及直接看与其相关的技术资料,其他的也就没有关注了。先来看一下接口图适用于C671X和C621X的片子。具体的最好还是参考原官方文档。

   先看一下有哪一些接口,由于我最近查阅的资料比较多,可能介绍的有点凌乱,故而也有必要记录下来,整理一下。言归正传,这些接口是EMIF与外界通信的接口,能够方便的解决数据传输的问题。   
   我喜欢根据图来求证怎么工作,最终解决问题。左边接口是加强型的数据存储控制器,就是常说的EDMA;下面是内部外设总线,就是说对外设状态的配置,寄存器的操作通过这些总线来实现。如果接触过F2812,或者用过其他片子的同学,对于图右边的各种接口肯定就不会陌生了。
    ED[31:0],32位的数据接口,C6712只有16位,另外,由于片子封装的不同,可能包含的接口数也不同,我选择的是PYP封装,所以只有16位的数据pin。
   EA[21:2],20位的地址总线。
   CE[3:0],是存储空间选择,低电平有效,是一个输出信号,那个信号为底了,就证明是那个空间被选中了,个人感觉这个信号也可以做外部存储器的片选信号,表示哪个存储器被选中了。
   BE[3:0],低电平有效,字节和半字激活,我准备使用16bit的小端模式,所以BE0=0,BE1=0;分别掌控的是ED[7:0]和ED[15:8]的数据位。
   接下来是三对共享的接口,是异步存储器,SDRAM,SBSRAM共享的控制接口,但是接的存储器不同,接口的含义是不一样的,控制的东西也是不一样的,由于我做的是异步接口,所以只分析AOE,ARE,AWR。先查看一段英文,了解一下AsynchronousInterface能完成什么事情。
The asynchronous interface offers configurable memory cycletypes to interface to a variety of memory and peripheral types,including SRAM, EPROM, and flash memory, as well as FPGA and ASICdesigns.
   主要是用作SRAM,EPROM,FlashMemory,FPGA,ASIC这些接口。正好我所需要接的是FPGA,能够满足要求。证明我的设计思路没有问题,可以继续往下进行。
   AOE,在读访问周期保持低;
   AWE,在写被激活的时候,保持低。就是说要写了,该位就为低电平了。
  ARE,对应的为读被激活的时候保持低。由于我的DSP只是从FPGA中读数据,并没有写的过程,所以,对于该信号我会更加关注一些。
   ARDY,插入等待状态,直接接高就好了,允许有等待状态的插入,说白了就是让时序能够匹配起来。
   HOLD,HOLDA是低电平的时候就响应外部总线请求。更具前面文章中介绍的F2812来说就是:为低的时候,外部的设备和DSP之间是不进行数据交换的,是其他的设备控制了这个与DSP相连接的设备。所以也可以看见,开发板上直接吧这两个信号接高了,就是说一直处于DSP和外部设备数据交换的状态,不同意不交换的状态。
   BUSREQ,显示等待刷新或内存访问,保持高的输出状态,就能够实现该功能了。
   介绍外这些信号线,最后来介绍一下最关键的时钟,因为做接口不得不涉及到时钟,个人认为时钟是接口通信的灵魂。
   ECLKOUT,时钟输出,EMIF的接口中所有的IO口都是在这个时钟的影响下工作的,也就是说这个时钟是一个参考源。
   ECLKIN,时钟输入,由系统提供。对于这个管脚我的认识是,如果外界设备是主动发数据,就应该有一个对应的时钟,这时候将ECLKOUT接到ECLKIN,那么DSP就处于一种被动的接收数据的状态。也就是我们说的读状态。使用这一种方式也能够实现时钟速度的匹配。

   看完这一段就能够知道这些接口怎么接外面的存储器了,接下来要看怎么去控制,好在TI给了我们大量的库,所以我们需要做的只是根据需要去配置响应的寄存器。和EMIF相关的寄存器有五个。

   刨去SDRAM的,就只有两个了,一个是全局控制寄存器,一个是存储空间控制寄存器。
    全局控制寄存器,C6713默认的值是0x00003068,其中0-2、6、12-31位为保留位,
8-11位分别是HOLDA、HOLD、ARDY、BUSREQ,由于这几个位有对应的控制线,所以状态并不重要,一般就尊重默认值,没有在初始化EMIF的时候去修改他们。第7位为NOHOLD=0,英文解释是nohold isdisable,就是说hold没有被禁用,想用就可以用。第5位为EKEN,是ECLKOUT,默认值为1,ECLKOUT能够输出对应的时钟,这个地方就不像F2812一样要选择是否有时终输出。后面几位为CLK1EN和CLK2EN,由于C6713没有,也就不说了。
[size=+0]   存储空间寄存器,可根据使用的空间不同而单独配置,默认值为0xffffff23,其中20-31位都是配置写的setup、strobe、hold的状态,还有几位是配置读的这三个状态,就不一一列出了。在这个寄存器里面最重要的是选择外面设备的类型,在这里我需要选择的是16位异步接口,所以4-7位MTYPE的值为0x1。

[size=+0]   看完pin,看完register,最后再来看一下时序,如果说时钟是灵魂,时序就是思想,只有在正确的思想下才能做出正确的事情。由于内容繁多,所以还是只说明我所要做的读数据的事件。
    说到时序,自然少不了时序图,刚开始的时候也觉得这个很难,现在再看了大量的时序图之后,也表示习以为常了。

   

    Clock,前面也说了,6713的为ECLKOUT,也就是在这个时种下开始整个系统的工作吧。
    CE,我们应该看下面的一根线,也就是说在读这个过程中都保持为低电平,其他的时候位高,这其实也相当于一个时钟信号,能给我FPGA做时钟用,因为每来一个CE信号,表示要有一次读的过程要进行了。在C6713的片子中AOE和CE信号是相同的,

    BE前面也说了,我是小段模式的低16位并行数据传输。
    EA为地址,表示读外部器件的哪个地址的数据。
    ARD为读信号,只有在读状态中的激活态时候才为低,并且在上升沿的时候将数据管脚上的数据锁存到CE所对应的空间中。

   有洋洋洒洒的写了不少字了,终于将EMIF的异步接口,读数据的过程分析完毕,其中有不少自己的理解,不知道有没有错误,接下来将要实现EMIF的使用,将理论用于实践,验证我理解的正误。
继承事业,薪火相传
返回列表