繁体   English   中英

读取STM32 MCU的SPI数据寄存器的值

[英]Reading values of SPI data register of STM32 MCU

有很多类似的问题,但似乎都没有相同的问题。 我正在将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 但是,当我在这个代码块的另一端设置一个中断时,我看到who00x5D0xFF 它永远不会读取0x69 我查看了其他代码示例,有些人将第二次传输的数据设置为某个虚拟值(通常为0xFF0x0 ),所以我也试过了,但传感器似乎在第二次尝试时感到困惑who最终成为0x48 我已经尝试了等待我可能拥有的RXNE / TXE / BSY标志的每个排列,以及许多其他事情来让变量正确读取SPI1数据寄存器,包括从传感器读取其他寄存器,但所有徒劳无功。

那么问题是,如何正确读取该寄存器的值?

我还要提一下,我可以成功写入设备的寄存器。 我可以发送我想要的命令,然后读回来看看它是否适用于作用域,即使我永远无法在代码中获得赋值给变量的值。 我总是得到0xFF

我包括我的分析仪屏幕,显示传感器从单个读取请求发回0x69 ,以及如果我尝试“虚拟发送”方法它发送的乱码。 Correcly向我发送WHO_AM_I值 在“double”传输上发送<code> 0x48 </ code>

SPI始终(如果接收器已启用)在传输时接收数据。

这是图书馆的问题,你不知道那里有什么。 SPI使用寄存器编程要容易得多。

我假设你的数据是8位。

您需要在SPI初始化期间通过以下方式设置1/4(单字节)FIFO阈值:

 SPI1 -> CR2 |= SPI_CR2_FRXTH;

接下来,您需要在每次写入后从FIFO读取数据(您还需要强制编译器使用正确的大小(在本例中为8位)加载和存储指令):

*(volatile uint8_t *)&SPI1->DR = 0x8F;  // write exactly 8 bits to the FIFO
while (!LL_SPI_IsActiveFlag_RXNE(SPI1));
dummy = *(volatile uint8_t *)&SPI-> DR;
*(volatile uint8_t *)&SPI1->DR = 0;  // dummy write
while (!LL_SPI_IsActiveFlag_RXNE(SPI1));
who = *(volatile uint8_t *)&(SPI1->DR);

我不知道使用LL库有什么意义。

代替

while (!LL_SPI_IsActiveFlag_RXNE(SPI1));

使用寄存器

while (!(SPI1 -> SR & SPI_SR_RNE));

您还可以将其包装到函数中:

uint8_t SPI_ReadWrite8(SPI_TypeDef *spi, uint8_t data)
{
    while(!(spi -> SR & SPI_SR_TXE));
    *(volatile uint8_t *)&spi->DR = data; 
    while (!(spi -> SR & SPI_SR_RNE));
    return *(volatile uint8_t *)&spi-> DR;
}

SPI_ReadWrite8(SPI1, 0x8f);
who = SPI_ReadWrite8(SPI1, 0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM