📄 main.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include "../inc/tc.h"
#include "../inc/sdram.h"
void main()
{
unsigned int Recieve[100]={0};
unsigned int* buffer = (unsigned int*)malloc(10);
//unsigned char Recieve[20]={0};
unsigned int i = 0;
// AT91F_InitSdram ();
while(1)
{
//for(i=0;i<SDRAM_MAXSIZE;i++)
for(i=0;i<100;i++)
{
AT91F_SDRAM_Write(i , i%9);
}
for(i=0;i<100;i++)
{
Recieve[i] = AT91F_SDRAM_Read(i);
}
}
}
//*----------------------------------------------------------------------------
//* \fn AT91F_InitSdram
//* \brief Init EBI and SDRAM controller for MT48LC16M16A2
//*----------------------------------------------------------------------------
void AT91F_InitSdram (void)
{
volatile unsigned int i;
AT91PS_SDRC psdrc = AT91C_BASE_SDRC;
// Init the EBI for SDRAM
AT91C_BASE_EBI -> EBI_CSA = AT91C_EBI_CS1A_SDRAMC; // Chip Select is assigned to SDRAM
// controller
//Configure PIO for EBI CS1
AT91F_EBI_SDRAM_CfgPIO();
//*** Step 1 ***
// Set Configuration Register
psdrc->SDRC_CR = AT91C_SDRC_NC_9| // 9 bits Column Addressing: 512 (A0-A8)
// AT91C_SDRC_NC_9
AT91C_SDRC_NR_13| // 13 bits Row Addressing 8K (A0-12)
// AT91C_SDRC_NR_13
AT91C_SDRC_CAS_2| // Micron MT48LC16M16A2-75(100MHz) needs CAS 2
AT91C_SDRC_NB_4_BANKS| // 4 banks
AT91C_SDRC_TWR_2|
AT91C_SDRC_TRC_4|
AT91C_SDRC_TRP_2|
AT91C_SDRC_TRCD_2|
AT91C_SDRC_TRAS_3|
AT91C_SDRC_TXSR_4 ;
//*** Step 2 ***
// Wait 200us (not needed since the system starts on slow clock)
delay(400);
//*** Step 3 ***
// NOP Command
AT91C_BASE_SDRC->SDRC_MR = AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_NOP_CMD;// Set NOP
*AT91C_SDRAM_BASE = 0x00000000; // Perform NOP
//*** Step 4 ***
//All Banks Precharge Command
AT91C_BASE_SDRC->SDRC_MR = AT91C_SDRC_DBW_16_BITS | 0x00000002; // Set PRCHG AL
*AT91C_SDRAM_BASE= 0x00000000; // Perform PRCHG
//*** Step 5 ***
//8 Refresh Command
psdrc->SDRC_MR = AT91C_SDRC_DBW_16_BITS |AT91C_SDRC_MODE_RFSH_CMD;// Set 1st CBR
*AT91C_SDRAM_BASE = 0x00000000; // Perform CBR
psdrc->SDRC_MR = AT91C_SDRC_DBW_16_BITS |AT91C_SDRC_MODE_RFSH_CMD;// Set 2nd CBR
*AT91C_SDRAM_BASE = 0x00000000; // Perform CBR
psdrc->SDRC_MR= AT91C_SDRC_DBW_16_BITS |AT91C_SDRC_MODE_RFSH_CMD;// Set 3rd CBR
*AT91C_SDRAM_BASE = 0x00000000; // Perform CBR
psdrc->SDRC_MR= AT91C_SDRC_DBW_16_BITS |AT91C_SDRC_MODE_RFSH_CMD;// Set 4th CBR
*AT91C_SDRAM_BASE = 0x00000000; // Perform CBR
psdrc->SDRC_MR= AT91C_SDRC_DBW_16_BITS |AT91C_SDRC_MODE_RFSH_CMD;// Set 5th CBR
*AT91C_SDRAM_BASE = 0x00000000; // Perform CBR
psdrc->SDRC_MR= AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD; // Set 6th CBR
*AT91C_SDRAM_BASE = 0x00000000; // Perform CBR
psdrc->SDRC_MR= AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD; // Set 7th CBR
*AT91C_SDRAM_BASE = 0x00000000; // Perform CBR
psdrc->SDRC_MR= AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_RFSH_CMD; // Set 8th CBR
*AT91C_SDRAM_BASE = 0x00000000; // Perform CBR
//*** Step 6 ***
//Mode Register Command
psdrc->SDRC_MR= AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_LMR_CMD; // Set LMR operation
*AT91C_SDRAM_BASE = 0x00000000; // Perform LMR burst=1,
// lat=2
//*** Step 7 ***
//Normal Mode Command
psdrc->SDRC_MR= AT91C_SDRC_DBW_16_BITS | AT91C_SDRC_MODE_NORMAL_CMD; // Set Normal mode
// 16 bits
*AT91C_SDRAM_BASE= 0x00000000; // Perform Normal mode
//*** Step 8 ***
// Set Refresh Timer
psdrc->SDRC_TR =AT91C_SDRC_TR_TIME;
}
void delay(unsigned int dly )
{
while(dly--);
}
void AT91F_EBI_SDRAM_CfgPIO(void)
{
//PIOB->PIO_ASR = ~0 ;
AT91C_BASE_PIOA->PIO_PDR = PA23_B_NWR1| //out of PIO control
PA24_B_SDA10|
PA25_B_SDCKE|
PA26_B_SDCS|
PA27_B_SDWE|
PA28_B_CAS|
PA29_B_RAS|
PA16_B_BA0|
PA17_B_BA1;
AT91C_BASE_PIOA->PIO_BSR = PA23_B_NWR1| //set the control command
PA24_B_SDA10|
PA25_B_SDCKE|
PA26_B_SDCS|
PA27_B_SDWE|
PA28_B_CAS|
PA29_B_RAS|
PA16_B_BA0|
PA17_B_BA1;
AT91C_BASE_PIOB->PIO_PDR = PIOB_B_ADDRESS; //out of PIO control
AT91C_BASE_PIOB->PIO_BSR = PIOB_B_ADDRESS; //set the address line
AT91C_BASE_PIOC->PIO_PDR = PIOC_A_DATA ; //out of PIO control
AT91C_BASE_PIOB->PIO_ASR = PIOC_A_DATA ; //set the address line
}
void AT91F_SDRAM_Write(unsigned int Addr ,short int Data)
{
*(AT91C_SDRAM_BASE + Addr)= Data;
}
short int AT91F_SDRAM_Read(unsigned int Addr)
{
return( *(AT91C_SDRAM_BASE + Addr));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -