Ошибка получения чипа акселерометра BMA253 - PullRequest
0 голосов
/ 25 марта 2020

Я подключаю акселерометр BMA253 к плате обнаружения STM32, используя 4-проводный SPI. Я использую библиотеку CUBEMX HAL. В качестве первого шага я пытаюсь прочитать CHIP ID из регистра датчика 0x00. Чип, который должен быть прочитан, является 0xFA. Следующий код добавляется в пока l oop только для проверки. Поскольку 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);
}

Поскольку оно находится в бесконечности, в то время как l oop, для первых двух циклов l oop я получаю 0xFF в результате. Затем в следующие два l oop цикла я получаю правильный идентификатор чипа, равный 0xFA. Затем я получаю 0xFF в следующие два l oop цикла, и этот паттерн чередуется бесконечно.

Я не могу понять, почему я сначала получаю 0xFF, а затем 0xFA.

Может ли быть проблема с несоответствием задержки? Я чувствую, что 100 мс должно быть в порядке.

Я также чувствую, что получение SPI выполняется неправильно. Я волнуюсь, потому что чтение SPI является важной функцией при получении данных ускорения, поэтому эта функция является ключевой.

Я прошу любого, пожалуйста, подскажите мне, что нужно сделать, чтобы он работал идеально. Любая помощь будет принята с благодарностью.

Заранее спасибо.

РЕДАКТИРОВАТЬ: РАБОТАЕТ СЕЙЧАС 1. Следовали предложению Sealion, чтобы установить первый бит высокого уровня. 2. Кроме того, мне пришлось настроить CPOL и CPHA в конфигурации SPI на режим 0 или 3 в соответствии с требованиями датчика.

1 Ответ

1 голос
/ 25 марта 2020

Пожалуйста, попробуйте следующее, чтобы подготовить 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. И вам не нужно ничего в общении.

...