为啥我在STM32上不能通过SPI读取寄存器?

Posted

技术标签:

【中文标题】为啥我在STM32上不能通过SPI读取寄存器?【英文标题】:Why can't I read registers through SPI on STM32?为什么我在STM32上不能通过SPI读取寄存器? 【发布时间】:2020-07-15 22:03:43 【问题描述】:

我正在尝试将带有 SPI 的 LSM6DSOX 传感器板连接到 Nucleo-STM32L011K4。看来我可以成功读到板子了,我使用以下代码:

static int32_t platform_write(void *handle, uint8_t reg, uint8_t *bufp,
                              uint16_t len)

    HAL_GPIO_WritePin(GPIOA, CS_Pin, GPIO_PIN_RESET);
    BSP_SPI1_Send(&reg, 1);
    BSP_SPI1_Send(bufp, len);
    HAL_GPIO_WritePin(GPIOA, CS_Pin, GPIO_PIN_SET);
    return 0;

但是,当我尝试从单个寄存器(例如 WHO_AM_I 寄存器)中读取数据时,我总是返回 0x00(情况并非如此)。我使用以下代码进行阅读:

static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp,
                             uint16_t len)

    reg |= 0x80;
    HAL_GPIO_WritePin(GPIOA , CS_Pin, GPIO_PIN_RESET);
    BSP_SPI1_Send(&reg, 1);
    BSP_SPI1_Recv(bufp, len);
    HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_SET);
    return 0;

我不明白为什么这不起作用。我认为许多其他代码部分是问题,但我认为我将其缩小到这部分。任何人都可以发现错误?

【问题讨论】:

哪一行给出了意想不到的结果? BSP_SPI1_Recv(bufp, len);? 0x00 在 bufp 中吗?为什么重置 GPIOA 后还要设置 GPIOB? @Sebastian 是的,bufp 得到 0x00。这就是为什么我认为那里可能有问题。感谢您注意到 GPIOA/B 的东西。我替换了那个,但现在固件甚至不再工作了 【参考方案1】:

您需要启用寄存器地址增量。 请参阅 LSM6DSOX 的数据表。在寄存器 CTRL3_C(12h) 中设置她位 IF_INC。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于为啥我在STM32上不能通过SPI读取寄存器?的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103(二十六)SPI通信(+两块STM32之间的SPI通信)

STM32F103(二十六)SPI通信(+两块STM32之间的SPI通信)

求助STM32关于SPI问题!!状态寄存器BSY位永远为1

stm32f429,spi dr寄存器不写数据

SPI 串行Flash闪存W25Q128FV 的使用(STM32F407)_软件篇

STM32 SPI数据打包