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

[复制链接]
 楼主| 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的上拉电阻 ,这样就解决了 。你可以试下
ComeONic 发表于 2011-3-25 17:22 | 显示全部楼层
MOSI,MISO还有SCK在空闲状态尽量保持高电平
这就是为什么加上拉能够解决问题的原因。当然,进入死循环还是有很多原因,最基本的先检查初始化是否正确,然后再看看硬件是否真正连接?
zysmcu 发表于 2012-8-7 20:21 | 显示全部楼层
请问你的问题解决了吗?我也遇到这个问题。
sflower 发表于 2012-9-19 12:06 | 显示全部楼层
我也遇到这样的问题,怎么解决的?
wgj_fly 发表于 2012-9-24 15:24 | 显示全部楼层
spi的时钟打开了吗??多半是这样的问题
wj19900703 发表于 2013-9-2 15:15 | 显示全部楼层
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2 , ENABLE );
出这个问题的人99%都是由spi1改写的代码
RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1 , ENABLE );

评论

赞一个,必须得对时钟树有了解才不易改错。  发表于 2015-6-15 17:57

评分

参与人数 1威望 +1 收起 理由
dzkd001 + 1 赞一个!

查看全部评分

hkcj 发表于 2013-9-2 19:39 | 显示全部楼层
帮楼主顶一个   这一块   不是很了解   希望有高手能够解决这个问题
hkcj 发表于 2013-9-2 19:40 | 显示全部楼层
话说   我也要将底层驱动这一块好好学一学了   
haitun050505 发表于 2013-10-11 09:17 | 显示全部楼层
wj19900703 发表于 2013-9-2 15:15
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2 , ENABLE );
出这个问题的人99%都是由spi1改写的代码
RCC_AP ...

正解   谢谢!!!!
jingyang503815 发表于 2013-10-17 11:19 | 显示全部楼层
我也遇到这个问题了,请问怎么解决的?wj19900703 发表于 2013-9-2 15:15
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2 , ENABLE );
出这个问题的人99%都是由spi1改写的代码
RCC_AP ...

如何设置呀?
litai1114 发表于 2014-4-15 18:16 | 显示全部楼层
把SPI的寄存器窗口关掉就可以了,原因是寄存器窗口在的到标志位值时已经读过了
missing01 发表于 2014-4-16 15:30 | 显示全部楼层
litai1114 发表于 2014-4-15 18:16
把SPI的寄存器窗口关掉就可以了,原因是寄存器窗口在的到标志位值时已经读过了 ...

??
can_all 发表于 2014-11-28 10:55 | 显示全部楼层
wj19900703 发表于 2013-9-2 15:15
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2 , ENABLE );
出这个问题的人99%都是由spi1改写的代码
RCC_AP ...

这哥们的答案是正确的。解决了问题。感谢!
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个多小时的问题。
wwm98656 发表于 2014-12-22 16:36 | 显示全部楼层
非常感谢,同样的问题,就是SPI1改SPI2的时候时钟没改~
bluetiger99 发表于 2015-1-16 10:56 | 显示全部楼层
litai1114 发表于 2014-4-15 18:16
把SPI的寄存器窗口关掉就可以了,原因是寄存器窗口在的到标志位值时已经读过了 ...

怎么关SPI的寄存器窗口?
xiaohaolaoda 发表于 2016-6-3 21:36 | 显示全部楼层
我遇到这个问题是因为主函数里没有加spi_init();
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

146

帖子

0

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