{ break; } } F_CSL; Spi_Wirte(0xe8); Spi_Wirte((unsigned char)(PA>>7)); Spi_Wirte((unsigned char)((PA<<1)|(BFA>>8))); Spi_Wirte((unsigned char)BFA); for(i=0;i<4;i++) { Spi_Wirte(0x00); } for(j=0;j { pHeader[j]=Spi_Read(); } F_CSH; } 完成数据flash的buffer的写操作: [cpp] /********************************************************************************* * 函数原型:void DFlash_BufferWrite(uchar buffer,uint BFA,uchar *pHeader,uint len); * 名 称:DFlash_BufferWrite * 功 能:将指定数据写入从某个地址(0~263)开始的BUFFER中 * 入口参数: * buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 * 在该指令序列中,操作码84H选择BUFFER 1,87H选择BUFFER 2 * BFA - BUFFER中的起始地址,0~263 * pHeader - 待写入数据的首地址(指针) * len - 待存数据的长度1~264 * 出口参数:无 www.2cto.com **********************************************************************************/ void DFlash_BufferWrite(uint8_t buffer,uint32_t BFA,uint8_t *pHeader,uint32_t len) { uint8_t i=0,j=0; while(i++<255) { if(DFlash_RegisterStatusRead()&0x80) { break; } } F_CSL; switch(buffer) { case 1:Spi_Wirte(WRITE_BUFFER1);break; case 2:Spi_Wirte(WRITE_BUFFER2);break; } Spi_Wirte(0x00); Spi_Wirte((unsigned char)(BFA>>8)); Spi_Wirte((unsigned char)BFA); for(j=0;j { Spi_Wirte(pHeader[j]); } F_CSH; delay_ms(40); //延时20MS } 第四步玩成对flash存储单元的写操作: [cpp] /********************************************************************************* * 函数原型:void DFlash_BufferToMainMemoryPageProgramWithBuilt_inErase; * 名 称:DFlash_BufferToMainMemoryPageProgramWithBuilt_inErase * 功 能:将指定数据写入从某个地址(0~263)开始的页中:包含2个动作,首先将指定数据 * 写入到BUFFER 1或者BUFFER 2中,其中可以指定BUFFER中的起始写入地址,此写入 * 动作不影响BUFFER中其它地址中的数据,然后再将BUFFER中的整个数据写入到某指 * 定页中(带预擦除)。 * 入口参数: buffer - 选择BUFFER,01H选择BUFFER 1,02H选择BUFFER 2 * PA - 页地址,0~2047 * BFA - 指定BUFFER中的起始写入地址 * pHeader - 指定数据的首地址 * len - 指定数据的长度 * 出口参数:无 **********************************************************************************/ void DFlash_BufferToMainMemoryPageProgramWithBuilt_inErase (uint8_t buffer,uint32_t PA,uint32_t BFA,uint8_t *pHeader,uint32_t len) { uint32_t i=0; //将长度为len,首地址为pHeader的数写入以 BFA为首地址的buffer中 DFlash_BufferWrite(buffer,BFA,pHeader,len); //等待 AT45DB041B 的ready while(i++<1000) { if(DFlash_RegisterStatusRead()&0x80) { break; } } F_CSL; switch(buffer) { case 1:Spi_Wirte(0x83);break; case 2:Spi_Wirte(0x86);break; } Spi_Wirte((unsigned char)(PA>>7)); Spi_Wirte((unsigned char)(PA<<1)); Spi_Wirte(0x00); F_CSH; delay_ms(40); //延时20MS } 到此驱动程序设计完成。这个驱动是可以直接拿 |