OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6019|回复: 2

w25x16 FLASH SPI能读到数据,不能写入。

[复制链接]

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-8-5
在线时间
0 小时
发表于 2015-8-6 14:20:15 | 显示全部楼层 |阅读模式
5金钱
w25x16 FLASH SPI能读到数据,不能写入。  跟网上的例程一样的。为什么不能写入。  求大家帮忙分析下!
写函数如下:
写SPI FLASH  
//在指定的地址开始写入指定长度的数据
//该函数带擦除操作
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大65535)     
u8 SPI_FLASH_BUF[4096];
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   

u32 secpos;
u16 secoff;
u16 secremain;   
  u16 i,temp;    
secpos=WriteAddr/4096;//扇区地址 0~511 for w25x16
secoff=WriteAddr%4096;//在扇区内的偏移
secremain=4096-secoff;//扇区剩余空间大小 
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096字节
while(1) 
{
SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区内容

SPI_Flash_Erase_Chip();

for(i=0;i<secremain;i++)//校验数据
{
if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦书  
}
if(i<secremain)//需要擦除
{
SPI_Flash_Erase_Sector(secpos);//擦处这个扇区
for(i=0;i<secremain;i++)   //复制
{
SPI_FLASH_BUF[i+secoff]=pBuffer;  
}

SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区

}else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间 
if(NumByteToWrite==secremain)break;//写入结束
else//写入未结束
{
secpos++;//扇区地址增1
secoff=0;//偏移位置为0  

  pBuffer+=secremain;  //指针偏移
WriteAddr+=secremain;//写地址偏移   
  NumByteToWrite-=secremain; //字节数递减
if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完
else secremain=NumByteToWrite; //下一个扇区可以写完了
}  
};  
}
//


void SPI_Flash_Write_NoCheck(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{  
u16 pageremain;   
pageremain=256-WriteAddr%256; //单页剩余的字节数    
if(NumByteToWrite<=pageremain)pageremain=NumByteToWrite;//不大于256个字节
while(1)
{   
SPI_Flash_Write_Page(pBuffer,WriteAddr,pageremain);
if(NumByteToWrite==pageremain)
break;//写入结束了
else //NumByteToWrite>pageremain
{
pBuffer+=pageremain;
WriteAddr+=pageremain;

NumByteToWrite-=pageremain;  //减去已经写入的字节数
if(NumByteToWrite>256)pageremain=256; //一次可以写入256个字节
else pageremain=NumByteToWrite;  //不够256个字节了
}
};    




void SPI_Flash_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
  u16 i;  
    SPI_FLASH_Write_Enable();                  //SET WEL 
SPI_FLASH_CS=0;                            //使能器件
    SPI2_ReadWriteByte(W25X_PageProgram);      //·发送写页命令 
    SPI2_ReadWriteByte((u8)((WriteAddr)>>16)); //·发送24bit地址
    SPI2_ReadWriteByte((u8)((WriteAddr)>>8));   
    SPI2_ReadWriteByte((u8)WriteAddr);   
    for(i=0;i<NumByteToWrite;i++)
{
SPI2_ReadWriteByte(pBuffer);//循环写数
}
SPI_FLASH_CS=1;                            //取消片选
SPI_Flash_Wait_Busy();   //等待写入结束



希望大家能相互帮助下
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-6 22:24:07 | 显示全部楼层
我们例程是可以的,楼主好好检查吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

11

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-8-5
在线时间
0 小时
 楼主| 发表于 2015-8-7 09:33:26 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥。我的知识FLASH型号变了。    FLASH型号不同(SST25VF020B),你的代码还可以用不。可以读到ID的
希望大家能相互帮助下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 05:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表