看了一套視頻,感覺DDR這個部分將的非常細(xì)致也很好,于是把視頻內(nèi)容花了一個多星期作了總結(jié)。
這個視頻就是不知道是誰講的,做好事不留名啊~~~那位知道告訴我哈~~
平臺:S5PV210
DDR: 兼容 三星的一塊芯片——NT5TU64M16GG-DDR2-1G-G-R18-Consumer
//---------28個步驟如下
step1. To provide stable power for controller and memory device,
the controller must assert and hold CKE to a logic low level.
Then apply stable clock. Note: XDDR2SEL should be High level to hold CKE to low.
為了提供穩(wěn)定的電源給控制器和內(nèi)存設(shè)備,
控制器必須確保CKE維持低電平。
然后提供一個穩(wěn)定的時鐘。注意:XDDR2SEL需保持高來維持CKE為低
說明:XDDR2SEL在電路圖設(shè)計中,一般直接拉到了VCC。
(圖中NC表示沒焊接)
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step2. Set the PhyControl0.ctrl_start_point and PhyControl0.ctrl_inc bit-fields to correct value according to clock frequency. Set the PhyControl0.ctrl_dll_on bit-field to ‘1’ to turn on the PHY DLL.
根據(jù)時鐘的頻率,設(shè)置PhyControl0.ctrl_start_point and PhyControl0.ctrl_inc 字段為正確的值。
設(shè)置PhyControl0.ctrl_dll_on字段為1開啟PHY DLL。
ldr r1, =0x00101000 @PhyControl0 DLL parameter setting, manual 0x00101000
str r1, [r0, #DMC_PHYCONTROL0]
說明:
1、PhyControl0.ctrl_start_point and PhyControl0.ctrl_inc 手冊上說(This value should be 0x10 );ctrl_start_point 其實是開始相移的地方,ctrl_inc 每次相移的格數(shù)。
2、PhyControl0.ctrl_dll_on為1,開啟dll。但是demo程序中此時并未打開dll,而是把打開這步驟放在了靠后的地方。
3、PhyControl0.ctrl_dfdqs為1,開啟差分信號功能(具體需看硬件,支持差分,還是單端)
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step3. DQS Cleaning: Set the PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetc bit-fields to correct value according to clock frequency and memory tAC parameters.
DQS清除:設(shè)置the PhyControl1.ctrl_shiftc and PhyControl1.ctrl_offsetc
位字段,根據(jù)時鐘頻率和內(nèi)存TAC參數(shù)。
DQS Cleaning 示意圖如下:
DQS Cleaning,其實就是想中和調(diào)板級的一些延時,如PCB延時等~~
ldr r1, =0x00000086 @PhyControl1 DLL parameter setting, LPDDR/LPDDR2 Case
str r1, [r0, #DMC_PHYCONTROL1]
說明:
1、ctrl_shiftc是粗條,通過控制器的DLL調(diào)整DQS的相移。(0x6 when DDR2 @200MHz)
2、ctrl_offsetc是精調(diào),在ctrl_shiftc的基礎(chǔ)上通過控制器的DLL調(diào)整DQS的相移。
3、ctrl_ref 是DLL同步完成之后需要的一個延時。默認(rèn)是4這設(shè)置成8.
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step4. Set the PhyControl0.ctrl_start bit-field to ‘1’.
開啟PhyControl0.ctrl_start 位
在dame代碼中此時才打開ctrl_dll_on
ldr r1, =0x00101002 @PhyControl0 DLL on
str r1, [r0, #DMC_PHYCONTROL0]
然后打開ctrl_start
ldr r1, =0x00101003 @PhyControl0 DLL start
str r1, [r0, #DMC_PHYCONTROL0]
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在配置,并開啟之后,還需要等待一段時間,讓DLL工作穩(wěn)定的,在手冊中到了第12步才去檢查DLL是否穩(wěn)定,而在damo程序中將
11和12步的內(nèi)容提前到了第4步的后面,這樣做主要是為了結(jié)構(gòu)上的統(tǒng)一,也就是是一次性將DLL配置完。
而手冊里那樣做是為了節(jié)省配置時間,可以在配置其他的過程中等待DLL穩(wěn)定。我們就先按照damo程序順序進(jìn)行分析,將12步提到前面來~~
step11 and step12
step11 . Wait for the PhyStatus0.ctrl_locked bit-fields to change to ‘1’. Check whether PHY DLL is locked.
step12 . PHY DLL compensates the changes of delay amount caused by Process, Voltage and Temperature (PVT)
variation during memory operation. Therefore, PHY DLL should not be off for reliable operation. It can be off
except runs at low frequency. If off mode is used, set the PhyControl0.ctrl_force bit-field to correct value
according to the PhyStatus0.ctrl_lock_value[9:2] bit-field to fix delay amount. Clear the
PhyControl0.ctrl_dll_on bit-field to turn off PHY DLL.
find_lock_val:
ldr r1, [r0, #DMC_PHYSTATUS] @Load Phystatus register value
and r2, r1, #0x7
cmp r2, #0x7 @Loop until DLL is locked
bne find_lock_val
如果PhyStatus0的第3位全部為1,就表示我們之前配置的DLL按照我們設(shè)置的偏移(相對CLK的),已經(jīng)工作穩(wěn)定了。DLL為了完成這個過程,首先得不停的采集
clk,然后再不停的微調(diào),這個過程是非常耗電的。所以在調(diào)整完成之后,DLL不需要在去跟蹤clk了而是記錄與CLK之前的一個差值,再保持這個差值即可,于是有了下面的程序:
and r1, #0x3fc0 @讀出PhyStatus0的[13:14]
mov r2, r1, LSL #18 @左移18位,將PhyStatus0的[13:14]放到PhyControl0[31:24]
orr r2, r2, #0x100000 @恢復(fù)PhyControl0.ctrl_inc的值
orr r2 ,r2, #0x1000 @恢復(fù)PhyControl0.ctrl_istart_point的值
orr r1, r2, #0x3 @恢復(fù)PhyControl0低2位的值
str r1, [r0, #DMC_PHYCONTROL0] @存之
這段代碼的含義就是把PhyStatus0的[13:14]為讀出,將這段數(shù)據(jù)放到PhyControl0[31:24].
PhyStatus0的[13:14]的值是鎖定完成后DQS與CLK的一個差值,把這個差值讀出來之后放到PhyControl0[31:24],那么控制器就不再通過跟蹤clk的方式,
而是通過固定延時的方式產(chǎn)生這個差值。
說明:
1、DQS是DLL根據(jù)clk產(chǎn)生的信號,這個信號也被稱之為數(shù)據(jù)眼,DQS的主要作用就是告訴控制器何時讀/寫數(shù)據(jù)。確保數(shù)據(jù)的穩(wěn)定接收和發(fā)送。
小節(jié):
到了這里,所以關(guān)于DLL的部分就配置完了,主要用到的寄存器只有3個:PhyControl0,PhyControl1,和PhyStatus0。
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
12步之后再才開始之前的第5步:
step5. Set the ConControl. At this moment, an auto refresh counter should be off.
設(shè)置ConControl,此時應(yīng)關(guān)閉自刷新計數(shù)器。
ldr r1, =0x0FFF2010 @ConControl auto refresh off
str r1, [r0, #DMC_CONCONTROL]
其中aref_en為0時就表示關(guān)閉自刷新計數(shù)器。
rd_fetch的設(shè)置是針對FIFO的讀取時間的,設(shè)置成2更保險一點~~(默認(rèn)值是1)
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step6. Set the MemControl. At this moment, all power down modes should be off.
配置MemControl比較重要的就是以下這幾位,突發(fā)長度,chip個數(shù),總線寬度,內(nèi)存類型。
其中一個MCD最多可以控制兩個chip,這里根據(jù)開發(fā)板情況進(jìn)行選擇,這里num_chip位設(shè)置為1.
#define DMC0_MEMCONTROL 0x00202400 // MemControl BL=4, 1Chip, DDR2 Type, dynamic self
ldr r1, =DMC0_MEMCONTROL @MemControl BL=4, 1 chip, DDR2 type, dynamic self refresh, force precharge, dynamic power down off
str r1, [r0, #DMC_MEMCONTROL]
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step7. Set the MemConfig0 register. If there are two external memory chips, set the MemConfig1 register.
#define DMC0_MEMCONFIG_0 0x20F01323 // MemConfig0
ldr r1, =DMC0_MEMCONFIG_0 @MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
str r1, [r0, #DMC_MEMCONFIG0]
這個寄存器的每一位都比較重要:
1、chip_base DRR的映射地址,默認(rèn)0x2000_0000
2、chip_mask 確定一個chip的映射范圍大小。1表示屏蔽,0表示不屏蔽。
如chip_mask = F0表示屏蔽高4位,那么映射大小就是:
0X0~0X0FFF_FFFF,也就是256M
如chip_mask = E0表示屏蔽高3位,那么映射大小就是:
0X0~0X1FFF_FFFF,也就是512M
3、chi_map表示內(nèi)存的排列方式:(一般選擇0,線性排列)
4、chip_col 表示列的位數(shù)
5、chip_row表示行的位數(shù)
6、chip_bank 表示一塊芯片的bank數(shù)
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step8. Set the PrechConfig and PwrdnConfig registers.
現(xiàn)在可以開始配置PrechConfig預(yù)充電寄存器和 Pwrdown寄存器,但是damo程序中把 PwrdnConfig registers.的
配置放到了最后一步,所以這里先只講述PrechConfig的配置。
ldr r1, =0xFF000000 @PrechConfig
str r1, [r0, #DMC_PRECHCONFIG]
這個寄存器用的其實是默認(rèn)值,具體位的含義可以參考手冊.
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step9. Set the TimingAref, TimingRow, TimingData and TimingPower registers according to memory AC parameters.
9.1 TimingAref
#define DMC0_TIMINGA_REF 0x00000618
ldr r1, =DMC0_TIMINGA_REF @TimingAref
str r1, [r0, #DMC_TIMINGAREF]
因為ddr是需要不斷的刷新保持?jǐn)?shù)據(jù)的,而這個刷新間隔不能太長,一般ddr這個間隔時間參數(shù)就是7.8us,具體時間查看ddr手冊。也就是說最長7.8us必須刷新一次。我們不能直接把7.8us告訴arm,必須轉(zhuǎn)換成時鐘周期數(shù)告訴給arm。及把時鐘周期數(shù)放到TimingAref.t_refi字段即可。那么周期如何算?首先你得知道此時提供MCD的時鐘是多大,比如是133M,那么周期數(shù)就是7.8 us * 133 MHz = 1038 = 0x40E;如果時鐘是200M那么周期數(shù)就是7.8 us * 200MHz = 1,560= 0x618;
9.2 TimingRow,這個寄存器主要是配置一些ddr時序參數(shù)了,這些參數(shù)需要到具體型號的ddr手冊中去一個個的找~~(當(dāng)然同樣,時間要轉(zhuǎn)換為時鐘周期數(shù))
#define DMC0_TIMING_ROW 0x28233287 // TimingRow for @200MHz
ldr r1, =DMC0_TIMING_ROW @TimingRow for @200MHz
str r1, [r0, #DMC_TIMINGROW]
9.3 TimingData 這個寄存器和上面寄存器一樣,需要到具體型號的ddr手冊中去一個個的找
其中需要注意的是cl,也就是CAS,
ddr手冊中明確說明CAS可以配置為3,4,5,6這幾個時鐘周期。值得注意的是,目前我們配置的ddr控制器的CAS,之后還需配置ddr芯片本身的CAS。
所以,我們必須確保這兩個CAS一致!
還有就是對于DDR2而言,所以wl這參數(shù)不用配置。但是對于低功耗的ddr就必須配置了。
#define DMC0_TIMING_DATA 0x23240304 // TimingData CL=3
ldr r1, =DMC0_TIMING_DATA @TimingData CL=3
str r1, [r0, #DMC_TIMINGDATA]
9.4 TimingPower 也是一樣
#define DMC0_TIMING_PWR 0x09C80232 // TimingPower
ldr r1, =DMC0_TIMING_PWR @TimingPower
str r1, [r0, #DMC_TIMINGPOWER]
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step10 If QoS scheme is required, set the QosControl0~15 and QosConfig0~15 registers.
現(xiàn)在不用Qos,跳過了~~。。。
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step11 and step12 被移到了第5步之前了~~
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step13. Confirm whether stable clock is issued minimum 200us after power on
由于step11 and step12被提到前面了,所以現(xiàn)在可以不等了~~
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step14~26 這些都是配置ddr芯片(而不是ddr控制器了),都是通過XXX寄存器向ddr芯片發(fā)送命令。
step14. Issue a NOP command using the DirectCmd register to assert and to hold CKE to a logic high level.
ldr r1, =0x07000000 @DirectCmd chip0 Deselect
str r1, [r0, #DMC_DIRECTCMD]
發(fā)送nop指令將CKE置高
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
step15. Wait for minimum 400ns.
因為此前CKE一直為高,所以這里無需再等。
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
上一篇:S5PV210 LCD顯示
下一篇:uboot啟動過程理解
推薦閱讀最新更新時間:2025-07-08 17:50



設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 使用 Analog Devices 的 LTM4636-1IY 的參考設(shè)計
- 運動MEMS和麥克風(fēng)MEMS擴展板,適用于STM32 Nucleo
- AD9234-LF1000EBZ、9680CE02B 評估板,適用于高達(dá) 1GHz 輸入帶寬的 AD9234-1000 高速 ADC
- 使用 NXP Semiconductors 的 IP4052CX20/LF 的參考設(shè)計
- AR0132AT6M00XPEAH3-GEVB:?1.2 MP Sunex DSL945D 1/3" iBGA CIS HB
- 使用 Analog Devices 的 LT1761 的參考設(shè)計
- SRK1000反激式自適應(yīng)同步整流控制器
- 使用 Richtek Technology Corporation 的 RT9387A 的參考設(shè)計
- AZ34063U降壓轉(zhuǎn)換器的典型應(yīng)用
- TAR5S45 點穩(wěn)壓器(低壓差穩(wěn)壓器)的典型應(yīng)用
- ICDIA 2025 創(chuàng)芯展圓滿落幕!
- 中興微電子亮相ICDIA 2025,共話RISC-V架構(gòu)推動AI算力普惠化進(jìn)程
- 動力電池“三國殺”:中企提前鎖定勝局,日韓廠商集體失守
- 研究人員開發(fā)出人工智能雷達(dá)技術(shù) 可用于高分辨率3D城市制圖
- 上半年動力電池TOP15:寧德時代和比亞迪裝車近200GWh 兩家公司新上榜
- 半年砸下數(shù)千億元!“并購”浪潮下,汽車芯片大戰(zhàn)再起風(fēng)云
- 奇瑞人形機器人9月開售并將面向個人用戶,機器人時代該來了嗎?
- 華為李文廣:華為智能駕駛規(guī)劃曝光,加速追趕特斯拉
- 功能迭代和功能安全的矛盾及車端應(yīng)用層-下
- 功能迭代和功能安全的矛盾及車端應(yīng)用層-中