Esempio n. 1
0
/***********************************
  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保护
}
Esempio n. 2
0
/**********************************
  SST25ChipErase 刷除CHIP
**********************************/
void SST25ChipErase(void)
{
	SST25WriteEn();
	SSTCmd1(0x60);
	while(SST25BY());
	SST25WPEN();
}
Esempio n. 3
0
/**********************************
  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());
}
Esempio n. 4
0
/***********************************
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();
}