【问题标题】:STM32F407 SPI While Reading Datas of LIS3DSHSTM32F407 SPI读取LIS3DSH的数据
【发布时间】:2021-01-08 06:35:30
【问题描述】:
 uint8_t SPI_Rx(uint8_t address)
    {
     GPIO_ResetBits(GPIOE,GPIO_Pin_3);
     address    =   (0x80) | (address);
        
     while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_TXE));     
     SPI_I2S_SendData(SPI1,address);
     while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_RXNE));
     SPI_I2S_ReceiveData(SPI1);
        
     while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_TXE));     
     SPI_I2S_SendData(SPI1,0x00);
     while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_RXNE));
     SPI_I2S_ReceiveData(SPI1);
        
     GPIO_SetBits(GPIOE,GPIO_Pin_3);
     return SPI_I2S_ReceiveData(SPI1);

您好,您看到的是 LIS3DSH 传感器的 SPI 读取功能。首先,在我发送地址信息后,SPI RX 缓冲区接收 LIS3DSH 传感器的数据。但是为什么它需要通过发送“0x00”来接收LIS3DSH传感器的数据呢?简而言之,为什么我们已经收到了数据,还需要再次发送 else 数据?提前,谢谢。

【问题讨论】:

    标签: spi


    【解决方案1】:

    从 LIS3DSH 的寄存器读取数据时,整个 SPI 事务是两个字节长:

    • 字节 1:主机将寄存器地址(包括读/写标志)发送到传感器。
    • 字节 2:传感器将寄存器值发送到主机。

    不过,SPI 是全双工协议。对于每个位和字节,主机和从机(传感器)都发送数据。所以真正的交流其实是这样的:

    • 字节 1
      • 主机发送寄存器地址。
      • Slave 发送 0 或任何随机值。
    • 字节 2
      • Master 发送 0。
      • 从机发送寄存器值。

    这就是你在代码中看到的:

     while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_TXE));  // Wait for SPI bus to be ready
     SPI_I2S_SendData(SPI1,address);                    // Submit byte 1 to be sent
     while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_RXNE)); // Wait for byte 1 from slave
     SPI_I2S_ReceiveData(SPI1);                         // Retrieve byte 1 from slave and ignore it
        
     while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_TXE));  // Wait for SPI bus to be ready
     SPI_I2S_SendData(SPI1,0x00);                       // Send 0 as byte 2
     while(!SPI_I2S_GetFlagStatus(SPI1,SPI_FLAG_RXNE)); // Wait for byte 2 from slave
     SPI_I2S_ReceiveData(SPI1);                         // Retrieve byte 2 and ??
    
     GPIO_SetBits(GPIOE,GPIO_Pin_3);                    // Deassert CS?
     return SPI_I2S_ReceiveData(SPI1);                  // Retrieve byte 2 again and return it
    

    最后一部分有点奇怪。 SPI_I2S_ReceiveData() 最后被调用了两次,可能假设它将返回相同的值两次。如果只调用一次它可能会更干净。

    【讨论】:

    • 谢谢。我得到了它。你的帖子很清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2021-05-28
    • 2020-06-11
    • 1970-01-01
    • 2019-01-10
    相关资源
    最近更新 更多