BMA253加速度计芯片ID接收错误

BMA253 Accelerometer Chip Id Receiving Error

我正在使用 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. 听从海狮的建议,将第一个位设置为高位。 2. 此外,我必须根据传感器要求将 SPI 配置中的 CPOL 和 CPHA 配置为模式 0 或模式 3。

请尝试以下方法准备芯片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);
}

根据datasheet,如果要读取一个寄存器,命令的MSB必须是1。而且您不需要任何内部通讯。