我有一块AT91SAM9260开发板,然后照着开发板一模一样又作了一块自己的开发板,除了将NAND FLASH换
成NOR FLASH之外,其它都一样。我换的NOR FLASH是KH29LV640DT-B (4M x 16bit),16位数据总线。
我使用AT91SAM9260的NCS6做NOR FLASH的片选,NCS6的BANK地址为0X7000 0000,NCS6是A13(即P13)的
外围B功能(peripheral B function). 我使用A13(PC13)做NOR FLASH的CE#。 我可以在我做的板子上下载和正确地运行U-BOOT,但它总是取得错误的NOR FLASH厂商ID号和设备ID号。
这就是我的问题。我问过我公司的一位资深硬件人员,他说我做的开发板的电路是没有问题的。 正确的厂商ID号和设备ID号都应该为0XC2,但是我获得的总是0XC。
下面是我写的关于NOR FLASH(在U-BOOT里面)的主要代码:
#define AT91C_SM_NWE_SETUP (0 << 0) #define AT91C_SM_NCS_WR_SETUP (0 << 8) #define AT91C_SM_NRD_SETUP (0 << 16) #define AT91C_SM_NCS_RD_SETUP (0 << 24) #define AT91C_SM_NWE_PULSE (5 << 0) //lingyb Write #define AT91C_SM_NCS_WR_PULSE (7 << 8) //lingyb cs Write #define AT91C_SM_NRD_PULSE (5 << 16) //lingyb Read #define AT91C_SM_NCS_RD_PULSE (7 << 24) //lingyb cs Read #define AT91C_SM_NWE_CYCLE (12 << 0) //lingyb Write #define AT91C_SM_NRD_CYCLE (12 << 16) //lingyb Read #define AT91C_SM_TDF (1 << 16) #define FLASH_BASE 0x70000000 typedef volatile unsigned char vu_char; unsigned long nor_init (void) { vu_char* addr; /* Configure SMC CS6 */ AT91C_BASE_SMC->SMC_SETUP6 = (AT91C_SM_NWE_SETUP | AT91C_SM_NCS_WR_SETUP | AT91C_SM_NRD_SETUP | AT91C_SM_NCS_RD_SETUP); AT91C_BASE_SMC->SMC_PULSE6 = (AT91C_SM_NWE_PULSE | AT91C_SM_NCS_WR_PULSE | AT91C_SM_NRD_PULSE | AT91C_SM_NCS_RD_PULSE); AT91C_BASE_SMC->SMC_CYCLE6 = (AT91C_SM_NWE_CYCLE | AT91C_SM_NRD_CYCLE); AT91C_BASE_SMC->SMC_CTRL6 = (AT91C_SMC_READMODE | AT91C_SMC_WRITEMODE | AT91C_SMC_NWAITM_NWAIT_DISABLE | AT91C_SMC_DBW_WIDTH_SIXTEEN_BITS | AT91C_SM_TDF); /* enable the nor flash chip select */ AT91C_BASE_PIOC->PIO_PDR = AT91C_PIO_PC13; AT91C_BASE_PIOC->PIO_BSR = AT91C_PIO_PC13; printf("AT91C_BASE_PIOC->PIO_ABSR & AT91C_PIO_PC13=0x%x
",AT91C_BASE_PIOC->PIO_ABSR &
AT91C_PIO_PC13);//lingyb printf("AT91C_BASE_PIOC->PIO_PSR & AT91C_PIO_PC13=0x%x
",AT91C_BASE_PIOC->PIO_PSR &
AT91C_PIO_PC13 );//lingyb /* get manufacturer ID and device ID */ addr = (vu_char*)FLASH_BASE; addr[0x555] = 0xAA; addr[0x2aa] = 0x55; addr[0x555] = 0x90; ID_manuf = (ulong)addr[0]; ID_device = (ulong)addr[1]; /* restore read mode */ addr[0x0000] = 0xF0; printf("Manuf. ID @ 0x%08lx: 0x%08lx
", (ulong)addr, ID_manuf); printf("Device ID @ 0x%08lx: 0x%08lx
", (ulong)(&addr[1]), ID_device); }
我实在是找不到是哪里出错了?难道是还有什么寄存器我没有设置?或者是SMC_PULSE6 和 SMC_CYCLE6的 时序我没有设对?我已经试过了SMC_PULSE6 和 SMC_CYCLE6时序的很多种组合,但获得的厂商ID总是0XC
。 有哪位大侠能帮到我吗,真的是非常感激!!!
|