OpenEdv-开源电子网

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

stm32写W25X16 FLASH

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-1-30
在线时间
0 小时
发表于 2013-1-30 14:35:56 | 显示全部楼层 |阅读模式
关于写W25X16的一些问题想咨询。
我安照原子大哥给程序写FLASH,结果写一部分大约10K的数据是对的。如果持续不断地写入数据,最后反而内部数据都是0xFF了。
请大家帮忙指点一下。谢谢
void W25X_Write_Bytes(uint32_t nSector,u8* pBuffer, u8 nBytes)
{
int i;
FLASH_CS_0();
W25X_Write_Enable();
FLASH_CS_0();
SPI_Write_Byte(W25X_PageProgram);
SPI_Write_Byte((u8)(nSector >> 16));
SPI_Write_Byte((u8)(nSector >> 8));
SPI_Write_Byte((u8) nSector);
for(i=0;i<nBytes;i++)
{ SPI_Write_Byte(pBuffer);
}
FLASH_CS_1();
W25X_Wait_Busy();
}

void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  //直接发送十六进制花费时间70S  发送字符花费140S (baud 115200)
{
result = USART_ReceiveData(USART1);
W25X_Write_Bytes(pAddr++,&result,1);

USART_ClearITPendingBit(USART1, USART_IT_RXNE);   /* Clear the USART Receive interrupt*/
}
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-30 17:52:53 | 显示全部楼层
看看我们的例程吧.
你这个写之前都没擦除,你这代码可用性基本为0.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-1-30
在线时间
0 小时
 楼主| 发表于 2013-1-30 18:32:13 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
擦除了,我把整个芯片都擦除了呢,只是没写上来。
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-1-30
在线时间
0 小时
 楼主| 发表于 2013-1-30 18:40:19 | 显示全部楼层
原点大哥,你说的例程,有链接吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-30 23:27:52 | 显示全部楼层
http://www.openedv.com/posts/list/9006.htm?fromAll=0
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2013-1-30
在线时间
0 小时
 楼主| 发表于 2013-1-31 10:55:30 | 显示全部楼层
原子大哥你好,程序我有,我参考着这个自己写的。我也看了,现在我遇到的问题是,在用串口写字库的时候,不知道使用哪个函数了,我刚才有仔细的看了下程序。发现我之前理解错了,所以直接用的第一个,不换页写了65536个数据,是对的。再多就错了。我想吧400K的字库内容不间断写进去,用第二个函数吗?那么串口中断还是和我上面写的那个一样吗?程序如下:
//SPI在一页(0~65535)内写入少于256个字节的数据
//在指定地址开始写入最大256字节的数据
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//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;                            //使能器件   
    SPIx_ReadWriteByte(W25X_PageProgram);      //发送写页命令   
    SPIx_ReadWriteByte((u8)((WriteAddr)>>16)); //发送24bit地址    
    SPIx_ReadWriteByte((u8)((WriteAddr)>>8));   
    SPIx_ReadWriteByte((u8)WriteAddr);   
    for(i=0;i<NumByteToWrite;i++)SPIx_ReadWriteByte(pBuffer);//循环写数  
SPI_FLASH_CS=1;                            //取消片选 
SPI_Flash_Wait_Busy();    //等待写入结束

//无检验写SPI FLASH 
//必须确保所写的地址范围内的数据全部为0XFF,否则在非0XFF处写入的数据将失败!
//具有自动换页功能 
//在指定地址开始写入指定长度的数据,但是要确保地址不越界!
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大65535)
//CHECK OK
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个字节了
}
};     
}
回复 支持 反对

使用道具 举报

15

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
243
金钱
243
注册时间
2014-10-31
在线时间
4 小时
发表于 2014-11-24 12:12:03 | 显示全部楼层
我也遇到和LZ同样的问题了,不知道LZ解决了没,求解啊
总有一天,要为自由而活
回复 支持 反对

使用道具 举报

3

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2015-4-18
在线时间
8 小时
发表于 2015-11-19 15:38:18 | 显示全部楼层
回复【6楼】snowhit1012:
---------------------------------
回复【7楼】LIUYABO:
---------------------------------
例程不支持的,要存储这么大的数据,要修改源代码,这是工程层面使用的事情,例程是最基本的。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-17 12:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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