为啥我在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(®, 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(®, 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通信)