自己写的程序,希望对大家有帮助,其实这片flash十分的悲剧,只有4个block,1MB的空间,长期放可执行代码用的,短期放数据,十分的不合适... void DelayTime( void ) { u8 i ; for( i = 0 ; i < 10 ; i++ ) ; } void atWriteCmd( u8 cmd ) { SSPSend( &cmd , 1) ; } void atWriteData(u8 * buf , u32 nBytes ) { if( nBytes == 0 ) return ; SSPSend( buf , nBytes ); } void atReadData( u8 *buf , u32 nBytes ) { if( nBytes == 0 ) return ; SSPReceive( buf , nBytes ) ; } void atSendWREN() { atEnable(); atWriteCmd( CMDWREN ) ; atDisable(); DelayTime(); } u8 atReadRDSR( ) { u8 stu ; atEnable(); atWriteCmd(CMDRDSR); atReadData( &stu , 1); atDisable(); return stu ; } void atFlashInit( void ) { LPC_IOCON->PIO1_10 &= ~0x07; /* SSP SSEL is a GPIO pin */ GPIOSetDir( PORT1, 10, 1 ); GPIOSetValue( PORT1, 10, 1 ); LPC_IOCON->PIO1_11 &= ~0x07; /* SSP SSEL is a GPIO pin */ GPIOSetDir( PORT1, 11, 1 ); GPIOSetValue( PORT1, 11, 1 ); SSPInit(); } void atReadID( u8 * buf) { atEnable(); atWriteCmd(CMDRDID); atReadData( buf , 2 ) ; // 0x1f atDisable(); } void atReadFlash(u32 addr , u8 * buf , u32 nBytes ) { u8 cmd[4] ; if( nBytes == 0 ) return ; cmd[0] = CMDREAD ; cmd[1] = addr>>16 ; cmd[2] = addr>>8 ; cmd[3] = addr ; while( (atReadRDSR()&0x01 ) != 0x00 ); atEnable(); atWriteCmd( cmd[0] ); atWriteCmd( cmd[1] ); atWriteCmd( cmd[2] ); atWriteCmd( cmd[3] ); atReadData( buf , nBytes ); atDisable(); } void atWriteFlash( u32 addr, u8 * buf , u32 nBytes ) { u8 cmd[4]; if( nBytes == 0 ) return ; if( nBytes < 256 ) {// if big than 256 , error Occur atSendWREN(); while( (atReadRDSR()&0x02 ) != 0x02 ); // write enable cmd[0] = CMDPROGRAM ; cmd[1] = addr>>16 ; cmd[2] = addr>>8 ; cmd[3] = addr ; atEnable(); atWriteCmd( cmd[0] ); atWriteCmd( cmd[1] ); atWriteCmd( cmd[2] ); atWriteCmd( cmd[3] ); atWriteData( buf , nBytes ); atDisable(); while( (atReadRDSR()&0x01 ) != 0x00 ); } } void atEraseSector( u32 addr ) { u8 cmd[4] ; atSendWREN(); while( (atReadRDSR()&0x02 ) != 0x02 ); // write enable cmd[0] = CMDSECTOR_ERASE ; cmd[1] = addr>>16 ; cmd[2] = addr>>8 ; cmd[3] = addr ; atEnable(); atWriteCmd( cmd[0] ); atWriteCmd( cmd[1] ); atWriteCmd( cmd[2] ); atWriteCmd( cmd[3] ); atDisable(); while( (atReadRDSR()&0x01 ) != 0x00 ); }