0

我正在使用 4 线 SPI 将 BMA253 加速度计与 STM32 探索板连接。我正在使用 CUBEMX HAL 库。作为第一步,我试图从传感器寄存器 0x​​00 中读取芯片 ID。应该读取的芯片是 0xFA。在while循环中添加以下代码只是为了验证。由于 SPI 是低电平有效协议,我已将 PIN_2 默认配置为高电平。

uint8_t result = 0;
uint8_t address = 0x00;
while (1)
{
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, &address, 1, 100);
HAL_Delay (100);
HAL_SPI_Receive(&hspi1, &result, 1, 100);
HAL_Delay (100);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
}

由于它处于无限 while 循环中,因此对于前两个循环周期,我在结果中得到 0xFF。然后在接下来的两个循环周期中,我得到了正确的芯片 ID,即 0xFA。然后我在接下来的两个循环周期中得到 0xFF,并且这种模式是无限交替的。

我无法理解为什么我先收到 0xFF 然后再收到 0xFA。

延迟不匹配会不会有问题?我觉得100ms应该没问题。

我也觉得 SPI Receive 的实现不正确。我很担心,因为 SPI Read 是检索加速度数据的重要功能,所以这个功能是关键。

我要求任何人请建议我如何使其完美运行。任何帮助将不胜感激。

提前致谢。

编辑:现在工作 1. 按照 theSealion 的建议将第一位设置为高。2. 此外,我必须根据传感器要求将 SPI 配置中的 CPOL 和 CPHA 配置为模式 0 或模式 3。

4

1 回答 1

1

请尝试以下方法来准备芯片 ID

#define READ_REGISTER 0x80
uint8_t result = 0;
uint8_t address = 0x00 + READ_REGISTER;

while (1)
{
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
    HAL_SPI_Transmit(&hspi1, &address, 1, 100);
    HAL_SPI_Receive(&hspi1, &result, 1, 100);
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);

    HAL_Delay (500);
}

根据数据表,如果要读取寄存器,则命令的 MSB 必须为1. 而且你不需要任何内通信。

于 2020-03-25T08:28:20.180 回答