打印

死循环了:while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);

[复制链接]
25739|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
55948218|  楼主 | 2009-10-11 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void hanzireadone(u8 *pBuffer,u8 qu,u16 ReadAddr)
{
unsigned char i;
GPIO_SetBits(GPIOB,GPIO_Pin_10);
   hanzi_cs_l;
   while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
   SPI_I2S_SendData(SPI2,qu);
  green_led_on;
   while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
green_led_off;
   SPI_I2S_SendData(SPI2,ReadAddr>>8);
   while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
   SPI_I2S_SendData(SPI2,ReadAddr);
   for(i=0;i<32;i++)
   {
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
     *(pBuffer+i)=SPI_I2S_ReceiveData(SPI2);
   }
   hanzi_cs_h;
}

到这里就死循环了,好象TXE一直为0,SPI2好象没有发送,好象发送缓冲区中一直有数据
  green_led_on;
   while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);

MOSI 和MISO和SCK电压在0。8V左右,不知道什么原因??
沙发
ST_ARM| | 2009-10-20 14:25 | 只看该作者
你的内核运行速度是多少?SPI的运行速度是多少?你的SPI的SCK频率是多少?
你的问题与这三个频率有关。

使用特权

评论回复
板凳
xinxin1986| | 2009-10-20 15:34 | 只看该作者
其实自己也没去测过
自己都不知道

使用特权

评论回复
地板
aleda303| | 2011-3-25 11:36 | 只看该作者
本帖最后由 aleda303 于 2011-3-25 11:39 编辑

我也遇到这个问题了 ,
一开始好用 读取数据没问题,后来就进入到 死循环
按照其他说的 加延时、改动数据等都不成功

后来考虑,它一直在RESET状态,硬件上一直是低电平,怀疑是IO的电平状态有问题
我在DATA数据线上 都加了10K的上拉电阻 ,这样就解决了 。你可以试下

使用特权

评论回复
5
ComeONic| | 2011-3-25 17:22 | 只看该作者
MOSI,MISO还有SCK在空闲状态尽量保持高电平
这就是为什么加上拉能够解决问题的原因。当然,进入死循环还是有很多原因,最基本的先检查初始化是否正确,然后再看看硬件是否真正连接?

使用特权

评论回复
6
zysmcu| | 2012-8-7 20:21 | 只看该作者
请问你的问题解决了吗?我也遇到这个问题。

使用特权

评论回复
7
sflower| | 2012-9-19 12:06 | 只看该作者
我也遇到这样的问题,怎么解决的?

使用特权

评论回复
8
wgj_fly| | 2012-9-24 15:24 | 只看该作者
spi的时钟打开了吗??多半是这样的问题

使用特权

评论回复
9
wj19900703| | 2013-9-2 15:15 | 只看该作者
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2 , ENABLE );
出这个问题的人99%都是由spi1改写的代码
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1 , ENABLE );

使用特权

评论回复
评论
stay_foolish 2015-6-15 17:57 回复TA
赞一个,必须得对时钟树有了解才不易改错。 
评分
参与人数 1威望 +1 收起 理由
dzkd001 + 1 赞一个!
10
hkcj| | 2013-9-2 19:39 | 只看该作者
帮楼主顶一个   这一块   不是很了解   希望有高手能够解决这个问题

使用特权

评论回复
11
hkcj| | 2013-9-2 19:40 | 只看该作者
话说   我也要将底层驱动这一块好好学一学了   

使用特权

评论回复
12
haitun050505| | 2013-10-11 09:17 | 只看该作者
wj19900703 发表于 2013-9-2 15:15
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2 , ENABLE );
出这个问题的人99%都是由spi1改写的代码
RCC_AP ...

正解   谢谢!!!!

使用特权

评论回复
13
jingyang503815| | 2013-10-17 11:19 | 只看该作者
我也遇到这个问题了,请问怎么解决的?wj19900703 发表于 2013-9-2 15:15
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2 , ENABLE );
出这个问题的人99%都是由spi1改写的代码
RCC_AP ...

如何设置呀?

使用特权

评论回复
14
litai1114| | 2014-4-15 18:16 | 只看该作者
把SPI的寄存器窗口关掉就可以了,原因是寄存器窗口在的到标志位值时已经读过了

使用特权

评论回复
15
missing01| | 2014-4-16 15:30 | 只看该作者
litai1114 发表于 2014-4-15 18:16
把SPI的寄存器窗口关掉就可以了,原因是寄存器窗口在的到标志位值时已经读过了 ...

??

使用特权

评论回复
16
can_all| | 2014-11-28 10:55 | 只看该作者
wj19900703 发表于 2013-9-2 15:15
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2 , ENABLE );
出这个问题的人99%都是由spi1改写的代码
RCC_AP ...

这哥们的答案是正确的。解决了问题。感谢!

使用特权

评论回复
17
showwei2004| | 2014-11-30 07:55 | 只看该作者
wj19900703 发表于 2013-9-2 15:15
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2 , ENABLE );
出这个问题的人99%都是由spi1改写的代码
RCC_AP ...

非常非常非常感谢。
我在改写的时候其实已经将SPI2的总线看了,也参考了很多人的代码,但是怎么就是没注意到RCC_APB1PeriphClockCmd这句没有跟着改过来,陷入思维定式了。
再次表达感谢,帮我解决了4个多小时的问题。

使用特权

评论回复
18
wwm98656| | 2014-12-22 16:36 | 只看该作者
非常感谢,同样的问题,就是SPI1改SPI2的时候时钟没改~

使用特权

评论回复
19
bluetiger99| | 2015-1-16 10:56 | 只看该作者
litai1114 发表于 2014-4-15 18:16
把SPI的寄存器窗口关掉就可以了,原因是寄存器窗口在的到标志位值时已经读过了 ...

怎么关SPI的寄存器窗口?

使用特权

评论回复
20
xiaohaolaoda| | 2016-6-3 21:36 | 只看该作者
我遇到这个问题是因为主函数里没有加spi_init();

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

146

帖子

0

粉丝