打印

问题求助:关于SPI的一个函数

[复制链接]
634|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
第十代火影|  楼主 | 2018-6-27 10:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下:(问题在最后)

u32 SPI_FLASH_ReadDeviceID(void)//函数A

{

  u32 Temp = 0;

  SPI_FLASH_CS_LOW();



  SPI_FLASH_SendByte(W25X_DeviceID);//(第一次调用,Flash命令时序第一字节)

  SPI_FLASH_SendByte(Dummy_Byte);//(第二次调用,Flash命令时序第二字节)

  SPI_FLASH_SendByte(Dummy_Byte);//(第三次调用,Flash命令时序第三字节)

  SPI_FLASH_SendByte(Dummy_Byte);//(第四次调用,Flash命令时序第四字节)

  Temp = SPI_FLASH_SendByte(Dummy_Byte);//(第五次调用,Flash命令时序第五字节)



  SPI_FLASH_CS_HIGH();

  return Temp;

}



u8 SPI_FLASH_SendByte(u8 byte)//函数B

{

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//等待发送缓存空

  SPI_I2S_SendData(SPI1, byte);//发送数据

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);//等待接收缓存非空

  return SPI_I2S_ReceiveData(SPI1);

}



问题:SPI在全双工通信中,上面的读取ID函数(函数A)多次调用了下面的函数(函数B);在第五次调用中(即:按Flash命令时序发送第五个字节),从Flash命令表可知有返回值(ID7-ID0),那么‘等待接收缓存非空’的while语句会顺利通过;可是在第一次到第四次的调用中(即:按Flash命令时序发送第一个字节到第四个字节),从Flash命令表中可知没有返回值(至少没有明确表明有无返回值),那么‘等待接收缓存非空’的while语句是怎么通过的????



(第一次提问,不知道问题有没有表述清楚,从编译结果来看的确有返回值,不然程序会一直停在while语句那里,可是。。。。到底是怎么个逻辑呀??!!)

————————————————————————————————————————————————————————

换个问法:我把上面的第一个函数(函数A)改成如下函数。那么如下函数错在哪里?

u32 SPI_FLASH_ReadDeviceID(void)

{

  u32 Temp = 0;

  SPI_FLASH_CS_LOW();



  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//等待发送缓存空

  SPI_I2S_SendData(W25X_DeviceID);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//等待发送缓存空

  SPI_I2S_SendData(Dummy_Byte);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//等待发送缓存空

  SPI_I2S_SendData(Dummy_Byte);

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);//等待发送缓存空

  SPI_I2S_SendData(Dummy_Byte);

  Temp = SPI_FLASH_SendByte(Dummy_Byte);//(只调用一次)



  SPI_FLASH_CS_HIGH();

  return Temp;

}













[/td][/tr][/table]

使用特权

评论回复

相关帖子

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

本版积分规则

363

主题

363

帖子

0

粉丝