歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

ARM學習篇 SDRAM理解

1.SDRAM單管存儲單元

  1.  SDRAM單管電路圖

  

  C記憶單元

  T控制門管

  Z字線

  W位線

  注:圖示為N溝道耗盡型MOS管

  • 寫入:Z加高電平,MOS導通,W狀態決定了電容C的狀態
  • 讀出:Z加高電平,MOS導通,可以從W狀態得知C的狀態
  • 保持:Z加低電平,MOS關閉,電容保持原狀態
  • 注意:單管讀出是破壞性讀出,因為讀出時電容充電或者放電了,所以讀出後還要重寫

      2.      刷新與重寫

   ●  刷新是每隔一段時間,自動重寫一次;重寫是破壞性讀出後立即還原

  • 最大刷新間隔:所有的動態單元都被重新刷一遍的時間
  • 刷新周期:刷新一行所用時間
  •  刷新周期數:刷新一塊芯片所用的刷新周期數
  • 刷新周期的安排方式:

  a). 集中刷新

  b). 分散刷新

  c).  異步刷新

2. SDRAM尋址機制

    1.  地址分布邏輯圖

  

   圖示大致說明了尋址方式,地址總線發出行列地址,選中相應的芯片,再讀寫。

  2.   K4S561632E功能模塊圖(SDRAM芯片)

  

 ● CLK系統時鐘

 ● CKE時鐘使能

 ● A0~A12地址線

 ● BA0~BA1塊選擇

   ● RAS'列信號使能

 ● CAS'行信號使能

 ● WE'寫信號使能

 ● DQM控制數據輸入輸出

 ● Vdd/Vss供電電源/地

 ● Vddq/Vssq數據輸出供電/地

  3.  SDRAM時序圖

    1.片選信號時序圖

  

● Tacs:片選信號nGCSn起效前,地址信號建立時間

● Tcos:在nOE起效前,片選信號建立時間

● Tacc:訪問周期

● Tcoh:nOE結束後(即電平升高),片選保持時間

● Tcah:nGCSn結束後(即電平升高),地址信號保持時間

● Tacp:Page模式的訪問周期

● 前面介紹了圖示一些術語,有了一定了解,下面我們來分析上圖:

  存儲控制器使用HCLK作為其時鐘

  CPU要訪問某個地址,先發出地址給MMU,MMU再控制地址線,分批次發送行列地址。

  Page模式可以暫時忽略,因為我們還沒用到離散存儲管理(即物理內存分塊,虛擬內存分頁)。

  

  

 ●  Trp:SDRAM RAS預充電時間

 ●  Tsrc:SDRAM半行周期時間

 ●  Tcas:SDRAM列地址建立時間

關閉上一次操作,對上一次讀的行全部重寫一遍,即預充電;

S3C2440A發出片選,塊選(BANK)信號同時發出列地址;

選中行後,發出列地址,讀出相應數據,延遲幾個時鐘周期,I/O端口上就會出現所讀數據

  4. 寄存器

  總線/位寬等待寄存器BWSCON

  總線控制寄存器BANKCON0~BANKCON5

  總線控制寄存器BANKCON6/7

  SDRAM刷新控制寄存器

  BANKSIZE寄存器

  SDRAM模式寄存器

  

5.寄存器配置(重點理解,我花了很長時間找資料、學習)

 a.  操作參數

注意看參數,相信大家這點英文基礎還是有的。

S3C2440A的存儲控制器的nGCSn、地址信號、nOE信號幾乎同時發出,所以這些參數都設置為0

訪問周期,根據手冊,幾納秒內就可以訪問到數據,所以可以盡量調低。

RAS到CAS延時:3CLK(Col. address to col. address delay+Last data in to new col. address delay+行選通信號到列選通信號的延時=3clk)

列地址:9位

預充電時間:20ns左右

行周期:65ns左右

CAS潛伏期:2或者3CLK

6. 基於以上了解,我們終於可以寫代碼

  

AREA SDRAM,CODE,READONLY
CODE32
ENTRY

SDRAM_BASE EQU 0X30000000

WTCON EQU 0X53000000;看門狗控制寄存器

BWSCON EQU 0X48000000
BANKCON0 EQU 0X48000004
BANKCON1 EQU 0X48000008
BANKCON2 EQU 0X4800000C
BANKCON3 EQU 0X48000010
BANKCON4 EQU 0X48000014
BANKCON5 EQU 0X48000018
BANKCON6 EQU 0X4800001C
BANKCON7 EQU 0X48000020
REFRESH EQU 0X48000024
BANKSIZE EQU 0X48000028
MRSRB6 EQU 0X4800002C
MRSRB7 EQU 0X48000030

 ;定義SDRAM相關寄存器

GPFCON EQU 0x56000050
GPFDAT EQU 0x56000054
GPFUP EQU 0x56000058

;定義GPIO端口

_ENTRY
B RESET
B .
B .
B .
B .
B .
B .;0X18
B .
RESET
LDR R0,=WTCON
LDR R1,=0
STR R1,[R0]

LDR R0,=GPFCON
LDR R1,=0X5555
STR R1,[R0]

LDR R0,=GPFUP
LDR R1,=0XFF
STR R1,[R0]

LDR R0,=GPFDAT
LDR R1,=0X5F
STR R1,[R0]


LDR R0,=BWSCON
LDR R1,=0X22011110
STR R1,[R0]

LDR R0,=BANKCON0
LDR R1,=0X00000700
STR R1,[R0]

LDR R0,=BANKCON1
LDR R1,=0X00000700
STR R1,[R0]

LDR R0,=BANKCON2
LDR R1,=0X00000700
STR R1,[R0]

LDR R0,=BANKCON3
LDR R1,=0X00000700
STR R1,[R0]

LDR R0,=BANKCON4
LDR R1,=0X00000700
STR R1,[R0]

LDR R0,=BANKCON5
LDR R1,=0X00000700
STR R1,[R0]

LDR R0,=BANKCON6
LDR R1,=0X00018005
STR R1,[R0]

LDR R0,=BANKCON7
LDR R1,=0X00018005
STR R1,[R0]


LDR R0,=REFRESH
LDR R1,=0X008C07A3
STR R1,[R0]

LDR R0,=BANKSIZE
LDR R1,=0X000000B1
STR R1,[R0]

LDR R0,=MRSRB6
LDR R1,=0X00000030
STR R1,[R0]

LDR R0,=MRSRB7
LDR R1,=0X00000030
STR R1,[R0]
;設置SDRAM相關寄存器
LDR R0,=0X0
LDR R1,=SDRAM_BASE
LDR R2,=4096

COPY_LOOP
LDR R3,[R0],#4
STR R3,[R1],#4
CMP R0,R2
BNE COPY_LOOP

;復制相關0~4kB的代碼到0x30000000開始的空間


LDR R0,=0X30000000
LDR R1,=ON_SDRAM
ADD R2,R0,R1
MOV PC,R2
ON_SDRAM


LDR R0,=GPFDAT
LDR R1,=0X3F
STR R1,[R0]
;點燈
LDR R0,=0X30000000
LDR R1,=ON_SDRAM
ADD R2,R0,R1
MOV PC,R2

END

Copyright © Linux教程網 All Rights Reserved