关于SPI的疑问

[复制链接]
2337|7
 楼主| 午夜霓虹 发表于 2011-6-23 08:01 | 显示全部楼层 |阅读模式
以前没用过其他单片机的SPI接口,现在用STM32的SPI接口的时候发现有很大的不同,其他的单片机SPI接口写数据完成的时候,读数据同步完成了,而stm32没有,需要多一个等待。

  请问我在用中断的时候,如果读状态完成,是不是意味着写状态一定也完成了。谢谢。
香水城 发表于 2011-6-23 10:11 | 显示全部楼层
请说仔细点:
哪里说需要多一个等待?一个等待是多长时间?等待什么?

你用的什么中断?

为什么要写状态?是要清除状态位吗?
 楼主| 午夜霓虹 发表于 2011-6-23 10:51 | 显示全部楼层
/*!< Loop while DR register in not emplty */
  while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_TXE) == RESET);

  /*!< Send byte through the SPI1 peripheral */
  SPI_I2S_SendData(sFLASH_SPI, byte);

  /*!< Wait to receive a byte */
  while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_RXNE) == RESET);

  /*!< Return the byte read from the SPI bus */
  return SPI_I2S_ReceiveData(sFLASH_SPI);

一般别的单片机只要完成 while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_TXE) == RESET); 读取这个就可以读取和再次发送数据了,
即  发送数据->发送完毕->读取接收数据。
STM32则要这样做    发送数据->发送完毕->接收完毕->读取接收数据。

多了一个接收状态。

我要是用中断的话  这样做呢 开接收数据中断 ->发送数据-> 触发接收完成中断->读取接收数据->再次发送和接收。
香水城 发表于 2011-6-23 10:58 | 显示全部楼层
SPI_I2S_FLAG_TXE这个状态只表示发送缓冲区空,不表示发送完成,你的理解有误。

引入这个状态,可以让软件更有效率地传输数据。
香水城 发表于 2011-6-23 10:58 | 显示全部楼层
SPI_I2S_FLAG_TXE这个状态只表示发送缓冲区空,不表示发送完成,你的理解有误。

引入这个状态,可以让软件更有效率地传输数据。
 楼主| 午夜霓虹 发表于 2011-6-23 14:46 | 显示全部楼层
哦,不是理解错误,是我的表述错误,呵呵,不好意思,因为我没找到发送完成标志,我可以不可以这样认为,接收完成标识就可以当作发送完成标识,这个理解没问题吧。
yzzly 发表于 2011-6-23 16:54 | 显示全部楼层
用while(SPI2->SR & 0x80);来确认SPI是否发送完成
tikelu 发表于 2011-6-24 13:58 | 显示全部楼层
先确认下 看有没有异常
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

463

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部