初中生
最后登录1970-1-1
在线时间 小时
注册时间2020-10-19
|
- //发送并接收一个字节
- uint8_t SPI_FLASH_Send_Byte(uint8_t data)
- {
- SPITimeout = SPIT_FLAG_TIMEOUT;
- //检查并等待至TX缓冲区为空
- while(SPI_I2S_GetFlagStatus(FLASH_SPIx,SPI_I2S_FLAG_TXE) == RESET)
- {
- if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
- }
-
- //程序执行到此处,TX缓冲区已空
- SPI_I2S_SendData (FLASH_SPIx,data);
-
-
- SPITimeout = SPIT_FLAG_TIMEOUT;
- //检查并等待至RX缓冲区为非空
- while(SPI_I2S_GetFlagStatus(FLASH_SPIx,SPI_I2S_FLAG_RXNE) == RESET)
- {
- if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
- }
-
- //程序执行到此处,说明数据发送完毕,并接收到一字字节
- return SPI_I2S_ReceiveData(FLASH_SPIx);
- }
- uint8_t SPI_FLASH_Read_Byte(void)
- {
- return SPI_FLASH_Send_Byte(DUMMY);
- }
复制代码
在玩转教材中是这么说的:
等待至接收缓冲区非空时,通过调用库函数 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.程序执行到此处说明数据发送完毕,并接收到一字字节
接收的不是刚发过来的数据么?
|
|