BMA253 Ошибка получения идентификатора микросхемы акселерометра

Я подключаю акселерометр BMA253 к плате обнаружения STM32, используя 4-проводной SPI. Я использую библиотеку CUBEMX HAL. В качестве первого шага я пытаюсь прочитать идентификатор ЧИПа из регистра датчика 0x00. Считываемый чип - 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. Затем в следующих двух циклах цикла я получаю правильный идентификатор чипа, равный 0xFA. Затем я получаю 0xFF в следующих двух циклах цикла, и этот шаблон чередуется бесконечно.

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

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

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

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

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

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


person TECHKEY    schedule 25.03.2020    source источник


Ответы (1)


Пожалуйста, попробуйте следующее, чтобы подготовить Chip 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);
}

Согласно таблице данных, если вы хотите прочитать регистр, старший бит команды должен быть 1. И вам ничего не нужно в общении.

person theSealion    schedule 25.03.2020
comment
Большое спасибо за ваше предложение. Я только что реализовал то же, что вы рекомендуете. Теперь переключение значения в результате остановлено. Но он просто показывает 0xFF вместо 0xFA. Не могли бы вы предложить какие-то материалы? - person TECHKEY; 25.03.2020
comment
Не могли бы вы добавить проверку результатов вызовов HAL_SPI_. И (раз уж у вас есть прицел) посмотреть на шину и добавить картинку из сообщения? - person theSealion; 25.03.2020
comment
Вы правы! Я добавил бит READ_REGISTER. Кроме того, мне пришлось настроить CPOL и CPHA на основе датчика, чтобы он заработал. Спасибо theSealion - person TECHKEY; 02.04.2020