• 2440内存硬件连线疑问


    2440内存硬件连线疑问

    作者:wogoyixikexie@gliet

    现在来看2440内存控制器初始化代码

    ;Set memory control registers
      ldr r0,=SMRDATA ;be careful!, hzh
     ldr r1,=BWSCON ;BWSCON Address
     add r2, r0, #52 ;End address of SMRDATA
    0
     ldr r3, [r0], #4
     str r3, [r1], #4
     cmp r2, r0
     bne %B0

    ;=========================================

    SMRDATA DATA
    ; Memory configuration should be optimized for best performance
    ; The following parameter is not optimized.
    ; Memory access cycle parameter strategy
    ; 1) The memory settings is  safe parameters even at HCLK=75Mhz.
    ; 2) SDRAM refresh period is for HCLK<=75Mhz.

     DCD (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)     +     (B6_BWSCON<<24)+(B7_BWSCON<<28))
     DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))   ;GCS0
     DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))   ;GCS1
     DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))   ;GCS2
     DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))   ;GCS3
     DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))   ;GCS4
     DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))   ;GCS5
     DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))    ;GCS6
     DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))    ;GCS7
     DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Tsrc<<18)+(Tchr<<16)+REFCNT)

     DCD 0x32     ;SCLK power saving mode, BANKSIZE 128M/128M
     ;DCD 0x02     ;SCLK power saving disable, BANKSIZE 128M/128M

     DCD 0x30     ;MRSR6 CL=3clk
     DCD 0x30     ;MRSR7 CL=3clk

    ---------对于上面的东西无非是寄存器的参数设置,很明了。我在这里就不注释了。

    昨晚,问了一些群里面的人,后来再看看电路图。

    发现问题在LDQM,UDQM这两个引脚,接到2440的四个nWBE引脚。内存资料是这么说的:Data Input/Output Mask Controls output buffers in read mode and masks input data in write mode 一些中文文档是这么说的:在读模式下控制输出缓冲;在写模式下屏蔽输入数据。按照这种接法(2片内存都是错位2位)我觉得内存是分开高16位和低16位分别访问的,但是让我纳闷的是2440是怎么控制四个nWBE引脚来完成任务的?并且,我看访问内存的时候都是直接访问32位地址的。真的迷茫了,不知道2440是如何实现的。请高手指点一下。谢谢。

    下图是内存连接图,关键部分我都大了红圈。

     
    ----------------------------------------------------------------------------------------------

    引用 3 楼 xajhuang 的回复:
    实际上,它把两片 16 位的内存组合成 32 位来用了,这两片内存都接在了控制芯片同一个 BANK 地址上,利用 地址线 数据线 SCLK LDQM UDQM 这 3 个引脚来控制 32 位数据的读写。

    -------------------------------------
    访问控制信号:为了实现ARM存储器访问指令LDR/STR字节、半字和字访问的三种方式,在S3C2440的存储器组中,除了Bank0以外的所有地址空间都可以通过编程设置为8位、16位或32位对准访问,Bank0可以设置为16位或32位。引脚nWBE[3:0](写字节使能)实现8bit ROM芯片组的三种访问方式,或者SRAM不使用UB/LB(在BWSCON中设置)的情况下,与UB/LB连接。引脚nBE[3:0](在使用SRAM情况下的字节允许信号)在SRAM使用UB/LB(是否使用可在BWSCON中设置)的情况下与UB/LB连接。DQM[3:0](SDRAM数据屏蔽信号)引脚实现对SDRAM的三种访问。还有nWAIT、nXBREQ/nXBACK引脚。



    谢谢两位。你们说的在那篇文章我都知道。只是我想了解的更加具体一点——可惜三星已经把所有东西包装得严严实实——很多东西通过硬件实现了。

    ----------现在我把我的理解发上来。

    一、为什么会两片内存都连接相同的地址线?(我一直以为地址线必须是递增的
    答案:因为这是两片独立内存,地址线都是固定的,如果地址递增会造成糟糕的后果(我还真以为是两片内存可以无缝连接呢!大错特错了。)
    二、为什么两片内存都要错位两位?
    答案:
    因为两片内存是独立访问的,并且总线宽度都是32位(高16位数据和低16数据位分开读取。至于错位原因请看ARM字节对齐文章)。
    但是难题来了,为什么三星访问内存时候并没有分开呢?LDQM UDQM 这两个引脚起作用了(用来屏蔽高低字节输出,相当于锁存)控制这两个引脚的是三星的nWBE
    引脚,三星是怎么控制这些引脚的呢?我也很想知道,在这里我只能说出我的推测:2440/2410有个寄存器设置内存的大小,我想2440/2410就是根据这些信息来控制这些引脚,使最总实现32位一起访问。——所有东西包装得严严实实——很多东西通过硬件实现了。

    如果我说的不对,请跟帖。也让我彻底死心,彻底明白。

  • 相关阅读:
    Create Your Tab and LayerTabMenu In Katana
    Linux C Programing
    Linux C Programing
    dynamics_cast<>
    TBB 学习笔记
    冒泡排序算法
    Spring4学习笔记:Spring框架中为一个bean配置依赖注入的方式
    基数排序算法的Java实现
    堆排序算法的Java实现与分析
    贪心算法
  • 原文地址:https://www.cnblogs.com/gooogleman/p/1869768.html
Copyright © 2020-2023  润新知