nios中SDRAM,FLASH测试代码
发布时间:2020-12-15 18:46:59 所属栏目:百科 来源:网络整理
导读:/* Author: gbing163@163.com Date: 2012-5-21*/#include "sys/alt_stdio.h"#include "system.h"#define SDRAM_TEST//#define FLASH_TEST#ifdef SDRAM_TEST#define TEST_OFFSET_START0#define SDRAM_TEST_START0#define SDRAM_SIZE0x800000static int test_s
/* Author: gbing163@163.com Date: 2012-5-21 */ #include "sys/alt_stdio.h" #include "system.h" #define SDRAM_TEST //#define FLASH_TEST #ifdef SDRAM_TEST #define TEST_OFFSET_START 0 #define SDRAM_TEST_START 0 #define SDRAM_SIZE 0x800000 static int test_sdram(); #endif #ifdef FLASH_TEST static void test_flash(); #endif int main() { alt_putstr("Hello from Nios II!rn"); #ifdef FLASH_TEST test_flash(); #endif #ifdef SDRAM_TEST test_sdram(); #endif alt_putstr("------------------------------------------rn"); /* Event loop never exits. */ while (1); return 0; } #ifdef SDRAM_TEST static int test_sdram() { unsigned long i; unsigned long test_off = TEST_OFFSET_START; volatile unsigned long * rambase = (unsigned long*)SDRAM_0_BASE; unsigned long u32; #if 0 *rambase = 0xffffffff; if(*rambase != 0xffffffff) { alt_printf("Data lines error.rn"); return(-1); } #endif #if 0 for(i = 0; i < 20; i++) { u32 = *(unsigned long*)0x02013ff8; alt_printf("%x,",u32); } alt_printf("rn"); while(1); #endif while(1) { #if 1 rambase = (unsigned long*)SDRAM_0_BASE; for(i = SDRAM_TEST_START; i < SDRAM_SIZE; i++) { *rambase = i + test_off; u32 = *rambase; if(u32 != i + test_off) { alt_printf("Err:%xrn",i * 4); } rambase++; } #endif rambase = (unsigned long*)SDRAM_0_BASE; for(i = SDRAM_TEST_START; i < SDRAM_SIZE; i++) { u32 = *rambase; if(u32 != i + test_off) { alt_printf("ram is: %x,i = %xrn",u32,i); } rambase++; } alt_printf("Test SDRAM OK,off = 0x%x.rn",test_off); test_off++; }//while(1); return 0; } #endif //----------------------------------------------------------------- #ifdef FLASH_TEST #define FLASH_SIZE 0x80000 //per 4 bytes #define SEC_NUM 39 #define SEC_SIZE (32 * 1024) //64K bytes #define ADDR0 (0x555 * 2) #define ADDR1 (0xaaa * 2) void Data_polling(void) { unsigned short flash_data; do { flash_data = *(unsigned short *)(CFI_FLASH_0_BASE + ADDR0); }while(!(flash_data & 0x80)); } void Delay(long i) { while(i--); } void flash_pid_entry(void) { *(unsigned short *)(CFI_FLASH_0_BASE+ADDR0)=0x00aa; *(unsigned short *)(CFI_FLASH_0_BASE+ADDR1)=0x0055; *(unsigned short *)(CFI_FLASH_0_BASE+ADDR0)=0x0090; Delay(10); } void flash_ready(void) { *(unsigned short *)(CFI_FLASH_0_BASE+ADDR0)=0x00aa; *(unsigned short *)(CFI_FLASH_0_BASE+ADDR1)=0x0055; *(unsigned short *)(CFI_FLASH_0_BASE+ADDR0)=0x00f0; Delay(10); } void Toggle_bit(void) { unsigned short flash_data1,flash_data2; do { flash_data1 = *(unsigned short *)CFI_FLASH_0_BASE; Delay(10); flash_data2 = *(unsigned short *)CFI_FLASH_0_BASE; }while((flash_data1 & 0x40) != (flash_data2 & 0x40)); Delay(10); } static int check_chip_erase() { int i; unsigned long u32; unsigned long *flash_base = (unsigned long*)CFI_FLASH_0_BASE; for(i = 0; i < FLASH_SIZE; i++) { u32 = *(flash_base + i * 4); if(u32 != 0xffffffff) alt_printf("Read: 0x%x,i:%xrn",i); } alt_putstr("Check earse ok.rn"); return 0; } //get sector start addr unsigned int get_sec_base(unsigned int sec_i) { if(sec_i < 8) return(0x2000 * sec_i); else return((sec_i - 7) * 0x10000); } static void test_flash() { int i,j; unsigned short u16; volatile unsigned long flash_base = CFI_FLASH_0_BASE; unsigned short off = 0; unsigned int sec_base; unsigned short manid,devid; flash_pid_entry(); manid = *(unsigned short *)(CFI_FLASH_0_BASE); devid = *(unsigned short *)(CFI_FLASH_0_BASE + 2); alt_printf("ManID(001Fh): 0x%xrn",manid); alt_printf("DevID(00C0h): 0x%xrn",devid); alt_printf("Q(51h): 0x%xrn",*(unsigned short *)(CFI_FLASH_0_BASE + 0x10 * 2)); alt_printf("R(52h): 0x%xrn",*(unsigned short *)(CFI_FLASH_0_BASE + 0x11 * 2)); alt_printf("Y(59h): 0x%xrn",*(unsigned short *)(CFI_FLASH_0_BASE + 0x12 * 2)); flash_ready(); for(i = 0; i < SEC_NUM; i++) { sec_base = get_sec_base(i); //Erase sec alt_printf("Erase Sec 0x%xrn",i); *(unsigned short *)(flash_base + ADDR0)=0x00aa; *(unsigned short *)(flash_base + ADDR1)=0x0055; *(unsigned short *)(flash_base + ADDR0)=0x0080; *(unsigned short *)(flash_base + ADDR0)=0x00aa; *(unsigned short *)(flash_base + ADDR1)=0x0055; *(unsigned short *)(flash_base + sec_base) = 0x30; Data_polling(); //check sector erase for(j = 0; j < SEC_SIZE; j++) { u16 = *(unsigned short *)(flash_base + sec_base + j * 2); if(u16 != 0xffff) { alt_printf("Sec: 0x%x,Read: 0x%x,i,u16,j); } } //program alt_printf("prog...rn"); for(j = 0; j < SEC_SIZE; j++) { *(unsigned short *)(flash_base + ADDR0)=0x00aa; // write a hex data to flash *(unsigned short *)(flash_base + ADDR1)=0x0055; *(unsigned short *)(flash_base + ADDR0)=0x00a0; *(unsigned short *)(flash_base + sec_base + j * 2) = j + off; Toggle_bit(); } //check word for(j = 0; j < SEC_SIZE; j++) { u16 = *(unsigned short *)(flash_base + sec_base + j * 2); if(u16 != j + off) alt_printf("0x%x: Prog 0x%x,Read 0x%xrn",j,j + off,u16); } off++; } //erase chip *(unsigned short *)(flash_base + ADDR0)=0x00aa; *(unsigned short *)(flash_base + ADDR1)=0x0055; *(unsigned short *)(flash_base + ADDR0)=0x0080; *(unsigned short *)(flash_base + ADDR0)=0x00aa; *(unsigned short *)(flash_base + ADDR1)=0x0055; *(unsigned short *)(flash_base + ADDR0)=0x0010; Data_polling(); check_chip_erase(); alt_putstr("Test Flash OK.rn"); } #endif //#ifdef FLASH_TEST (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |