Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа акселерометра LIS3DH с STM32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
AlexeyK
Написал прогу для инициализации и считывания данных с LIS3DH. Со значениями творится полная ерунда. На одно истинное значение приходится 1-5 ложных (лежащих в пределах -200 до 300). Если данные визуализировать, получается дёрганная кривая. Прерывания не использовал. В чём может быть проблема?

Код Нажмите для просмотра прикрепленного файла
Нажмите для просмотра прикрепленного файла
stas00n
L и Н регистры не перепутаны часом?
AlexeyK
stas00n, Поменял, стало ещё хуже.
Текущие значения близки к правде, но я совсем не понимаю почему кривая скачет.
smalcom
вы неправильно про работу SPI прочитали

Код
    /// \fn uint8_t RW(const uint8_t pData)
    /// Запись-чтение данных.
    /// Данная функция записывает значение в буфер отправки SPI. По окончанию
    /// отправки возвращает значение принятое по SPI.
    /// \param pData - значение отправляемое по SPI.
    /// \return значение принятое по SPI.
    uint8_t RW(const uint8_t pData)
    {
        SPI_I2S_SendData(mSPI, pData);
        while(SPI_I2S_GetFlagStatus(mSPI, SPI_I2S_FLAG_RXNE) == RESET);

        return SPI_I2S_ReceiveData(mSPI);
    }
AlexeyK
smalcom Обоснуйте почему я неправильно с SPI работаю.
На всякий случай попробовал вариант с флагом SPI_I2S_FLAG_RXNE, но это не поменяло абсолютно ничего.
veteq
Наверное косяк с L и H, я помню что они там хитро расчитываются, и вроде бы даже косяк в даташите был... Такая тема уже была на форуме
Upd: там не должно быть нолей в плоскости паралелльной к земле должно быть 1g
AlexeyK
veteq Не нашёл я тему где бы обсуждалась моя проблема, буду признателен если дадите ссылку.
По поводу оси Z понятно, но не понятно это Нажмите для просмотра прикрепленного файла Притяжение земли явно просматривается, но по непонятным причинам появляются левые значение которые лежат около нуля как в большую так и в меньшую сторону.

По поводу L и H вроде всё понятно и самое главное что оно работает кое как, значит косяк, как мне кажется, не в этом.
smalcom
Цитата
Обоснуйте почему я неправильно с SPI работаю.

Эммм. У меня хорошее настроение, подсказка 50 на 50 ))

Как вы записываете
Код
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
return SPI_I2S_ReceiveData(SPI1);


Как надо
Код
SPI_I2S_SendData(mSPI, pData);
while(SPI_I2S_GetFlagStatus(mSPI, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(mSPI);


Ещё осталась "звонок другу"(цитата из даташита) )) и "помошь зала"(разжовка цитаты из даташита)

зы. ванга подсказывает, что у вас нет логического анализатора
AlexeyK
smalcom Как я писал выше, я пробовал ваш вариант и он не помог.
smalcom
получилось что-то?
AlexeyK
Пока нет. Сейчас буду пробовать настраивать работу по прерыванию и включу фильтр.
veteq
Для начала попробовать проверить работу SPI, постоянно вычитывая WHO_AM_I - 0x0F

У меня на пинах 5,6,7 подтяжка на землю стоит, и SPI SPI_CPHA_1Edge и SPI_CPOL_Low

CODE

signed short value;
unsigned char *valueL = (unsigned char *) (&value);
unsigned char *valueH = ((unsigned char *) (&value) + 1);

*valueL = SPI.CommandReceived[5];
*valueH = SPI.CommandReceived[6];

if ((value & (1 << 15)) != 0) {
MEMS.Z = (value >> 4) | 0xF000;
}
else {
MEMS.Z = value >> 4;
}

Aner
LIS3DH сами паяли или готовый модуль использовали? Если паяли сами, как получится, то могли термо перекос обеспечить. Было уменя такое при первых экспериментах. Графики похожие, как у вас тогда получились.
AlexeyK
veteq SPI работает корректно. WHO_AM_I возвращает значение 3F. B И данные из акселерометра приходят правильные, явно видно когда я перемещаю микросхему, только вот непонятно откуда берутся бредовые данные. Думал может в регистрах данные не успевают обновится, но когда увеличивал скорость обновления данных в акселерометре ситуацию это не меняло.

Aner, Микруха эта установлена на отладочной плате stmf4 Discovery. По поводу микросхемы могу точно сказать что она рабочая, проверял её с другой прошивкой мк. Также просил друга на своей плате погонять, у него тоже самое происходит. Проблема однозначно в коде, а вот какая понять не могу.
veteq
Как вариант попробовать еще в отладчике пошагать по кольцу функциям передачи по SPI , а то ощущение создается что SPI как-то не так работает

вот по этим функциям пройтись отладчиком, каждый шаг и постоянно,(т.е. на каждую функцию будет уходить около секунды) будут ли всплывать нули?

while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
SPI_I2S_SendData(SPI1, data);
while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);
return SPI_I2S_ReceiveData(SPI1);
Golikov A.
а корректно по флагу занято определять готовности SPI принять очередной байт?
AlexeyK
Проблема решена. Ошибка была достаточно скользкой. Тип переменной старших и младших байт должен быть uint8_t вместо int8_t.
PeterBr
Пример кода работы с Акселерометром STM32. Работа с акселерометром
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.