关于STM32标准库硬件SPI,HAL库硬件SPI和软件SPI中空读语句和发送哑数据的问题

先说下结论:标准库硬件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;//返回读取到的寄存器数据
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值