代码如下:(问题在最后)
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] |