OpenEdv-开源电子网

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

spi实验4096是怎么来的?

[复制链接]

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-28
在线时间
2 小时
发表于 2014-2-24 19:12:31 | 显示全部楼层 |阅读模式
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
u32 secpos;
u16 secoff;
u16 secremain;   
  u16 i;    

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);//读出整个扇区的内容
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; //下一个扇区可以写完了
}  
};  
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-24 19:14:13 | 显示全部楼层
flash芯片一个扇区的大小吧。看芯片的datasheet
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-28
在线时间
2 小时
 楼主| 发表于 2014-2-24 19:44:26 | 显示全部楼层
哦 我知道4096的意思了 可是芯片不是扇区不是128x16=2048么?怎么写的是0~511共521个?
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-28
在线时间
2 小时
 楼主| 发表于 2014-2-24 19:45:34 | 显示全部楼层
回复【3楼】haoyun1243:
---------------------------------
是512个
回复 支持 反对

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2014-2-24 19:50:18 | 显示全部楼层
回复【4楼】haoyun1243:
---------------------------------
w25x16 一页是256字节,一个扇区是16页
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2013-11-28
在线时间
2 小时
 楼主| 发表于 2014-2-24 20:23:42 | 显示全部楼层
回复【5楼】ricefat:
---------------------------------
谢谢 我懂了
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-1-26
在线时间
5 小时
发表于 2016-5-20 17:26:34 | 显示全部楼层
SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);     secpos*4096表示写了secpos个扇区数(字节数为secpos*4096),而SPI_FLASH_BUF数组只有4096个字节,第三个参数NumByteToWrite也是为4096,这不是和secpos*4096矛盾吗???
回复 支持 反对

使用道具 举报

3

主题

55

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2017-1-27
在线时间
34 小时
发表于 2017-3-11 09:43:40 | 显示全部楼层
xiaxingxing 发表于 2016-5-20 17:26
SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);     secpos*4096表示写了secpos个扇区数(字节 ...

  secpos*4096 这句话的意思可以理解为 从  secpos*4096这个地址开始写 ,而4096的意思是要写入的字节数4096个字节   就是之前读出来的加上你要写的内容 一共4096个字节吧
回复 支持 反对

使用道具 举报

6

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-9-24 16:00:17 | 显示全部楼层
ricefat 发表于 2014-2-24 19:50
回复【4楼】haoyun1243:
---------------------------------
w25x16&nbsp;一页是256字节,一个扇区是16页

论坛强大!!
请问为啥倒数100bit的位置地址来写数据??
回复 支持 反对

使用道具 举报

24

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
637
金钱
637
注册时间
2018-7-13
在线时间
197 小时
发表于 2018-9-25 08:03:27 | 显示全部楼层
长昵称不被占用 发表于 2018-9-24 16:00
论坛强大!!
请问为啥倒数100bit的位置地址来写数据??

不为啥,你从倒数第200写也可以。
回复 支持 反对

使用道具 举报

6

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
金钱
368
注册时间
2018-8-31
在线时间
115 小时
发表于 2018-9-25 13:13:13 | 显示全部楼层
不學會32不改名 发表于 2018-9-25 08:03
不为啥,你从倒数第200写也可以。

哦哦,就是从0也行呗,无关紧要
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 01:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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