找回密码
 立即注册
查看: 759|回复: 3

关于冲哥29课SPI读写W25X40CL页写程序的疑问

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:374
  • 最近打卡:2025-04-29 08:33:10

16

主题

137

回帖

978

积分

高级会员

积分
978
发表于 2024-3-1 10:20:27 | 显示全部楼层 |阅读模式
本帖最后由 pursuing 于 2024-3-2 11:17 编辑

我在学习冲哥STC32教程(用的STC8H实验箱),第29课SPI读写FLASH的教程中有如图的页写PageProgram(指令0x02)程序段:

1. 我的疑问是,这里addr在实验中传的地址是0,根本就没有变,而这里 if(addr&0xff==0) 不是一下就满足了吗,也就跳出这段循环了,按我的理解只有SPI_WriteByte(buffr[0])写入了,后面的2、4、6、8、10等数组后5个数组元素都不应该写入,但实验确实证明写入成功了,又读出来了。这是怎么回事呢??
2. 另外,这句红线的 if 判断,我认为有问题,应该是 if((addr+i)&0xff==0),这样写满一页时就停止了。又看了下实验箱程序,虽然这一句和这里一样,但前一句是addr++,这就对了。另外,页写最大256字节,length和i用u8就够。
3. 我对上述地方进行了仿真,奇怪的是,仿真程序从来不会走到 if(addr&0xff==0) break; 这句,而其他的 if(length == 0) 之类的判断,都会停下来进行判断。开始我以为是addr没有变化,编译时优化掉了,但后来我改成 if((addr+i)&0xff==0),仿真竟然也不会走到这里,每次都是跳过这个判断,直接到while(length--)处。咋回事捏?

000.png
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:374
  • 最近打卡:2025-04-29 08:33:10

16

主题

137

回帖

978

积分

高级会员

积分
978
发表于 2024-3-4 11:13:56 | 显示全部楼层
本帖最后由 pursuing 于 2024-3-5 19:56 编辑

网上看了看相关帖子,除了说打开魔术棒/output/Debug information,就是让降低优化级别,我降低到2,或用default,编译都没问题,但这里if的判断一句断点还是打不上。看来编译器还是会把if这一句优化掉,(addr+i)是不断增加的为何还会被优化,真是令人费解啊。
后来用了xdata的库,终于可以把优化级别降下来了。

最后原因也找到了,应该加(),优先级问题。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:67
  • 最近打卡:2024-09-24 18:48:30

1

主题

5

回帖

365

积分

中级会员

积分
365
发表于 2024-3-6 10:00:57 | 显示全部楼层
从flash规的格书看一次最多可写256个字节。如果(addr&oxff==0)说明指针(地址)返回到了0x00,再写下去会覆盖掉前面写好的资料,所以要break退出。
以下是STC8程序包中的相同操作,可作参考


SPI-PM25LV040.JPG

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:374
  • 最近打卡:2025-04-29 08:33:10

16

主题

137

回帖

978

积分

高级会员

积分
978
发表于 2024-3-7 09:19:31 | 显示全部楼层
GGG_*** 发表于 2024-3-6 10:00
从flash规的格书看一次最多可写256个字节。如果(addr&oxff==0)说明指针(地址)返回到了0x00,再写下去会覆 ...

谢谢,我不是问这几句的意思,而是当时疑惑为什么仿真到不了那一句,后来发现少了括号,问题已解决。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:24 , Processed in 0.108015 second(s), 70 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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