昨天调试了一天的硬件SPI和RC522通信,结果一直通信不了。今天,无奈之下,将SPI写改成和别人一样的写法,结果能正常通信了。然后问题来了,
最开始的SPI 读,写操作我的程序是这样写的SPI采用双线全双工模式)
/*******************************************************************************
* @函数名称 SPI_Write
* @函数说明 SPI写操作
* @输入参数 无
* @输出参数 无
* @返回参数 无
*****************************************************************************/
void SPI_Write(uint16_t Data)
{
while((SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE))==RESET);
SPI_I2S_SendData(SPI1,Data);
}
/*******************************************************************************
* @函数名称 SPI_Read
* @函数说明 SPI读操作,读取外部数据
* @输入参数 无
* @输出参数 无
* @返回参数 无
*****************************************************************************/
uint16_t SPI_Read(unint16_t Data)
{
uint16_t Value = 0;
while((SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE))==RESET);
SPI_I2S_SendData(SPI1,Data);
while((SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE))==RESET);
Value = SPI_I2S_ReceiveData(SPI1);
return Value;
}
这种情况下,我的主机不能够和从机正常的通信,然后我把程序改成下面这种情况,通信正常了:
*******************************************************************************
* @函数名称 SPI_Write
* @函数说明 SPI写操作
* @输入参数 无
* @输出参数 无
* @返回参数 无
*****************************************************************************/
uint16_t SPI_Write(uint16_t Data)
{
uint16_t Value = 0;
while((SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE))==RESET);
SPI_I2S_SendData(SPI1,Data);
while((SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE))==RESET);
Value = SPI_I2S_ReceiveData(SPI1);
return Value;
}
/*******************************************************************************
* @函数名称 SPI_Read
* @函数说明 SPI读操作,读取外部数据
* @输入参数 无
* @输出参数 无
* @返回参数 无
*****************************************************************************/
uint16_t SPI_Read()
{
return (SPI_Write(0x11));//这里的值时任意写的
}
这两种操作,根本的区别在那呢?欢迎大家前来指教。 |