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