下面这段代码是读NANDFlash的ID,用AT91SAM7S64模块8位并行总线接口,三块板子都不成功,估计是软件问题.<br /><br />/*<br />void KEY_ISR (void) __irq<br />{<br /> INT8U i;<br /> <br /> *AT91C_AIC_IDCR = (1 << AT91C_ID_PIOA); //禁止PIOA外围中断功能<br /> <br /> i = *AT91C_PIOA_ISR;<br /> *AT91C_AIC_ICCR = (1<<AT91C_ID_PIOA);<br /> DBGU_Print("Interrupt
");<br /> <br /> *AT91C_AIC_IECR = (1<<AT91C_ID_PIOA); //使能PIOA外围中断<br /> <br /> *AT91C_AIC_EOICR = 0; // End of Interrupt <br />}<br />*/<br /><br />//----------------------------------------------------------------------<br />void port_Delay(INT16U time)<br />{<br /> INT16U i;<br /> {<br /> for(i=0; i<time; i++);<br /> }<br />}<br /><br /><br />//----------------------------------------------------------------------<br />void port_ClkOpen(void)<br />{<br /> *AT91C_PMC_SCER = AT91C_CKGR_MOSCEN; //使能系统时钟寄存器的处理器时钟 <br /> *AT91C_PMC_PCER = 1 << AT91C_ID_PIOA; <br />}<br /><br />////////////////////////////////////////////////////////////////<br />void port_8BitInit(void)<br />{ <br /> *AT91C_PIOA_PER |= PORT_CTRL_MASK;<br /> *AT91C_PIOA_OER |= (PORT_CTRL_MASK | PORT_8BIT);<br /> //*AT91C_PIOA_ODR |= (NUSB_INT | HDD_INTRQ);<br /> <br /> *AT91C_PIOA_PPUER |= (PORT_CTRL_MASK | PORT_8BIT );<br /> <br /> *AT91C_PIOA_OWER = PORT_8BIT;<br /> *AT91C_PIOA_OWDR = ~PORT_8BIT; <br /><br /> NWRITE_HIGH(); //拉高写信号线<br /> NREAD_HIGH(); //拉高读信号线<br /><br /> NLEBA_HIGH(); //总线器件片选切换到非选中状态<br /> // NLEAB_HIGH();<br /> // NOEBA_HIGH();<br /> // NOEAB_HIGH();<br />}<br /><br /><br />//------------------------------------------------------------------------<br />void port_IntInit(void)<br />{<br /> <br /> /*<br /> *AT91C_AIC_IDCR = (1 << AT91C_ID_PIOA); //禁止PIOA外围中断功能<br /> <br /> AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = (AT91C_AIC_PRIOR_HIGHEST | AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED);<br /> //中断模式(中断级别和触发模式)<br /> *AT91C_AIC_ICCR = (1<<AT91C_ID_PIOA); //中断清除 <br /> *AT91C_PIOA_IDR = 0xffffffff; //禁止所有PIOA中断<br /> <br />// AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (unsigned long)KEY_ISR;<br /> <br />// *AT91C_PIOA_IER = (SW3_MASK | SW4_MASK); //允许SW3,4中断<br /> *AT91C_AIC_IECR = (1<<AT91C_ID_PIOA); //使能PIOA外围中断<br /> *AT91C_AIC_FFDR = 0xffffffff; //禁止FIQ <br /> */<br />}<br /><br /><br />//----------------------------------------------------------------------<br />/*<br />INT8U port_GetINT(INT8U u8Device)<br />{<br /> if(CH375_INTRQ == u8Device)<br /> {<br /> if(*AT91C_PIOA_PDSR & NUSB_INT)<br /> {<br /> return 1;<br /> }<br /> else<br /> {<br /> return 0;<br /> }<br /> }<br /> else if(IDE_INTRQ == u8Device)<br /> {<br /> if(*AT91C_PIOA_PDSR & HDD_INTRQ)<br /> {<br /> return 1;<br /> }<br /> else<br /> {<br /> return 0;<br /> } <br /> }<br /> return 0;<br />} <br />*/<br /><br />//----------------------------------------------------------------------<br />void port_SetAddress(INT8U u8Add)<br />{<br /> *AT91C_PIOA_ODSR = ((INT32U)u8Add)<<ADPort_Offset;<br /> <br /> ADD_LATCH_HIGH();<br /> // port_Delay(1);<br /> ADD_LATCH_LOW();<br />}<br /><br /><br />//----------------------------------------------------------------------<br />void port_WriteData(INT8U add, INT8U data)<br />{<br /> port_SetAddress(add); //0111 1110b<br /> <br /> *AT91C_PIOA_ODSR = ((INT32U)data)<<ADPort_Offset;<br /><br /> NWRITE_LOW();<br /> // port_Delay(1);<br /> NWRITE_HIGH(); <br />}<br /><br />void port_WriteDataNoAdd(INT8U data)<br />{<br /> *AT91C_PIOA_ODSR = ((INT32U)data)<<ADPort_Offset;<br /><br /> NWRITE_LOW();<br /> // port_Delay(1);<br /> NWRITE_HIGH(); <br />}<br /><br /><br />//----------------------------------------------------------------------<br />INT8U port_ReadData(INT8U add)<br />{<br /> INT32U temp32;<br /> INT8U temp8;<br /> <br /> port_SetAddress(add); //0111 1110b<br /> <br /> *AT91C_PIOA_ODR |= (PORT_8BIT);<br /> NREAD_LOW();<br /> // port_Delay(1);<br /> temp32 = *AT91C_PIOA_PDSR;<br /> <br /> NREAD_HIGH();<br /> <br /> *AT91C_PIOA_OER |= (PORT_8BIT);<br /> <br /> temp8 = (INT8U)(temp32>>ADPort_Offset);<br /> return temp8;<br />}<br /><br /><br />//----------------------------------------------------------------------<br />INT8U port_ReadDataNoAdd(void)<br />{<br /> INT32U temp32;<br /> INT8U temp8;<br /> <br /> *AT91C_PIOA_ODR |= (PORT_8BIT);<br /> NREAD_LOW();<br /> // port_Delay(1);<br /> temp32 = *AT91C_PIOA_PDSR;<br /> <br /> NREAD_HIGH();<br /> <br /> *AT91C_PIOA_OER |= (PORT_8BIT);<br /> <br /> temp8 = (INT8U)(temp32>>ADPort_Offset);<br /> return temp8; <br />}<br /><br /><br /><br />void TestADPort(void)<br />{<br /> port_8BitInit();<br /> while(1)<br /> {<br /> Nandflash_CMD_LATCH_HIGH();<br /> Nandflash_CMD_LATCH_LOW();<br /> Nandflash_ADDR_LATCH_HIGH();<br /> Nandflash_ADDR_LATCH_LOW();<br /> NLEBA_HIGH();<br /> NLEBA_LOW();<br /> port_WriteDataNoAdd(0x00);<br /> port_WriteDataNoAdd(0xff);<br /> port_WriteDataNoAdd(0x55);<br /> port_WriteDataNoAdd(0xaa);<br /> }<br /><br />}<br /><br /><br />#define COMMAND 0x03 <br />#define ADDRESS 0x05 <br />#define D_DATA 0x01<br />#define INACTIVE 0x09 <br /><br /><br /><br />void NandFlash_Reset(void) //flash reset<br />{ <br /> unsigned int i;<br /><br /> NLEBA_LOW();<br /> Nandflash_CMD_LATCH_HIGH();<br /> Nandflash_ADDR_LATCH_LOW();<br /> <br /> port_WriteDataNoAdd(0xff);<br /> NLEBA_HIGH();<br /><br /> for (i=0; i<3000; i++) ; //delay <br />}<br /><br />void NandFlash_ReadID(uchar *IDBuff)<br />{<br /> uchar ucIDBuff[4];<br /><br /> NLEBA_LOW();<br /><br /> Nandflash_CMD_LATCH_HIGH();<br /> Nandflash_ADDR_LATCH_LOW();<br /> port_WriteDataNoAdd(0x90);<br /><br /> Nandflash_CMD_LATCH_LOW();<br /> Nandflash_ADDR_LATCH_HIGH();<br /> port_WriteDataNoAdd(0x00);<br /><br /> Nandflash_CMD_LATCH_LOW();<br /> Nandflash_ADDR_LATCH_LOW();<br /><br /> ucIDBuff[0] = port_ReadDataNoAdd();<br /> ucIDBuff[1] = port_ReadDataNoAdd();<br /> ucIDBuff[2] = port_ReadDataNoAdd();<br /> ucIDBuff[3] = port_ReadDataNoAdd();<br /> memcpy(IDBuff,ucIDBuff,4);<br /><br /> NLEBA_HIGH();<br />}<br /><br /><br />void TestNandFlash(void)<br />{<br /> uchar ucDataBuff[4];<br /><br /> NandFlash_Reset();<br /> NandFlash_ReadID(ucDataBuff);<br /> <br />}<br /><br /><br /><br /><br /><br /><br /><br /><br /> |
|