BMA253加速度计芯片ID接收错误
BMA253 Accelerometer Chip Id Receiving Error
我正在使用 4 线 SPI 将 BMA253 加速度计与 STM32 探索板连接起来。我正在使用 CUBEMX HAL 库。第一步,我尝试从传感器寄存器 0x00 读取芯片 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
。而且您不需要任何内部通讯。
我正在使用 4 线 SPI 将 BMA253 加速度计与 STM32 探索板连接起来。我正在使用 CUBEMX HAL 库。第一步,我尝试从传感器寄存器 0x00 读取芯片 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
。而且您不需要任何内部通讯。