SST25VF080B SPI接口FLASH STM32驱动
//命令时序复杂啊~~当然了我这为了求全都写出来了
常用的芯片功能
/***************************************
SST25WREN 允许写功能
***************************************/
void SST25WREN(void)
{
SSTCmd1(0x06);
}
/***********************************
SST25WRDI 屏蔽写功能
***********************************/
void SST25WRDI(void)
{
SSTCmd1(0x04);
}
/**********************************
SST25BY 检测忙
**********************************/
u8 SST25BY(void)
{
u8 sta;
sta=SSTCmdb1b(0x05);
return(sta&0x01);
}
/***********************************
SST25WPEN 允许软件写保护
注意事项:25的写入比较繁琐,建议在每次操作前都取消掉写保护,操作完成后则重新允许写保护
***********************************/
void SST25WPEN(void)
{
u8 sta;
sta=SSTCmdb1b(0x05)|0x1c;//读出寄存器并加入保护位
SSTCmd1(0x50);//允许写Status Register
SSTCmd2(0x01,sta);
}
//先消除保护位,再允许写位
void SST25WriteEn(void)
{
u8 sta;
sta=SSTCmdb1b(0x05)&(~0x1c);//读出寄存器并消除保护位
SSTCmd1(0x50);//允许写寄存器Status Register
SSTCmd2(0x01,sta);//写寄存器
SSTCmd1(0x06);//允许写
}
/********************************寄存器Status Register**********************************/
就是这样实现写保护。
/**********************************
SST25ReadID 读取SST的ID 这个功能 呵呵不用多说~当然单纯的读写操作肯定用不上
**********************************/
u16 SST25ReadID(void)
{
u8 id[3];
u8 addr[3]={0,0,0};
SSTCmd4bs(0x90,addr,id,3);
return((id[0]<8)+id[1]);
}
/**********************************
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();
SPIByte(0x20);
SPIByte(ad[0]);
SPIByte(ad[1]);
SPIByte(ad[2]);
SST_DESELECT();
while(SST25BY());
//SST25WPEN();
}
/**********************************
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());
}
/***********************************
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写模式 所谓AAI 就是地址自动加
//如果有最后一个字节(no为奇数)
if(cnt==1)
{
SST25WriteEn();
SST25ByteProgram(addr+no-1,*p_data);
}
}
SST25WPEN();//WP保护
}
//我们用的是下边这种
/*************************************
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();
}
/****************************************
SST25ReadL 低速读
****************************************/
void SST25ReadL(u32 addr,u8* p_data,u32 no)
{
u8 ad[3];
ad[2]=(addr>>16)&0xff;
ad[1]=(addr>>8)&0xff;
ad[0]=addr&0xff;
SSTCmd4bs(0x03,ad,p_data,no);
}
SST25VF080BSPI接口FLASHSTM32驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)