闪存写入和通过SPI读取
-
22-12-2019 - |
题
是我第一次尝试使用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 。
所以,你代码正在做的是
- 向奴隶发送read_id。
- 读取并抛出字节同时读出从属奴隶。
- 将0写入从设备以使从站发送一个字节的数据。
- 读取同时读出从站的数据字节。
- 循环回#3。 顺便说一下,这些问题将更适合 ee堆栈Exchange ,因为它更加关于硬件协议而不是编程。
不隶属于 StackOverflow