SPI FLASH存储器W25Q80读写操作的一点经验,希望大家注意这个问题: SPI 写入速度或者说时钟不能太快!
另外贡献一个驱动该FLASH的主要源码片段:
//SPI数据读写函数
uchar SPISwap(BYTE dat) //SPI数据读写函数
{
SPDAT = dat; //trigger SPI send
while (!(SPSTAT & SPIF)); //wait send complete
SPSTAT = SPIF | WCOL; //clear SPI status
return SPDAT; //return received SPI data
}
////SPI页编程,LEN不能超过255
void WriteW25Q80(long addre,uchar *databuf,uchar LEN)
{
uchar i=0;
SPISS = 0; //W25q80芯片使能
SPISwap(WRITE_ENABLE); //W25Q80芯片写使能
SPISwap( BYTE_PAGE_PROGRAM); //页编程命令
SPISwap((BYTE)( addre>>16)); //写地址高8位 ,共24位
SPISwap((BYTE)( addre>>8)); //写地址中间8位
SPISwap((BYTE)( addre)); //写地址低8 位
for(i=0; i<LEN;i++)
{
SPISwap(databuf[i]);
}
SPISwap(WRITE_DISABLE); //W25Q80芯片写失能
SPISS = 1; //W25q80芯片失能
}
/////////读取LEN个字节
void ReadW25Q80(long addre,uchar *databuf,uchar LEN)
{
uchar i=0;
SPISS = 0; //W25q80芯片使能
SPISwap(READ_ARREY);//读取命令
SPISwap((BYTE)( addre>>16)); //写地址高8位 ,共24位
SPISwap((BYTE)( addre>>8)); //写地址中间8位
SPISwap((BYTE)( addre)); //写地址低8 位
for(i=0; i<LEN;i++)
{
databuf[i]=SPISwap(0xff);
}
SPISS = 1; //W25q80芯片使能
}