10021|15

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

SPI等待问题 [复制链接]

static void WR_CMD (unsigned char cmd)  
{
  /* Wait for SPI1 Tx buffer empty */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  //int i;
  //while(SPI1->SR & 0x0002 == 0);
  //for(i = 0;i<5;i++);
  /* Send SPI1 data */
  SPI_I2S_SendData(SPI1,cmd);
  /* Wait for SPI1 data reception */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
  //while(SPI1->SR & 0x0001 == 0);
  //for(i = 0;i<5;i++);
  /* Read SPI1 received data */
  SPI_I2S_ReceiveData(SPI1);
}为什么不用库函数直接用寄存器等待就运行不了?
此帖出自stm32/stm8论坛

最新回复

                                   你说的这种解释我是理解的,我也考虑过延时的问题,所以在第一次贴图的时候,我在后面加了一个for,我想问一下是不是延时加的太短或者比你说的长点,也是不可以的。  详情 回复 发表于 2010-10-27 08:39
点赞 关注
 

回复
举报

70

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 SPI等待就读BUSY位就好了啊。
此帖出自stm32/stm8论坛
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
                                 SPI等待就读寄存器中的BUSY位就好了啊。
此帖出自stm32/stm8论坛
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 
                                 为什么会这样
此帖出自stm32/stm8论坛
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 什么现象?
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
                                 调用系统的查询标志函数,在那等待运行结果就正确。但是直接操作寄存器查询运行就不正常?
此帖出自stm32/stm8论坛
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 既然你调用系统的查询标志函数是可行的,直接读寄存器就也是可行的,如果不可行,请贴出这个地方的程序。
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
看不懂你的程序。
帮你理清一下逻辑
1、while(BUSY == 1); //表示SPI总线空闲.
2、SPI_I2S_SendData(SPI,cmd);
3、while(TXE == 0);
4、SPI_I2S_ReceiveData(SPI1);
5、while(RXNE == 0);

想问一下你的SPI是和什么器件通信。
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
                                 和ADS7843
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
你和ADS7843这样通信肯定会出问题的。

1、while(BUSY == 1); //表示SPI总线空闲.
2、SPI_I2S_SendData(SPI,cmd);
3、while(BUSY == 1); //表示SPI总线空闲.
4、while(7843BUSY == 1); //等待7843的BUSY引脚。也可以去掉这步
5、SPI_I2S_SendData(SPI,0x00);
6、while(BUSY == 1); //表示SPI总线空闲.
7、SPI_I2S_ReceiveData(SPI1);
8、SPI_I2S_SendData(SPI,0x00);
9、while(BUSY == 1); //表示SPI总线空闲.
10、SPI_I2S_ReceiveData(SPI1);
这样才会正确接收坐标,压力等触摸屏信息
此帖出自stm32/stm8论坛
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

11
 
                                 你要好好看看7843那个协议,用示波器测SPI,严格按照那个协议来写程序。
此帖出自stm32/stm8论坛
 
 
 

回复

94

帖子

0

TA的资源

一粒金砂(初级)

12
 
static void WR_CMD (unsigned char cmd)  
{
  /* Wait for SPI1 Tx buffer empty */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
  /* Send SPI1 data */
  SPI_I2S_SendData(SPI1,cmd);
  /* Wait for SPI1 data reception */
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
  /* Read SPI1 received data */
  SPI_I2S_ReceiveData(SPI1);
}
我这样写就可以的。
我说的判忙标志都是指的是stm32的。
  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
这一句如果改为直接操作寄存器,还有下面的判忙改为直接读寄存器,那么运行结果就不对。
而直接用库函数就正确.
?????
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
                                 你用库函数这样写能正常接收到触摸屏的坐标信息???
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 是的,直接用寄存器就不行了
此帖出自stm32/stm8论坛
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

15
 
由于AHB与APB之间桥的延迟,还有CM3核心的流水线效应,设置寄存器到器件中真正做动作之间很可能会有延迟。估计这就是你看到的现象,库函数调用引入了等待延迟,导致结果正确,但直接寄存器操作没有等待延迟,导致结果错误。

所以可以尝试在等待循环之前和之后,增加一些小的延迟(最多4个CPU周期),这样应能解决问题。
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(高级)

16
 

你说的这种解释我是理解的,我也考虑过延时的问题,所以在第一次贴图的时候,我在后面加了一个for,我想问一下是不是延时加的太短或者比你说的长点,也是不可以的。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表