JZ2440 베어 보드 개발 사례 # 5 NorFlash 및 SDRAM 메모리 컨트롤러

메모리 컨트롤러

액세스 그것을 원하는 경우 메모리 칩, 당신은 쓰기가 가능하고 다른 제어 라인 물론, 자신이 IO 타이밍 시뮬레이션에 의해 제어 될 수 있지만, 너무 많은 문제가, 수 읽기, 데이터 라인, 칩 라인을 선택 주소 라인에 필요한 메모리는 이제 S3C2440있다 로직 제어를 얻기 위해 우리에게 도움이 될 수 컨트롤러는, 우리는 관련 레지스터는 메모리 컨트롤러 좋은으로 제공되는 타이밍 차트에 비해 메모리 성능을 사용해야합니다.

보기 S3C2440 설명서, 당신은 관련 특성을 포함하여, 표시 제한되는 것은 아니지만 볼 수 있습니다 :

1. 소프트웨어의 단부의 크기가 제공 될 수있다 

2.8 각 은행 (모든 단어를 사용한다면) 1GB의 당신이 할 수있는 최대 값을 제어 할 수 있습니다 128MB 메모리 1GB를 총

3. BANK0 외에도 비트 프로그래밍 액세스는 8/16 / 32는 BANK0이 16/32를 제공 할 수있다

은행 4.8에서 6 중고 ROM, SRAM 등, 두 ROM에서 사용될 수있는 SRAM은 SDRAM 등이 될 수있다

5.8 은행 일곱 개 고정 위치 오프셋으로 액세스 할 수있는

제가요 조정 개시 어드레스 및 뱅크의 크기 수단 bank7

7. 지원 및 저전력 SDRAM을위한 셀프 리프레쉬 모드.

이는 메모리 맵, 두 방법과 NandFlash NorFlash S3C2440의 존재의 블록도에서 볼 수있다. NorFlash 방식으로 시작되면, 레지스터 2440의 초기 값이 경우 norflash 충분히 느린 그래서 norflash BANK0 직접 매핑 구동 될 수 있고, 내장 SRAM은 bank7 매핑된다. 메모리 요약 전면 4킬로바이트 NandFlash 방식으로 시작 NandFlash 2440은 내장 SRAM에서, 상기 SRAM은,이 시점에서 개시 어드레스에 현재 매핑된다 nGCS0 보이지 않는, 즉 NorFlash 사용할 복사한다. 구체적으로는 어떤 방법으로는 핀 OM1 OM0 의해 결정되는 시작하고, 상기 제 1 액세스 메모리 전에 잘 결정되어야한다.

 원리 차트 결합 JZ2440는 OM1는 그라운드 레벨 (GND) 0 살아 접지 스위치 제어 3.3V 전원의 타단에 연결되며, 모드를 시작 NorFlash NandFlash 또는 16 비트를 시작하도록 결정되었다.

 

Norflash 방법도 다이어그램에서 볼 수있는도 핀에서 알 수있는 바와 같이, 사용 된 모델 MX29LV160DBTI의 norflash가있어서 사용 : 전원 핀, 주소 라인, 데이터 라인, 쓰기 활성화 가능 읽기 칩 2 ^ 20 = 1M * 16 비트 = 16Mbits 크기와 비교하여 데이터 선 (20)을 이용하여,이 칩 (16) 칩의 데이터 선으로부터 알 수 (Nxxx는 액티브 로우를 나타내는)가 16 비트 폭의 데이터를 제공로부터 선택된다. 그러나 오히려 A0 A0 이상의 A1은 A0를받은 주소 라인 연결에 대응하는 이상하다. 수동이 점의 S3C2440 칩의 예가있다 :

A0 A0, 각 주소의 주소 도킹 폭 플래시 8 비트가 정렬 될 때 여기 내 이해 데이터 칩 (8), 폭 어드레싱 액세스 어드레스로 설계 S3C2440 어드레스 라인이다. 어드레스 0 필요성을 다루는 경우, 폭 A1 및 A0가 도킹 플래시 16 비트를 사용하는 경우, 즉 어드레스 / 2, 또한 이진 한 것으로 이해 될 수 있으며, 예를 들어, A0이, A1은 0, 0, 어드레스 데이터가 0에 접근 할 때, 어드레스가 1 일 때, A0,이 경우, A1이 0이고, 여전히 판독 어드레스 데이터 0 1, 어드레스 2의 정수배에 도달 할 때, A0가 0, 16 비트의 데이터를 읽어 , A1은, (1) 상기 제 2의 16 비트의 데이터를 판독한다. 물론, 쓸모없는 A0는 A0는 상위 8 비트가 필요한 16 비트의 데이터를 구별하는 8 비트을 낮추기 위해 사용될 수있다. 사용 폭 32 비트 플래시 때문에, A2는 다음 8 A0, A1 및 A0가 32 비트의 데이터를 판독 이용해야하는 데이터를 결정하는 데, 물론,이 값은 예문 비트의 방향에 따라 명령어 너비, LDR, 32 비트에 대한 직접 액세스는 LDRB는 8 비트의 데이터를 취입하는 경우 경우.

칩의 매뉴얼은 우리가 레지스터 세트에 설정했는지 알 칩에 사용되는 비트 수를 읽어, 나는 이것이 사용 수신 버퍼 설정하는 데 사용되며, 또한 A0 또는 A1 제거 위에 언급 한 요구에 따라 사용할 수있는 비트 수라고 생각합니다 데이터 비트 폭.

기능뿐만 아니라 신호 처리 하드웨어 로직 함수, 즉, 칩 선택 기입 선별 메모리 제어기의 데이터 외에 활성화 및 제어 신호를 사용 읽고는 같은 우리는 각 신호가 사용되는 칩의 성능에 따라 단 사이에 설정해야 시간 간격은, 메모리 컨트롤러는 이에 특히 시간의 타이밍 차트를 참조하여, 현상 부담을 경감 논리가 필요할 때 우리는 상위 계층으로 사용할 대응하는 제어 신호와 칩 NorFlash 및 SDRAM을 말할 때까지 수동 콘트라스트를 보낼 것이다. 또한, 메모리 제어기 (8) 뱅크 맵 주소 및 통합 어드레스 특정 칩의 어드레스 레지스터가 읽을 수있는 메모리 제어기 및 기입 어드레스에 직접 매핑, 해당 등록 후 설정 매뉴얼을 볼 수있다.

 NorFlash

이 섹션에서는 MX29LV160DBTI NorFlash 매개 변수와 타이밍 다이어그램과 그 일을 알고 제어 필요에 JZ2440의 사용에 대해 설명합니다.

칩은 수, 3V 전원 여덟 (2M 메모리 셀)에 필요한 전원 또는 16 비트 (1M 기억 부), 칩의 가장 중요한 기능에 대한 설명서 페이지 16Mbits의 크기 파라미터를 주어졌다 볼 수있다.

 거절, 로직 칩 핀 심볼 테이블을 볼 수 있고, 테이블이 나타내는 상기 NorFlash는 어드레스 선, 데이터 입출력 라인, 칩 선택 기입 활성화 워드 / 바이트 선택 입력, 리셋, 판독 인 에이블 비지 상태의 출력과 전원 라인과 가속 하드웨어 쓰기 방지 핀. 핀은 부동 또는 높은 수준에 연결하는 것은 그들을을 비활성화하는 데 사용할 필요가없는 경우 가속도가 존재 내부에 끌어된다.

 Q15 / A-1은 초기 텍스트 참조 무엇을 의미하는지 A가 A-1 네거티브, 즉 결합 된 AM-A0 어드레스 이후 A-1 비트임을 알 수 있음이 이해하지. 모든 메모리 셀들이 공동 A0-A19 어드레스 선 (20)에 의해 달성 될 수있는 칩의 기억 부 1M, 주소와 8 비트 인 폭 비트, 16 비트의 비트 폭은 메모리 셀이 두 배로 요구 어드레스 멀티 주소가 필요 라인이 때, 데이터 라인은, 대기 어드레스 라인이 다중화되어으로 사용할 수 있도록 테이블이 설명된다.

 또한, 아래의 칩의 블록도이며, 제어 직접 우리의 제어 입력에 관련된 컨트롤 핀에 결합되는 로직 블록, IO 데이터 버퍼 블록 버퍼 래치 어드레스이다. 외부 제어 로직 모듈은 기입 상태 머신과 같은 다른 내장 모듈에 신호를 제어한다. 어드레스 어레이는 프로그램 배열 같은 비트 [x는 플래시 어레이에 의해 해결되도록 어드레스 입력 어드레스 블록은, 출력 X, Y 디코딩, X는 디코딩되어 워드 선 어드레스 Y 어드레스 디코드 비트에 분할 것 [Y] 두 배열, 즉 우리 어드레스 디코드 칩 주소는 인식된다. 데이터 증폭기에 의해 출력 된 전압은 Y 패스 게이트 회로로 IO 버퍼로 적절한 데이터를 얻을 수있다. 우리는 NorFlash는 기존의 직접 쓰기와 동일하지 알고 쓰기에 특별한 명령을해야하고, 우리는 우리가, IO 데이터 (명령 데이터 래치) 데이터 래치 명령에 래치됩니다 제어 신호를 보낼 때 아직 같은 다음 "내부 언어"칩 상태 레지스터에 출력 한 상태로 변환 복호화하는 것이 우리가 원하는 데이터를 작성할 때, 상태 머신은 다양하고 우수한 정말로 알 수 있으며, 해당 주 작동 상태 머신 명령을 구동 레지스터 와. 이 모듈의 프로그램 / ERASE 고전압 설명서 참조 정보는 해당 논리 장치는 대전 제거하거나 집합 배출된다 충족 I는 대응하는 모듈로 장치 (아마 오해) 알 제어 로직 하이를 제공한다 (0/1 비트 ) 가능성 함수.

 

 표에는에게 명령을 다음과 사실상 GPIO 핀은 통상의 아날로그 명령 제어 목적이 될 수있는 제어 장치에 대응하는 블록 다이어그램, 핀의 작동 상태에 대응하고 있지만, 지금 우리가 메모리 제어기 어느 그것은 우리가이 다루는 도움이 될 것입니다.

칩의 내부 상태 머신은 우리의 요구 명령에 작동 할 수 있도록하는 것이, 고정 된 시간 기간 내에서 어떤 명령들 및 데이터 입력을 해결하기위한 필요성을 나타내는 다음의 도면을 염려되지만. 이 층은, 그것이 필요한 프로그램의 나머지 기능은 대응하는 구현, 논리 구현 층 인 메모리 제어기에 의해 확보되는 예비 기록 가능한 상태로 할 필요가있다.

필요  초점  타이밍 다이어그램을 설명하는 적절한 시간에 관심이 표에 따라 타이밍 다이어그램을보기 위해 다시 올 것이다.

 수동 많은 Norflash에서 칩 타이밍도, 우리가 수동 S3C2440 칩 개략적 참조 작업을 단순화 NorFlash 대응하는 타이밍도를 추출하는 데 사용할 수있다.

첫째, S3C2440, 두 읽기 및 쓰기 타이밍 다이어그램 관련 NorFlash 먼저 찾아  읽기 :

동시에 읽기 NorFlash에서의 타이밍도를 찾을 수 있습니다 :

 일정 위에서 설명한 컨트롤하는 시간이 의미로 나타납니다 알 수 있습니다 :

TCE : 데이터가 유효 이후 칩 선택 신호 CE 긴 전송

Tsrw : 판독 및 기록 상태 사이의 전환 시간 간격

Toeh : 출력 쓰기에 대한 요구는 우리가 Toeh는 OE를 활성화 할 수 있습니다 후 시간이 지나면 무효 사용하도록 설정하는 것이 유지하기 위해 비트를 사용

발가락 : OE 발가락 시간 후에 효과가 데이터를 수 있도록 경과

TAA : 데이터 유효 시간 TAA 통해 전송 어드레스 신호

TRC : 읽기 사이클 시간, 그 시간 읽기 동작시

토 : CE 및 OE는 데이터 보존 시간과 주소 뒤에 비활성

TDF : OE 및 CE, 잘못된 시간 후 출력 데이터를 부동 즉 시간주기 동안 데이터가 불확실

S3C2440, TACS 어드레스 신호 칩 수에서 실행하기 전에 많은 시간을 필요로한다는 요구 사항 NorFlash 때문에 0에 존재하지 않는다 TCO가이 CE 전에 전송 시간을 OE를 활성화 할 필요입니다 수 있도록, 더이 즉, 0으로 설정 요구는 동시에 S3C2440는 어드레스 신호, 칩 선택 신호 CE 신호 OE 출력 인 에이블을 보낼 것이다. TACC 데이터를 효율적 S3C2440 출력 제어 신호가 될 수있는 한 후 시간과 NorFlash TAA, TCE, 투 관련된 우리는 또한 3 개 개의 신호를 발행하기 때문에, 따라서 그 실험이기 때문에, 우리는 가장를 선택 TAA 긴 선택할 수 긴 70ns로 후 70ns로, 즉 세 개의 제어 신호는 데이터를 판독 출력 할 수있다. TACP 따라서 최소값으로 설정 NorFlash에 표시되지. 태크 Tcoh 세 제어 신호가 순차적으로 0으로 할 필요가 없기 때문에, 잘못된 시간 간격을 도시한다. 우려는 약간의 시간이 부동 후 NorFlash 데이터 출력, 칩 매뉴얼 주어진 다음 시간은 항상 70ns로 세 개의 제어 신호 후 출력을 읽을 필요가 읽어 들이기 때문에 우리가 그래서, 조금 까다로운 여기에,이 30ns입니다입니다 플로트 시간을보세요. 나는 타이밍 다이어그램을 포함하는 것은 유추 해석 할 수 있도록, 여기에 확장하지, 동일 읽을 시간을 찾기 위해 물품.

다른 관련된 SDRAM 설정할 수 있도록 요약하면, 시작 등 BANK0에 사용되는 BWSCON, BANKCON0을 수반 S3C2440 제공 레지스터 및 NorFlash이다.

이 제공 될 필요는 읽기 전용 레지스터, 그래서 여기 BWSCON 여기 BANK0 부트 영역으로 부트 의해 판단 된 상기 제 1 비트 폭을 설정하고 OM0 OM1는 16 비트이다.

 그것은 여기뿐만 아니라 단지가 될 수 NorFlash과 관련된 시간 설정 관련 설정입니다 BANKCON0을 따랐다. 여기에 모든 시간 기간은 시간에 의해 표시되는, 상기 메모리 제어기의 블록 다이어그램 뷰 S3C2440 클럭 이전 운동은 HCLK가 100MHz로 설정된 상태에서, 버스를 알고 HCLK에 매달아 될 수 있으므로, 여기에서 10ns의 클럭 TACS 있도록한다 및 TCO가 세트 0에, TACS는 8clock로 설정 (칩 매뉴얼없이 최소 값이없는 제로 경우, 테스트 할 수 있어야하기 때문에 매우 보수적 인 옵션은, 사실, 낮을 수있다).

다음과 같이 출력 코드는 다음과 같습니다

s3c2440.h
-----------------------------
#ifndef __S3C2440_H
#define __S3C2440_H

#include <stdint.h>

.....

//memory controller 
#define BWSCON (*((volatile uint32_t*)0x48000000))

#define BANKCON0 (*((volatile uint32_t*)0x48000004))

....


void HardwareInitAll(void);
void Delay(uint32_t time);
void MemoryControllerInit(uint32_t val);


#endif

s3c2440.c
----------------------------

......

void MemoryControllerInit(uint32_t val)
{
	BANKCON0 = (val<<8);        //此处不能像之前那样清零控制位后再设置,置位0时NorFlash读取异常,将死机
}

void HardwareInitAll(void)
{
	WatchDogDisable();
    /*调试过程发现norFlash启动时,ClockDevideConfig必须在MPLLConfig前设置
    *应该与MPLL设置时的locktime相关,在norflash启动时速度较慢,分频来不及在
    *locktime结束前设置,而nandFlash则足够时间*/
	ClockDevideConfig();    
	ChangeModeToAsynchronous();
	MPLLConfig();
	MemoryControllerInit(7);  //8 clock
}

#include <stdint.h>

#include "s3c2440.h"
#include "led.h"
#include "uart.h"

int main()
{
	HardwareInitAll();
	LedInitAll();
	UartInit();
	uint8_t led_now=kLed1;
	uint8_t i=0;
	
	uint8_t tmp;

	while(1)
	{
		tmp = getc();
		putc(tmp);
                //实验证明到3的时候已经停止运行了,推测因为30ns浮空时间的限制
		if(tmp <= '7' && tmp >= '0'){ tmp -='0'; }
		MemoryControllerInit(tmp);
		
		i=6;	
		while(i--)
		{
			SingleLedOFF(led_now++);
			if(led_now > kLed3) { led_now =kLed1; }
			SingleLedON(led_now);
			Delay(100000);
		}
	}
}

 

SDRAM

침구 앞의 지식, SDRAM은 이해하기 쉬울 것이다. 우선, 제 온보드 보이는 개략도 JZ2440 SDRAM, 데이터 선 (32), SDRAM으로 메모리 (32)의 두 개의, A0의 SDRAM에 어드레스 선 A2. SDRAM 칩에서 수동 * 16 비트는, 따라서, 메모리 셀에 대한 요구를 해결하는 것은 (16M)를 가지며, 어드레스 선 (24)이어야 SDRAM 1,600 용량으로 간주하지만, 용도 만도 A2-A14, 및 A24-와 수 A25는 SDRAM의 액세스 모드에 의해 결정된다 BA0 및 BA1에 접속된다.

 SDRAM 메모리는 네 개의 뱅크 내부 액세스 메모리 셀들에 필요한, 각 뱅크 * 4M 16 비트, COL 및 행 어드레스들로 분할된다 블록도로서 SDRAM은이를 알 수있다. 따라서, 순차적으로 뱅크를 결정하기 위해 SDRAM의 뱅크 어드레스 요구에 대한 액세스를 제공하는, 열 라인을 제공하기 위해 결정되는 칼럼 COL 특정 시간 tRCD와 파라미터 제어되는 행 (COL) 사이에 요구되는 결정. 내용이 가지 않을 비교적 간단한 블록도, NorFlash 비유 명확하게 이해할 수있다.

 

다음과 같이 레지스터를 설정해야합니다 :

두 개의 평행 판 SDRAM이 너무 DW6 10, 16 비트, 32 비트의 메모리이다 bank6 S3C2440 SDRAM 메모리 컨트롤러를 이용하여, 회로도로부터 알 수있는, Bank6 관련 레지스터를 설정하는 것만이 필요하다. WS6은 대기가 비트를 비트,하지만 S3C2440 SDRAM을 읽는 것은 바쁜 캔 데이터에없는 응답하면, SDRAM은 비트 2440 시간을 기다릴 정도로 설정할 수 있습니다, 직접 해제 아무 소용도 없다. 설정 SDRAM 멀티 바이트를 읽거나 쓰기가 만 읽기 및 쓰기가 미치는 영향이 효과 세트를 작성 0으로 설정된 경우 ST6은 그것의 종류 바이트 변화의 유일한 작업입니다, 우리가 읽기를 따라서 도움 따기 데이터 등을 메모리 컨트롤러는 0으로 설정 될 수있다.

 MT는 우리가 그들을 무시 그러므로 SDRAM, 비 SDRAM의 중간 부분 TACS-PMC를 사용하고 있는지 (11 개) 수단으로 설정됩니다. tRCD와의 시간 행과 골 주소 상기 간격, 수동 검색 SDRAM 칩, 당신은 20 나노초 (ns)입니다, 그래서 00를 사용, 18ns의 최소를 알 수 있습니다. SCAN은 칼럼 어드레스 비트 SDRAM보기 SDRAM 칩 수동 검색 칼럼 어드레스를 나타내는 경우는 A0-A8, 즉 (9)에 사용되는 열 어드레스 비트 SDRAM을 알 수 있으므로, 01로 설정된다.

 

 SDRAM은 필요가 데이터를 유지하기 위해 새로 고칠 수, 또는 당신이 여기 새로 고침 실제로 충전에 콘덴서에 저장된 데이터가 손실 될 수 있습니다, 동적 메모리입니다. REFEN는 기본 새로 고침을 사용하십시오. TREFMD는 자동으로 재생 모드로 설정합니다. TRP 로우 어드레스로 전송 된 칩 선택 신호를 활성화하거나, 하나의 행 프리 차지 시간에서 다른 액세스 라인으로 전송 기간 이후가 직접 수동 검색 SDRAM 칩, 20 나노초 (ns)로 설정할 수는 00, 즉, 세트를 찾을 수있다. TSRC은 TRP의 전하에 더하여 TRC-TRP, 다른 행 라인에 액세스하는 데 필요한 TRC 총 점프 타임에 의해 얻을 수 TSRC은 TRC 됨 최소 값 60ns로 상기 TSRC의 40ns의 00 행, 즉 세트를 요구했다. 새로 고침 카운터 보기 SDRAM 데이터 시트 기능 페이지, 당신은 8192 새로 고침주기 / 64ms를 볼 수 있습니다 즉 Refresh_period = 64ms / = 7.8us 8192의 refresh_Couter가 1269로 공식에 따라 계산 될 수있다.

순차적으로 다운 버스트 모드 액세스 (한번에 복수의 메모리 셀에 대한 액세스, 즉, 연속적인 메모리 위치의 값을 반환하는, 길이를 발행 시작 주소) 모드 전력 다운을 가능 (SCKE 진입하여 절전 모드)를 설정하는 (에너지 고려 절약도), BK76MAP 우리가 001을 선택하는 데 사용하는 64메가바이트에 따라 SCLK_EN 수 있습니다.

 고정 단어 옵션을 고정, 직접 특별한 시간 CL을 선택할 수 있습니다, CL은 SDRAM 데이터 시트를 볼 얻을 수있는 열 주소 데이터 이후에 발행와 CL 2 2 또는 3을 눌러을 할 수 있다는 것을 알 수있다. 이 레지스터 블록도는 상기 SDRAM으로부터 알 수 있고, SDRAM 모드 레지스터에 설정된다.

 다음과 같이 요약하면, 출력 코드는 다음과 같습니다

s3c2440.h
----------------------------------
#ifndef __S3C2440_H
#define __S3C2440_H

#include <stdint.h>

...


//memory controller 
#define BWSCON (*((volatile uint32_t*)0x48000000))

#define BANKCON0 (*((volatile uint32_t*)0x48000004))
#define BANKCON6 (*((volatile uint32_t*)0x4800001C))

#define REFRESH (*((volatile uint32_t*)0x48000024))
#define BANKSIZE (*((volatile uint32_t*)0x48000028))
#define MRSRB6 (*((volatile uint32_t*)0x4800002C))

void HardwareInitAll(void);
void Delay(uint32_t time);

#endif

s3c2440.c
------------------------
#include "s3c2440.h"

...

static void MemoryControllerInit(void)
{
	BWSCON = (2<<24);
	BANKCON0 = (4<<8);
	BANKCON6 = (3<<15)|(0<<2)|(1<<0);
	REFRESH  = (1<<23) | (1269 << 0);
	BANKSIZE = (1<<7) | (1<<5) | (1<<4)|(1<<0);
	MRSRB6   = (2<<4);
}

void HardwareInitAll(void)
{
	WatchDogDisable();
	ClockDevideConfig();
	ChangeModeToAsynchronous();
	MPLLConfig();
	MemoryControllerInit();
}


#include <stdint.h>

#include "s3c2440.h"
#include "led.h"
#include "uart.h"

int sdram_test(void)
{
	volatile unsigned char *p = (volatile unsigned char *)0x30000000;
	int i;

	// write sdram
	for (i = 0; i < 1000; i++)
		p[i] = 0x55;

	// read sdram
	for (i = 0; i < 1000; i++)
		if (p[i] != 0x55)
			return -1;

	return 0;
}

int main()
{
	HardwareInitAll();
	LedInitAll();
	uint8_t led_now=kLed1;

	while(1)
	{
		if (sdram_test() == 0)
		{
			SingleLedOFF(led_now++);
			if(led_now > kLed3) { led_now =kLed1; }
			SingleLedON(led_now);
			Delay(100000);
		}		
	}


}

테스트 코드는 연속적으로 SDRAM에 기록하고 연속적으로 판독 된 데이터가 올바른 램프 동작이 성공적으로 설정되면 이것에 의해, 조명을 수행할지 여부를 결정한다.

 
게시 19 개 원래 기사 · 원 찬양 7 · 전망 6924

추천

출처blog.csdn.net/G_METHOD/article/details/104419712