野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19950|回复: 1

野火 stm32f03zet6 spi_flash收发问题

[复制链接]
发表于 2020-11-1 20:04:56 | 显示全部楼层 |阅读模式


  1. //发送并接收一个字节
  2. uint8_t SPI_FLASH_Send_Byte(uint8_t data)
  3. {
  4.         SPITimeout = SPIT_FLAG_TIMEOUT;
  5.         //检查并等待至TX缓冲区为空
  6.         while(SPI_I2S_GetFlagStatus(FLASH_SPIx,SPI_I2S_FLAG_TXE) == RESET)
  7.         {
  8.                 if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
  9.         }
  10.        
  11.         //程序执行到此处,TX缓冲区已空
  12.         SPI_I2S_SendData (FLASH_SPIx,data);
  13.        
  14.        
  15.         SPITimeout = SPIT_FLAG_TIMEOUT;
  16.         //检查并等待至RX缓冲区为非空
  17.         while(SPI_I2S_GetFlagStatus(FLASH_SPIx,SPI_I2S_FLAG_RXNE) == RESET)
  18.         {
  19.                 if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
  20.         }
  21.                
  22.         //程序执行到此处,说明数据发送完毕,并接收到一字字节       
  23.         return SPI_I2S_ReceiveData(FLASH_SPIx);

  24. }

  25. uint8_t SPI_FLASH_Read_Byte(void)
  26. {
  27.         return SPI_FLASH_Send_Byte(DUMMY);
  28. }

复制代码


在玩转教材中是这么说的:
    等待至接收缓冲区非空时,通过调用库函数 SPI_I2S_ReceiveData 读取 SPI 的数据
寄存器 DR,就可以获取接收缓冲区中的新数据了。代码中使用关键字“return”
把接收到的这个数据作为 SPI_FLASH_SendByte 函数的返回值,所以我们可以看
到在下面定义的 SPI 接收数据函数 SPI_FLASH_ReadByte,它只是简单地调用了
SPI_FLASH_SendByte 函数发送数据“Dummy_Byte”,然后获取其返回值(因为
不关注发送的数据,所以此时的输入参数“Dummy_Byte”可以为任意值)。可以
这样做的原因是 SPI 的接收过程和发送过程实质是一样的,收发同步进行,关键
在于我们的上层应用中,关注的是发送还是接收的数据

    为什么随便发个dummy就可以得到自己要读的数据啊,写入dummy不会把DR寄存器中的值改变么,怎么个收发一致。 读取数据调用发送的函数按照代码的执行顺序
1.检查并等待至TX缓冲区为空,2.程序执行到此处TX缓冲区已空,3.检查并等待至RX缓冲区为非空,4.程序执行到此处说明数据发送完毕,并接收到一字字节
接收的不是刚发过来的数据么?       



回复

使用道具 举报

发表于 2020-11-2 15:31:14 | 显示全部楼层
SPI双线全双工,数据的接收和发送是同时进行的,主机要想从从机那里得到一个字节,就必须提供给从机一个字节的时钟实质上每次SPI是主从设备在交换数据。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-25 05:50 , Processed in 0.024947 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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