AlexeyK
Aug 4 2015, 14:04
Написал прогу для инициализации и считывания данных с LIS3DH. Со значениями творится полная ерунда. На одно истинное значение приходится 1-5 ложных (лежащих в пределах -200 до 300). Если данные визуализировать, получается дёрганная кривая. Прерывания не использовал. В чём может быть проблема?
Код
Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла
stas00n
Aug 4 2015, 17:09
L и Н регистры не перепутаны часом?
AlexeyK
Aug 4 2015, 17:28
stas00n, Поменял, стало ещё хуже.
Текущие значения близки к правде, но я совсем не понимаю почему кривая скачет.
smalcom
Aug 4 2015, 18:31
вы неправильно про работу 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
Aug 4 2015, 18:58
smalcom Обоснуйте почему я неправильно с SPI работаю.
На всякий случай попробовал вариант с флагом SPI_I2S_FLAG_RXNE, но это не поменяло абсолютно ничего.
Наверное косяк с L и H, я помню что они там хитро расчитываются, и вроде бы даже косяк в даташите был... Такая тема уже была на форуме
Upd: там не должно быть нолей в плоскости паралелльной к земле должно быть 1g
AlexeyK
Aug 4 2015, 20:27
veteq Не нашёл я тему где бы обсуждалась моя проблема, буду признателен если дадите ссылку.
По поводу оси Z понятно, но не понятно это
Нажмите для просмотра прикрепленного файла Притяжение земли явно просматривается, но по непонятным причинам появляются левые значение которые лежат около нуля как в большую так и в меньшую сторону.
По поводу L и H вроде всё понятно и самое главное что оно работает кое как, значит косяк, как мне кажется, не в этом.
smalcom
Aug 4 2015, 20:53
Цитата
Обоснуйте почему я неправильно с 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
Aug 4 2015, 21:08
smalcom Как я писал выше, я пробовал ваш вариант и он не помог.
smalcom
Aug 5 2015, 09:32
получилось что-то?
AlexeyK
Aug 5 2015, 12:17
Пока нет. Сейчас буду пробовать настраивать работу по прерыванию и включу фильтр.
Для начала попробовать проверить работу 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;
}
LIS3DH сами паяли или готовый модуль использовали? Если паяли сами, как получится, то могли термо перекос обеспечить. Было уменя такое при первых экспериментах. Графики похожие, как у вас тогда получились.
AlexeyK
Aug 5 2015, 17:49
veteq SPI работает корректно. WHO_AM_I возвращает значение 3F. B И данные из акселерометра приходят правильные, явно видно когда я перемещаю микросхему, только вот непонятно откуда берутся бредовые данные. Думал может в регистрах данные не успевают обновится, но когда увеличивал скорость обновления данных в акселерометре ситуацию это не меняло.
Aner, Микруха эта установлена на отладочной плате stmf4 Discovery. По поводу микросхемы могу точно сказать что она рабочая, проверял её с другой прошивкой мк. Также просил друга на своей плате погонять, у него тоже самое происходит. Проблема однозначно в коде, а вот какая понять не могу.
Как вариант попробовать еще в отладчике пошагать по кольцу функциям передачи по 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.
Aug 6 2015, 13:02
а корректно по флагу занято определять готовности SPI принять очередной байт?
AlexeyK
Aug 9 2015, 09:12
Проблема решена. Ошибка была достаточно скользкой. Тип переменной старших и младших байт должен быть uint8_t вместо int8_t.
PeterBr
Apr 8 2016, 00:45
Пример кода работы с Акселерометром
STM32. Работа с акселерометром
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.