OpenEdv-开源电子网

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

外部Flash操作实验中,页写函数一直在等待busy信号空闲

[复制链接]

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
发表于 2013-11-21 19:58:32 | 显示全部楼层 |阅读模式
把例程的spi读写函数拆成了2个
u8 SPI2_Write(u8 data)
{
 u8 retry=0;
 while((SPI2->SR&0X02)==0) //等待数据发送完
 {
  retry++;
  if(retry>=0XFE)return 0;
 }
 SPI2->DR=data;   //data是要发送的数据
 return 0;
}
u8 SPI2_Read(void)
{
 u8 retry=0;
 while((SPI2->SR&0X01)==0) //等待数据接收完
 {
  retry++;
  if(retry>=0XFE)return 0;
 }
 return SPI2->DR;    //data是接收到的数据
}
下边是页写函数
 void Flash_WritePage(u32 add,u8 *data)
{
 u16 i;
 Flash_Write_EN();
 SPI2_CS=0;
 SPI2_Write(0X02);
 SPI2_Write((u8)add>>16);
 SPI2_Write((u8)add>>8);
 SPI2_Write((u8)add);
 for(i=0;i<256;i++)
 {
  SPI2_Write(data); 
 }
 SPI2_CS=1;
  while((Flash_ReadSR()&0X01)==0X01);程序一直在这等待忙信号空闲
}
发现读出的状态寄存器的值是0XFF,是不是spi读函数不对,还是别的地方出错了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-22 08:56:49 | 显示全部楼层
回复【楼主位】jikaishihuaidan:
---------------------------------
你初始化的时候写个函数读取Flash的ID看下能正确读取没?程序不要这样while(.....);在这个循环等待里面加个超时退出这个循环,返回一个错误的信息,给后面程序判断,这样不会移植死机在这个地方
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-22 09:01:29 | 显示全部楼层
回复【楼主位】jikaishihuaidan:
---------------------------------
你的SPI2的发送和读取可以合在一个函数里面,把数据一发出去就等待返回的数据
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-11-22 10:06:36 | 显示全部楼层
回复【3楼】Badu_Space:
---------------------------------
恩,是可以和一起,把他们分开的话按说应该也对吧。
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-11-22 10:08:44 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
读出的ID也不对。。。。。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-22 10:11:00 | 显示全部楼层
回复【5楼】jikaishihuaidan:
---------------------------------
那就是你的SPI底层驱动问题了,发送高位和低位前后的问题要搞清楚,是上升沿采集数据还是下降沿采集数据
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-22 10:12:34 | 显示全部楼层
回复【4楼】jikaishihuaidan:
---------------------------------
分开也是可以的,呵呵
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-11-22 10:15:53 | 显示全部楼层
回复【7楼】Badu_Space:
---------------------------------
刚才把spi的读写合在一起,才正确读出ID,分开的几乎把他们原封不动的拆成2个,但就是不行o(╯□╰)o
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-22 10:29:00 | 显示全部楼层
回复【8楼】jikaishihuaidan:
---------------------------------
分开的没试过,我的都是合在一起的,分开的估计是时间问题造成的,你可以验证一下,将接收到的信息打印出来
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-11-22 10:33:45 | 显示全部楼层
回复【9楼】Badu_Space:
---------------------------------
分开的时候ID是很大的一串数134.......反正是不对的,而且会死在上边红色的等待空闲信号处。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-22 10:56:57 | 显示全部楼层
回复【10楼】jikaishihuaidan:
---------------------------------
那就和一起吧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-11-22 11:01:08 | 显示全部楼层
回复【11楼】Badu_Space:
---------------------------------
谢谢啦,哥。
回复 支持 反对

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-10-27
在线时间
23 小时
发表于 2013-11-22 19:09:34 | 显示全部楼层
回复【楼主位】jikaishihuaidan:
---------------------------------
干嘛要拆成两个函数啊?STM32的SPI是全双工通讯的,你发送一个字节数据,就能收到一个字节数据。如果你不想要这个收到的数据,不去读它就是。一定要看清楚STM32的SPI部分后的资料再来写程序
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-11-22 19:43:47 | 显示全部楼层
回复【13楼】liuxuefei11:
---------------------------------
是不是spi的时序就是在sck的控制下,两个双向移位寄存器进行数据交换。所以它是一边发送一边接收的,必须发送一个数据才能接收一个
只接受而不发送是不行的?
回复 支持 反对

使用道具 举报

4

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2013-10-27
在线时间
23 小时
发表于 2013-11-22 19:49:04 | 显示全部楼层
回复【14楼】jikaishihuaidan:
---------------------------------
你可以配置SPI的工作模式啊。请仔细阅读SPI部分的参考手册吧
回复 支持 反对

使用道具 举报

20

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
222
金钱
222
注册时间
2013-9-21
在线时间
0 小时
 楼主| 发表于 2013-11-22 20:50:29 | 显示全部楼层
回复【15楼】liuxuefei11:
---------------------------------
谢谢,已解决。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 22:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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