/*********************************** 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保护 }
void SSTCmd2(u8 cmd,u8 data) { SST_SELECT(); SPIByte(cmd); SPIByte(data); SST_DESELECT(); }
/**************************************** **函数名:SSTCmdb1b/SSTCmd4bs **功能:写一个SST命令,返回1字节数据/写1个命令字,3个地址字,返回多个字节 **注意事项: ****************************************/ u8 SSTCmdb1b(u8 cmd) { u8 tmp; SST_SELECT(); SPIByte(cmd); tmp=SPIByte(0xff); SST_DESELECT(); return(tmp); }
void SSTCmd4(u8 cmd,u8 *addr) { SST_SELECT(); SPIByte(cmd); //首命令 SPIByte(*addr++); SPIByte(*addr++); SPIByte(*addr); SST_DESELECT(); }
void SSTCmd4bs(u8 cmd,u8* addr,u8* data,u32 no) { SST_SELECT(); SPIByte(cmd); //首命令 SPIByte(*addr++); SPIByte(*addr++); SPIByte(*addr); for(;no>0;no--) { *data++=SPIByte(0xff); } SST_DESELECT(); }
/************************************* SST25Read 高速读 对于后续带5的芯片,可调用此函数读 *************************************/ void SST25Read(u32 addr,u8* p_data,u32 no) { SST_SELECT(); SPIByte(0x0b); SPIByte(addr>>16); SPIByte(addr>>8); SPIByte(addr); SPIByte(0xff); for(;no>0;no--) *p_data++=SPIByte(0xff); SST_DESELECT(); }
/********************************** SST25ByteProgram 写一个字节*注意在此前要调用取消写保护,实际写应使用AAI,此函数在AAI中调用,用于写奇数个字节 **********************************/ void SST25ByteProgram(u32 addr,u8 byte) { u8 ad[3]; ad[0]=(addr>>16)&0xff; ad[1]=(addr>>8)&0xff; ad[2]=addr&0xff; SST_SELECT(); SPIByte(0x02); SPIByte(ad[0]); SPIByte(ad[1]); SPIByte(ad[2]); SPIByte(byte); SST_DESELECT(); while(SST25BY()); }
/*********************************** 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(); }
/***************************************** **函数名:SSTCmd1/2/4 **功能:写一个SST命令/写一个命令后接一个数据/写一个命令后再写3个数据 **注意事项:这是一个完整的单命令操作,不返回 *****************************************/ void SSTCmd1(u8 cmd) { SST_SELECT(); SPIByte(cmd); SST_DESELECT(); }