先说下结论:标准库硬件SPI在读写SPI混用时,需要在写后读前添加空读语句,主要是把上一条写语句时,从设备发送过来的数据读取掉,以便不影响后续读数据
/*******************************************************************************
* 函数名 : Read_W5500_SOCK_2Byte
* 描述 : 读W5500指定端口寄存器的2个字节数据
* 输入 : s:端口号,reg:16位寄存器地址
* 输出 : 无
* 返回值 : 读取到寄存器的2个字节数据(16位)
* 说明 : 无
*******************************************************************************/
unsigned short Read_W5500_SOCK_2Byte(SOCKET s, unsigned short reg)
{
unsigned short i;
GPIO_ResetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS为低电平
SPI1_Send_Short(reg);//通过SPI1写16位寄存器地址
SPI1_Send_Byte(FDM2|RWB_READ|(s*0x20+0x08));//通过SPI1写控制字节,2个字节数据长度,读数据,选择端口s的寄存器
i=SPI_I2S_ReceiveData(SPI1);//添加 空读语句,主要是把上一条写语句时,从设备发送过来的数据读取掉,以便不影响后续读数据
SPI1_Send_Byte(0x00);//发送一个哑数据//添加 哑数据,为读取有效数据提供时钟信号(因为spi是全双工的,只有在发送数据的时候才会产生时钟,让从机返回数据)
i=SPI_I2S_ReceiveData(SPI1);//读取高位数据
SPI1_Send_Byte(0x00);//发送一个哑数据//添加 哑数据,为读取有效数据提供时钟信号(因为spi是全双工的,只有在发送数据的时候才会产生时钟,让从机返回数据)
i*=256;
i+=SPI_I2S_ReceiveData(SPI1);//读取低位数据
GPIO_SetBits(W5500_SCS_PORT, W5500_SCS);//置W5500的SCS为高电平
return i;//返回读取到的寄存器数据
}