Easyelectronics.ru

Электроника для всех
Текущее время: 21 ноя 2017, 11:30

Часовой пояс: UTC + 5 часов



    • 10 шт. 2-слоя 100*100mm 2$. Быстрый заказ: JLCPCB.com
    • JLCPCB - это крупнейшая фабрика PCB прототипов в Китае.
    • Имеющий более 290,000 клиентов и выполняющий более 8,000 заказов в день.
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Акселерометр H3LIS200DLTR
СообщениеДобавлено: 30 окт 2017, 02:09 
Здравствуйте!

Зарегистрирован: 30 окт 2017, 01:51
Сообщения: 2
Приветствую, уважаемые форумчане.

Пытаюсь подключить аксель H3LIS200DLTR к микроконтроллеру STM32F446 по SPI.
Удалось считать ID устройства из регистра Who am I сейчас пытаюсь получить данные с оси Х предварительно произвожу инициализацию устройства.
Из регистра отвечающего за ось Х по переменно приходят либо 0х00 либо 0хFF, может быть кто-то сталкивался с данным датчиком или просто имеет опыт работы с подобного рода устройствами

Как я понял значение приходящее с данного датчика имеют размерность 1 байт, но возможно я заблуждаюсь.
GPIO_PIN_15 это чип селект.
Адрес функции чтения А9 соответствует регистру 0х29 с единичкой в старшем бите.

Ниже представлены функции для считывания id (работает), инициализации и чтения данных из регистра 0х29, отвечающего за ось Х
Ещё интересный момент состоит в том, что не получается одновременно записать что-то в регистр а следующим шагом считать значение из него (Пробовал на регистре отвечающим за инициализацию устройства 0х20)

Спасибо всем за помощь!!!)

Код:
void accel_who(void)
{
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      HAL_Delay(100);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
     adress = 0x8F;      
      HAL_SPI_TransmitReceive(&hspi1, &adress, &data, sizeof(data), 0x1000);
     HAL_Delay(100);   
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
}


Код:
void accel_init(void)
{
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
     adress = 0x20;      
     command = 0x37;   
     HAL_SPI_Transmit(&hspi1, &adress, 1, 0x1000);
     HAL_SPI_Transmit(&hspi1, &command, 1, 0x1000);
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
     HAL_Delay(1000);
}



Код:
void accel_read(void)
{

     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
     adress = 0xA9;      
      HAL_SPI_Transmit(&hspi1, &adress, 1, 0x1000);   
     HAL_SPI_Receive(&hspi1, &data_xyz[0], 1, 0x1000);
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Акселерометр H3LIS200DLTR
СообщениеДобавлено: 30 окт 2017, 12:10 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 434
Diman1422 писал(а):
Приветствую, уважаемые форумчане.

Пытаюсь подключить аксель H3LIS200DLTR к микроконтроллеру STM32F446 по SPI.
Удалось считать ID устройства из регистра Who am I сейчас пытаюсь получить данные с оси Х предварительно произвожу инициализацию устройства.
Из регистра отвечающего за ось Х по переменно приходят либо 0х00 либо 0хFF, может быть кто-то сталкивался с данным датчиком или просто имеет опыт работы с подобного рода устройствами

Как я понял значение приходящее с данного датчика имеют размерность 1 байт, но возможно я заблуждаюсь.
GPIO_PIN_15 это чип селект.
Адрес функции чтения А9 соответствует регистру 0х29 с единичкой в старшем бите.

Ниже представлены функции для считывания id (работает), инициализации и чтения данных из регистра 0х29, отвечающего за ось Х
Ещё интересный момент состоит в том, что не получается одновременно записать что-то в регистр а следующим шагом считать значение из него (Пробовал на регистре отвечающим за инициализацию устройства 0х20)

Спасибо всем за помощь!!!)

Код:
void accel_who(void)
{
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      HAL_Delay(100);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
     adress = 0x8F;      
      HAL_SPI_TransmitReceive(&hspi1, &adress, &data, sizeof(data), 0x1000);
     HAL_Delay(100);   
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
}


Код:
void accel_init(void)
{
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
     adress = 0x20;      
     command = 0x37;   
     HAL_SPI_Transmit(&hspi1, &adress, 1, 0x1000);
     HAL_SPI_Transmit(&hspi1, &command, 1, 0x1000);
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
     HAL_Delay(1000);
}



Код:
void accel_read(void)
{

     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
     adress = 0xA9;      
      HAL_SPI_Transmit(&hspi1, &adress, 1, 0x1000);   
     HAL_SPI_Receive(&hspi1, &data_xyz[0], 1, 0x1000);
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      
}


Попробуй использовать ф-цию TransmitReceive В HAL была какая-то странная ошибка в коде для SPI. К сожалению точно не помню в какой ф-ции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Акселерометр H3LIS200DLTR
СообщениеДобавлено: 30 окт 2017, 12:11 
Заглядывает иногда

Зарегистрирован: 03 мар 2013, 11:01
Сообщения: 190
Diman1422 писал(а):
...Пытаюсь подключить аксель H3LIS200DLTR к микроконтроллеру STM32F446 по SPI.
Удалось считать ID устройства из регистра Who am I сейчас пытаюсь получить данные с оси Х предварительно произвожу инициализацию устройства...

Неверна методика НИР с таким девайсом.
1. Необходимо проверить и перепроверить характеристики акселерометра без "накладок" со стороны программы микроконтроллера и, возможно, самого микроконтроллера из-за его сложности;
2. Программа должна быть на Ассемблере с минимально возможными задержками между циклами считывания данных с осей X и Y - в идеале это считывание должно происходить одновременно...
В противном случае, результат Вашего труда будет интересен только Вам...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Акселерометр H3LIS200DLTR
СообщениеДобавлено: 01 ноя 2017, 00:23 
Здравствуйте!

Зарегистрирован: 30 окт 2017, 01:51
Сообщения: 2
kos писал(а):
Diman1422 писал(а):
Приветствую, уважаемые форумчане.

Пытаюсь подключить аксель H3LIS200DLTR к микроконтроллеру STM32F446 по SPI.
Удалось считать ID устройства из регистра Who am I сейчас пытаюсь получить данные с оси Х предварительно произвожу инициализацию устройства.
Из регистра отвечающего за ось Х по переменно приходят либо 0х00 либо 0хFF, может быть кто-то сталкивался с данным датчиком или просто имеет опыт работы с подобного рода устройствами

Как я понял значение приходящее с данного датчика имеют размерность 1 байт, но возможно я заблуждаюсь.
GPIO_PIN_15 это чип селект.
Адрес функции чтения А9 соответствует регистру 0х29 с единичкой в старшем бите.

Ниже представлены функции для считывания id (работает), инициализации и чтения данных из регистра 0х29, отвечающего за ось Х
Ещё интересный момент состоит в том, что не получается одновременно записать что-то в регистр а следующим шагом считать значение из него (Пробовал на регистре отвечающим за инициализацию устройства 0х20)

Спасибо всем за помощь!!!)

Код:
void accel_who(void)
{
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      HAL_Delay(100);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
     adress = 0x8F;      
      HAL_SPI_TransmitReceive(&hspi1, &adress, &data, sizeof(data), 0x1000);
     HAL_Delay(100);   
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
}


Код:
void accel_init(void)
{
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
     adress = 0x20;      
     command = 0x37;   
     HAL_SPI_Transmit(&hspi1, &adress, 1, 0x1000);
     HAL_SPI_Transmit(&hspi1, &command, 1, 0x1000);
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
     HAL_Delay(1000);
}



Код:
void accel_read(void)
{

     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_RESET);
     adress = 0xA9;      
      HAL_SPI_Transmit(&hspi1, &adress, 1, 0x1000);   
     HAL_SPI_Receive(&hspi1, &data_xyz[0], 1, 0x1000);
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_15, GPIO_PIN_SET);
      
}


Попробуй использовать ф-цию TransmitReceive В HAL была какая-то странная ошибка в коде для SPI. К сожалению точно не помню в какой ф-ции.




Спасибо за совет действительно с помощью данной функции получилось снять данные с одной оси, но когда пытаюсь читать 3 регистра (X,Y,Z) в переменные записываются одинаковые значения, хотя читаю я с разных адресов, не пойму то ли баг дебагера кеиловского то ли я что-то не правильно делаю.
Чип селектом вроде рулю после каждого цикла чтения, а что ещё для SPI надо?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: lomy


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB