【发布时间】:2019-01-10 06:50:06
【问题描述】:
有很多类似的问题,但似乎没有一个问题完全相同。我将 STML4 MCU 连接到 6 轴传感器 (LSM6DS3)。我已经成功地实现了 I2C 中的所有内容,但想要 SPI(和 DMA,如果我能让这些第一步工作......)的额外速度。所以第一步,我试图读取设备的WHO_AM_I 寄存器(0x0F),它应该回复0x69。代码如下:
uint8_t who = 0;
// Sanity check/debugging aid should get 0x5D
who = 0x43 + 0x1A;
// Set SS low
GPIO_WritePin (GPIOB, LL_GPIO_PIN_7, GPIO_PIN_RESET);
// while tx buffer is in use, wait
while (!LL_SPI_IsActiveFlag_TXE(SPI1));
// Send READ command to the WHO_AM_I register
(SPI1->DR) = 0x8F;
// while rx buffer is in use, wait
while (!LL_SPI_IsActiveFlag_RXNE(SPI1));
// Get data off the register
who = (SPI1->DR);
// Wait for everything to wrap up before setting SS high again
while (LL_SPI_IsActiveFlag_BSY(SPI1));
// OK, now we can set SS high
GPIO_WritePin (GPIOB, LL_GPIO_PIN_7, GPIO_PIN_SET);
在示波器/分析仪上,我看到一切都按预期运行,包括传感器发回0x69。但是,当我在此代码块的另一侧设置中断时,我看到 who 从 0 变为 0x5D 再到 0xFF。它从不读取0x69。我查看了其他代码示例,有些人进行了第二次传输,数据设置为某个虚拟值(通常为0xFF 或0x0),所以我也尝试过,但传感器似乎在第二次尝试时感到困惑,并且who 最终成为 0x48。我已经尝试了等待我可以拥有的RXNE/TXE/BSY 标志的所有排列,以及许多其他让变量正确读取SPI1 数据寄存器的方法,包括读取其他注册了传感器,但都无济于事。
那么问题来了,如何正确读取这个寄存器的值?
我还应该提到我可以成功写入设备的寄存器。我可以发送我想要的命令,然后将其读回并查看它是否适用于范围,即使我永远无法在代码中获得分配给变量的值。我总是收到0xFF。
【问题讨论】:
标签: c embedded hardware stm32 spi