JZ2440裸ボード開発プラクティス#5&NorFlash&SDRAMメモリ・コントローラ

メモリコントローラ

、あなたがそれにアクセスしたい場合、あなたはアドレスライン、データラインに必要な、チップは行をメモリチップ選択、ライトイネーブル、有効にし、他の制御ライン読み、当然のことながら、自分自身がIOタイミングシミュレーションによって制御することができますが、あまりにも面倒、今S3C2440メモリがありますロジック制御を取得するために私たちを助けるかもしれコントローラは、我々は唯一の関連レジスタは、メモリコントローラは良いに提供されるタイミングチャートに比べてメモリ性能を、使用する必要があります。

:ビューS3C2440マニュアルには、関連する特性を含む、示され、これらに限定されないが、見ることができます

1.ソフトウェアの端部の大きさを提供することができます 

2.8各バンク(すべての単語を使用していた場合)1ギガバイトにすることができます最大を制御することができ、メモリ128MBの1ギガバイトの合計

3. BANK0に加えて、ビット8/16 / 32ビットのプログラマブルアクセス、バンク0が16/32を設けてもよいです

4.8で銀行、6は、ROM、SRAMなどを使用することができる等2つのROM、SRAM、SDRAM、で使用することができます

5.8バンク7点の固定位置は、オフセットとしてアクセスすることができます

6. A柔軟な調整開始アドレスとバンクのサイズ、手段BANK7

7.サポートと低消費電力SDRAMのセルフリフレッシュモード。

これは、メモリ・マップのブロック図で、二つの方法NandFlashとNorFlash S3C2440の存在から見ることができます。NorFlash方法を開始したときに、レジスタ2440の初期値は十分に遅いのでnorflash直接BANK0にマッピング駆動することができ、この場合をnorflash、埋め込みSRAMはBANK7にマッピングされます。NandFlash的に開始時のメモリの概要フロント4キロバイトは、NandFlash 2440は、利用不可能即ちNorFlash、nGCS0不可視今回内蔵SRAMにコピーされ、SRAMは、この時点での開始アドレスにマッピングされます。どの方法によって開始された特定の、OM1はピンOM0によって決定され、第1アクセス・メモリの前にも決定されるべきです。

 原理図を結合JZ2440は、OM1は接地レベルGND 0、生きている接地スイッチ制御3.3V電源の他端に接続され、モードを開始NorFlash NandFlash又は16ビットを開始すると判断されました。

 

Norflash図ピンに見られるような方法も含む使用、使用モデルMX29LV160DBTIのnorflash、図に見ることができる:電源ピン、アドレス線、データ線、リードイネーブル、書き込みイネーブル、チップ選択される(Nxxxがアクティブロー示す)、それは2 ^ 20 = 1M * 16ビット= 16Mbitsサイズと比べて、データ線20を用いて、16ビット幅のデータを提供し、チップ16のチップのデータ・ラインから分かるれます。しかし、むしろ、A0 A0よりもA1はA0を受信したアドレスラインは、接続に対応することに奇妙です。手動この点についてのS3C2440チップの例があります。

ここでは私の理解、A0 A0、各アドレスのアドレスをドッキング8ビット幅のフラッシュは、整列されているチップ8のデータ幅をアドレス指定するアクセスアドレスに設計されたS3C2440アドレスラインがあります。16ビット幅のフラッシュを使用する場合、A1及びA0のドッキング、すなわち、アドレス/ 2は、また、バイナリ1と理解することができるアドレス0への必要性に対処する場合、例えば、A0は0であり、A1は0であり、このアクセスするときのアドレスデータは、16ビットのデータを読み取り、アドレスが1のとき、A0は1であり、A1が0であり、この場合は、まだアドレスデータ0を読み出し、アドレスが2の整数倍に達したとき、A0は0であり、0であります、A1が1である、第2の16ビットのデータを読み出します。もちろん、無駄A0、A0は、必要な16ビット・データ上位8ビットまたは下位8ビットを区別するために使用することができません。使用幅32ビットフラッシュので、A2は、8とA0、A1、およびA0は32ビットのデータを読み込む使用する必要のあるデータを決定するために、当然のことながら、この値は、我々の命令ビットの向きに依存しますLDR、32ビットへの直接アクセスは、LDRB場合、8ビットのデータがその中に取り込まれている場合、命令幅、。

チップのマニュアルは、私たちがレジスタセットに設定されていることを知っているチップに使用されるビットの数をされて読んで、私は、これは使用受信バッファを設定するために使用され、また、A0やA1を削除するには、上記の希望に応じて、使用することができますどのように多くのビットだと思いますデータビット幅。

メモリコントローラ機能を選別データ、ならびにハードウェアロジック機能を処理する信号に加えて、即ち、チップ選択、ライトイネーブル制御信号をリードイネーブル等、我々は、使用されるチップの性能に応じてのみ各信号間で設定する必要が時間間隔、メモリコントローラは、論理我々はそれによって特に必要とされる時間のタイミングチャートと話すNorFlash及びSDRAMにチップ手動コントラストを参照して、開発負担を軽減、上位層に使用する対応する制御信号を送信します。また、メモリコントローラ8銀行マッピングされたアドレスと統一アドレッシング特定のチップのアドレス・レジスタを読み出すことができるメモリコントローラと書き込みアドレスに直接マッピングされ、関連レジスタの後に設定し、マニュアルを見ることができます。

 NorFlash

このセクションでは、MX29LV160DBTI NorFlashパラメータとタイミング図とそれらの事を知るための制御が必要にJZ2440の使用を記載しています。

チップは、チップの最も重要な特徴のマニュアルページパラメータ、16Mbitsのサイズ、缶8(2Mメモリセル)に必要な3V電源または16ビット(1M記憶手段)を与えられている見ることができます。

 、断っ、ロジックチップのピンは、シンボルテーブルを参照することができ、テーブルは、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データ(コマンドデータをラッチ)データラッチコマンドにラッチされる制御信号を、送信時にはまだ同じ続きます「内部言語」チップ・ステータス・レジスタへの出力、および状態に変換し、デコードすることは、我々が所望のデータを書き込むように、ステートマシンは、汎用性といい本当に見ることができ、対応する状態の動作状態のマシンコマンドを駆動するレジスタと。このモジュールのプログラム/消去高電圧マニュアルを参照の説明は、当該論理デバイスが充電され、削除または設定するために排出される満たすために、私は、対応するモジュールにデバイス(おそらく誤解を)理解制御ロジックハイを提供する(0/1ビット)潜在的な機能。

 

 次の表に、コマンドおよび対応する操作端子の状態と、実際には、GPIOピンは、通常のアナログ・コマンド・コントロールの目的であってもよいが、今我々は、メモリコントローラを有する制御装置、に対応するブロック図で、それは、私たちはこれらに対処するのに役立ちます。

チップの内部状態マシンが我々の目的のコマンドに動作させることができるように、一定時間内にいくつかの命令およびデータ入力に対処する必要性を示す以下の図を懸念しています。この層は、それが必要であるプログラムの残りの部分は、機能は、対応する実装するために、論理的なインプリメンテーション層であるメモリコントローラによって保証されるプリライトイネーブル状態にする必要があります。

する必要が  フォーカス タイミング図を説明する関連する時間上の注意は、この表によるとタイミング図を参照してくださいに戻ってくるだろう。

 マニュアルの多くのNorflashチップタイミング図は、ここでは、手動S3C2440チップの回路図を参照してください作業を簡素化するためにNorFlashに対応するタイミング図を抽出するために使用することができます。

まず、S3C2440、2つだけの読み取りと書き込みのタイミングダイアグラム関連NorFlash、最初に見つけ  読書を

同時に、読み取りNorFlash中のタイミング図を見つけます:

 スケジュールは上記のコントロールはする時間が意味するものとして表示されます知ることができます。

TCE:データが有効になった後、チップセレクト信号CEは長い送られました

TSRW:読み取りと書き込みの間の状態遷移の時間間隔

TOEH:出力はTOEHはOEを有効にすることができた後、我々は時間の後に無効な書き込み許可することの必要性を維持するためにビットを有効にします

足:OEつま先時間が経過した後に有効であることがデータを有効にします

TAA:データ有効時間TAAを経由して送信されたアドレス信号

TRC:読み出しサイクル時間、読み出し動作時間の間に

TOH:CEとOEは、データ保持時間とアドレスの後に非アクティブであります

TDF:期間にわたるデータが不確実である、すなわち、OEおよびCE後に無効時の出力データを浮動

S3C2440、TACSアドレス信号チップ有効では問題の前に多くの時間を要する、という要件NorFlashので、0にありません;のTCOはCE前送られたどのくらいのOEを有効にする必要がある可能、全くありすなわち、0に設定要件は、同時にS3C2440は、アドレス信号、チップ選択信号CE、出力イネーブル信号OEを送信します。TACCは、我々はまた、3つの信号を発行したため、データは、効率的にS3C2440出力制御信号、およびNorFlash TAA、TCE、足関連することができた後の時間であるため、最長TAAを選択することができ、それは実験なので、私たちはほとんどを選びます長いで70ns後で70nsすなわち、3つの制御信号は、データを読み取るために出力することができます。TACPしたがって、最小値に設定NorFlashにマークされていません。タコTcohと3つの制御信号が順次0に設定する必要がない、無効な時間間隔を示しています。懸念は、いくつかの時間のフローティング後NorFlashデータ出力され、チップマニュアルの与えられたが、次回の読み取りが常にで70ns 3つの制御信号の後に出力を読み取る必要があるため、ここで私たちは、少しトリッキーです、30nsのですので、ノーフロート時間をご覧ください。私はタイミング図が関与することは類推解釈することができますので、ここでは展開されませ同一であるが、読む時間を見つけるために書きます。

他の関連するSDRAMが設定できないように要約すると、開始は、としてBANK0に使用さBWSCON、BANKCON0を伴う、S3C2440が設けられたレジスタ、およびNorFlashあります。

それは設ける必要がなく、読み取り専用であるので、ここで登録し、BWSCONはここバンク0ブート領域として、ブートによって決定された、第1のビット幅を設定し、OM1 OM0は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は理解することが容易になります。まず、第1のオンボードの外観の概略JZ2440 SDRAM、32本のデータ線、SDRAMメモリ32のうちの2つの合計、A0のSDRAMへのアドレス線A2。チップはSDRAM 16Mの容量として見ることができるSDRAM * 16ビットからマニュアル、したがってメモリセルの必要性に対処することは16Mを持って、アドレスラインは24にする必要がありますが、用途は唯一のA2-A14を把握し、A24-とA25は、SDRAMのアクセス・モードによって決定されBA0とBA1、に接続されています。

 ブロック図としてSDRAM SDRAMメモリは、4つのバンク、そこにアクセスメモリセルに必要な各バンク4M * 16ビット、列および行アドレスに分割されている場合、それを見ることができます。したがって、順次バンクを決定するためにSDRAMバンクアドレスニーズへのアクセスを提供するために、行ラインを提供するために決定され、列COLは、一定時間がTRCDパラメータ制御で反転ROWおよび反転COL、間に必要とされる、決定されます。コンテンツは行かない、比較的簡単なブロック図である、NorFlashのアナロジーは、明確に理解することができます。

 

レジスタは、次のように設定する必要があります。

bank6 S3C2440 SDRAMメモリコントローラを使用して、回路図から分かるように、二つの平行板のSDRAMに、Bank6関連レジスタを設定することだけが必要である16ビット32ビットのメモリであり、10 DW6はとても。WS6ビットウェイトがイネーブル・ビットが、S3C2440 SDRAMの読み取りがデータに忙しいことはできません応答であるときビット2440は、いくつかの時間を待つように、SDRAMを設定することができ、何の使用は、直接ディスエーブルはありません。ST6が設定SDRAMマルチバイトの読み取りまたは書き込み時に、その種のバイトの変更の操作のみでのみ効果があり、この効果、読み取り専用に設定し、書き込みを書かれて0に設定されている、ここでは、読み取りを持っています従ってヘルプピッキングデータ、及びメモリコントローラをゼロに設定することができます。

 MTは、我々は非SDRAM用のSDRAM、ミドルセクションTACS-PMCを使用して、したがって、それらを無視していることを11の手段に設定されています。TRCDは、上記の間隔、手動検索SDRAMチップ時間行とCOLアドレスである、あなたは20nsのあることなので、00を使用して、18nsの最小値を知ることができます。SCANは、列アドレスビットSDRAMビューSDRAMチップ手動検索カラムアドレスを表すには、A0-A8、すなわち9に使用されるカラムアドレスビットSDRAMを知ることができ、したがって、01に設定されています。

 

 SDRAMは、必要性は、データを保持するためにリフレッシュするために、またはあなたが、ここでリフレッシュし、実際に再充電するコンデンサに蓄積されたデータを失う可能性があり、ダイナミックメモリです。REFENはデフォルトのリフレッシュを有効にしてください。TREFMDは自動的にリフレッシュモードに設定します。TRP行アドレスに送信されたチップセレクト信号がイネーブル、または1つの行プリチャージ時間から別のアクセス回線に転送どのくらい後には、直接手動検索SDRAMチップ、20nsのに設定することができるが00、すなわち、セットを見出すことができます。TSRCは TRC-Trpを、他の行ラインにアクセスするために必要なのTrcトータルジャンプ時間によって得ることができる、Trpでの電荷に加えて、TSRC 00に、のTRC検索、最小値60nsの、TSRCの40nsで、すなわちセットを必要としました。リフレッシュカウンタを表示SDRAMのデータシート機能ページ、あなたはすなわちREFRESH_PERIOD = 64msの/ 8192 = 7.8us、refresh_Couterは1269通りの式に従って計算することができる8192リフレッシュサイクル/ 64msのを、見ることができます。

順次ダウンモード(SCKEを入力して、パワーセーブモード)パワーダウンを可能にする、(一度に複数のメモリセルにアクセスする、即ち開始アドレスが発行され、長さ、連続したメモリ位置の値を返すように)バーストモードのアクセスを可能にします(また、省エネ配慮で)SCLK_ENを有効に、我々は001を選択するために使用することを64メガバイトに応じBK76MAP。

 固定単語がオプションを固定されている、あなたが直接、特別な時間の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