是我第一次尝试使用SPI协议。我正在尝试理解我的开发套件附带的示例代码(它具有STM32F207VCT6微控制器)。此代码使用AT45DB041D闪存实现通信(读写)。

每次执行该示例代码都管理读取内存,它不仅会发送有关所读取的内容的信息,还要求接收数据rigth。收到的此数据不用于任何目的(显然)。稍后将首先发送0x00字节来再次读取的真实数据。以下代码显示:

void AT45DBXX_Read_ID(u8 *IData){
u8 i;
AT45DBXX_BUSY();
AT45DBXX_Enable;  //Chip Select drive to low
SPIx_Send_byte(Read_ID);        
for(i=0;i<4;i++)
{
    IData[i] = SPIx_Receive_byte();
}
AT45DBXX_Disable; //Chip Select drive to high
}
.

定义:

void SPIx_Send_byte(u16 data){
while(SPI_I2S_GetFlagStatus(Open207V_SPIx, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(Open207V_SPIx,data);

while(SPI_I2S_GetFlagStatus(Open207V_SPIx, SPI_I2S_FLAG_RXNE)==RESET);
SPI_I2S_ReceiveData(Open207V_SPIx);
}
.


u16 SPIx_Receive_byte(void){
while(SPI_I2S_GetFlagStatus(Open207V_SPIx, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(Open207V_SPIx,0x00);

while(SPI_I2S_GetFlagStatus(Open207V_SPIx, SPI_I2S_FLAG_RXNE)==RESET);
return SPI_I2S_ReceiveData(Open207V_SPIx);
}
.

您可以看到spix_send_byte代码不仅发送要读取的内容,还要接收不会使用的信息。

有人可以帮助我理解为什么需要完成的原因,为什么它需要发送0x00字节实际接收数据?

谢谢!

有帮助吗?

解决方案

SPI是一个全双工,双向总线,其中数据均被发送到从站并同时从从机接收。您的SPI控制器不知道给定字节是否是来自主设备的Glong,或来自从站或两者。因此,每当您发送一个字节时,就必须读取一个字节,如果只是扔掉它。通过同样的令牌,即使从设备扔掉它,你就不能收到一个字节而没有发送一个字节。

看看 wikipedia

所以,你代码正在做的是

  1. 向奴隶发送read_id。
  2. 读取并抛出字节同时读出从属奴隶。
  3. 将0写入从设备以使从站发送一个字节的数据。
  4. 读取同时读出从站的数据字节。
  5. 循环回#3。
  6. 顺便说一下,这些问题将更适合 ee堆栈Exchange ,因为它更加关于硬件协议而不是编程。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top