/*********************************** SST25Write 写多个字节 ***********************************/ void SST25Write(u32 addr,u8* p_data,u32 no) { u8 ad[3]; u32 cnt; if(no==0) return; SST25WriteEn(); if(no==1) //no<2则应使用普通单字节方式 { SST25ByteProgram(addr,*p_data); // SST25WPEN(); } else { cnt=no; ad[2]=(addr>>16)&0xff; ad[1]=(addr>>8)&0xff; ad[0]=addr&0xff; SST_SELECT(); SPIByte(0xad); SPIByte(ad[2]); SPIByte(ad[1]); SPIByte(ad[0]); SPIByte(*p_data++); SPIByte(*p_data++); SST_DESELECT(); cnt-=2; while(SST25BY());//判忙 //中间的双字节写 for(;cnt>1;cnt-=2) { SST_SELECT(); SPIByte(0xad); SPIByte(*p_data++); SPIByte(*p_data++); SST_DESELECT(); while(SST25BY());//判忙 } SST25WRDI();//WRDI用于退出AAI写模式 //如果有最后一个字节(no为奇数) if(cnt==1) { SST25WriteEn(); SST25ByteProgram(addr+no-1,*p_data); } } SST25WPEN();//WP保护 }
/********************************** SST25ChipErase 刷除CHIP **********************************/ void SST25ChipErase(void) { SST25WriteEn(); SSTCmd1(0x60); while(SST25BY()); SST25WPEN(); }
/*********************************** SST25SectorErase 刷扇区 用的是4kb大小 假如地址在0~4095 之间那么这之间的地址都会刷除 当然我给 4096 的话4096到4096+4095 之间都会刷掉 ***********************************/ void SST25SectorErase(u32 addr) { u8 ad[3]; ad[0]=(addr>>16)&0xff; ad[1]=(addr>>8)&0xff; ad[2]=addr&0xff; SST25WriteEn(); SST_SELECT(); SPI2Byte(0x20); SPI2Byte(ad[0]); SPI2Byte(ad[1]); SPI2Byte(ad[2]); SST_DESELECT(); while(SST25BY()); // SST25WPEN(); }