【问题标题】: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 的东西。我替换了那个,但现在固件甚至不再工作了

标签: c++ c stm32 spi


【解决方案1】:

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

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2019-01-10
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 2021-11-13
  • 2020-11-17
  • 2020-09-14
  • 2016-06-27
相关资源
最近更新 更多