有很多类似的问题,但似乎没有一个问题完全相同。我正在将STML4 MCU连接到6轴传感器(LSM6DS3)。我已经成功地实现了I2C中的所有内容,但希望使用SPI的额外速度(如果我能让这些第一步工作...)。因此,作为第一步,我正在尝试读取设备的
在作用域/分析器上,我看到一切都按预期运行,包括传感器发送回的
我包含了一个屏幕截图,显示传感器从单个读取请求中发送回
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
。我包含了一个屏幕截图,显示传感器从单个读取请求中发送回
0x69
,以及如果我尝试“虚拟传输”方法时发送的混乱信息。![Correcly sending me the WHO_AM_I value](https://istack.dev59.com/2aOOa.webp)
![Sending back <code>0x48</code> on "double" transmit](https://istack.dev59.com/k2Jdr.webp)
RXNE
),虽然现在最终who
被设置为0x0
,但几乎得到了相同的响应。不过,作用域信号看起来是一样的。 - TrivialCaseSPI_SR_BSY
而不是SPI_SR_RNE
,我将接受它作为答案。如果您能解释为什么会这样工作,那就更好了。 - TrivialCase