Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Нет ответа от ADXL345
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Метрология, датчики, измерительная техника
Sanchello
Добрый день. Решил освоить акселерометр ADXL345

подключил 1 и 6 ноги на +2.5в
ноги 2, 4 и 5 к GND
подал питание.
надеялся что без конфигурации датчика по умолчанию сработают прерывания от перемещения датчика. Но на линиях int, int2 нуль.

Если кто то работал с данным датчиком, подскажите пожалуйста, надо ли проводить инициализацию датчика или нет для выдачи прерываний?
Спасибо
ilya-m
1. Вы забыли подключить вывод 10 на GND (или не указали это в Вашем сообщении);
2. При подаче питания регистр 0x2D POWER_CTL содержит 0x00 (см. Таблицу 12, стр. 13 Datasheet), следовательно бит MEASURE=0 - датчик находится в Standby Mode, а не в режиме измерения. Подробное описание Standby Mode см на стр.8 Datasheet.
3. Включить режим измерения можно только загрузкой требуемых значений в соответствующие регистры.
4. Кроме того, при подаче питания 0x2E INT_ENABLE содержит 0x00 (см. Таблицу 12, стр. 13 Datasheet), следовательно генерация прерываний запрещена, для настройки прерваний так же требуется соответствующим образом загрузить регистр INT_ENABLE.
Sanchello
Цитата(ilya-m @ May 17 2011, 18:56) *
1. Вы забыли подключить вывод 10 на GND (или не указали это в Вашем сообщении);
2. При подаче питания регистр 0x2D POWER_CTL содержит 0x00 (см. Таблицу 12, стр. 13 Datasheet), следовательно бит MEASURE=0 - датчик находится в Standby Mode, а не в режиме измерения. Подробное описание Standby Mode см на стр.8 Datasheet.
3. Включить режим измерения можно только загрузкой требуемых значений в соответствующие регистры.
4. Кроме того, при подаче питания 0x2E INT_ENABLE содержит 0x00 (см. Таблицу 12, стр. 13 Datasheet), следовательно генерация прерываний запрещена, для настройки прерваний так же требуется соответствующим образом загрузить регистр INT_ENABLE.

спасибо за информацию.
подозревал подобное )-: когда читал описание регистров.

Буду осваивать 2313 по части реализации SPI для управления датчиком
Sanchello
Пытаюсь общатсья с adxl
Не могу уловить назначение бита мультипл байт который ставиться в посылку адреса.
Кто либо мог бы пролить свет на это тёмное для меня пятно?

При необходимости скинуть могу код и фото диаграмм обмена.

Пробую считать дивайс айди. При первых 8 клоках кстати не зависимо от команды всегда на SDO выдаётся девайди.
Если первая команда чтения , то в следующиее 8 клоков за адресом выдаётся данные регистра. Считываю те в котоых по дефаулту есть какое то валеу отличное от нуля. А вот при последующий транзакциях "ч/з+мульт.байт+адрес регситра(8 клоков) (8 клоков)" выдаётся нуль.

Непонятная логика работы мульт.байт. И как чипселект влияет на передачу. Пок адля меня загадка. )-:
ilya-m
Бит Multi-Byte предназначен для выполнения конвейерных операций чтения/записи, то есть в команде Вы указываете адрес первого байта, с которым будете производить действие чтения/записи, вслед за посылкой команды продолжаете тактировать ADXL по линии CLK за первые 8-мь тактов выполняется выбранное действие с регистром, адрес которого Вы указали в команде, затем ADXL выполняет автоинкремент адреса и за каждые следующие 8 тактов выполняет аналогичное действие (запись или чтение) с регистром по вычисленному адресу. Действие команды завершается переводом CS в высокое состояние.
Sanchello
Тоесть при выставленном адресе с флагом мультипл байт при чтении из регистра 0х00, в первый раз выдаётся значение регистра (девайди), а при следующих 8 клоках и не выставленным чипселектом (тобишь он всё ещё в нуле) выдаётся содержимое 0х01 и тд.
Касательно записи тоже самое.

Я правильно понял?
ilya-m
Цитата(Sanchello @ Jun 23 2011, 13:49) *
Тоесть при выставленном адресе с флагом мультипл байт при чтении из регистра 0х00, в первый раз выдаётся значение регистра (девайди), а при следующих 8 клоках и не выставленным чипселектом (тобишь он всё ещё в нуле) выдаётся содержимое 0х01 и тд.
Касательно записи тоже самое.

Я правильно понял?


Да, именно так.
Sanchello
Как то не понятно работает моя прошивка.
Код для передачи 1 байта по SPI:
Код
SPITransfer:
    out  USIDR, temp
    ldi  temp, (1<<USIOIF)
    out  USISR, temp
    ldi  temp, (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)

SPITransfer_loop:
    out  USICR, temp
    sbis  USISR, USIOIF
    rjmp  SPITransfer_loop

    in   temp, USIDR
    ret


Читаю так:
Код
rcall CSLow

ldi temp, 0x00
ori temp, 0b10000000
rcall SPITransfer

rcall SPITransfer

rcall CSHigh


В ответ должно прийти DevID. Но когда шлю одну и туже команду несколько раз то датчик перестаёт понимать команды.
В понедельник выложу полный код с скринами времянок.

ilya-m, Вы бы могли посказать по коду. Может сама процедура передачи не корректная? Или дать рабочий примерчик. С Вами можно связаться по icq или email? Через личку мне пока нельзя писать.
Sanchello
Получается считать по очереди 3 регистра в которых есть информация отличная от нуля после подачи питания
Код
;-- 1.0 -----------------------------------------------------
rcall CSLow
ldi temp, 0x2c
ori temp, 0b11000000
rcall SPITransfer
ldi temp, 0x00
rcall SPITransfer
rcall CSHigh
;-- 1.1 -----------------------------------------------------
rcall CSLow
ldi temp, 0x00
ori temp, 0b11000000
rcall SPITransfer
ldi temp, 0x00
rcall SPITransfer
rcall CSHigh
;-- 1.2 -----------------------------------------------------
rcall CSLow
ldi temp, 0x30
ori temp, 0b11000000
rcall SPITransfer
ldi temp, 0x00
rcall SPITransfer
rcall CSHigh



сигналы МК
1 CLK
2 DataO
3 DataIn
4 CS

0x2C 00001010 Data rate and power mode control
0x00 11100101 Device ID
0x30 00000010 Source of interrupts

считывается корректно если я выставляю при чтении мультипл байт. Если выставлю МБ в нуль то достоверных данных нет.

Пытаюсь проделать чтение-запись-чтение
беру регистр: 0x2A 00000000 Axis control for tap/double tap.
по умолчанию в нём нуль.

Код
;-- 1.3 -----------------------------------------------------
rcall CSLow
ldi temp, 0x2a
ori temp, 0b11000000
rcall SPITransfer
ldi temp, 0x00
rcall SPITransfer
rcall CSHigh
;-- 1.4 ----------------------------------------------------- запись в 0x2a значения 0x01
rcall CSLow
ldi temp, 0x2a
ori temp, 0b01000000
rcall SPITransfer
ldi temp, 0x01
rcall SPITransfer
rcall CSHigh
;-- 1.5 -----------------------------------------------------
rcall CSLow
ldi temp, 0x2a
ori temp, 0b11000000
rcall SPITransfer
ldi temp, 0x00
rcall SPITransfer
rcall CSHigh


при такой процедуре на линии DataIn всегда нуль. Хотя пишу единичку в младшем разряде.
регистр доступен для чтения и записи.
руки опускаются )-:
ilya-m
Мой Скайп login - ilya-1m; ICQ: 414241764.
Толян 21
Как успехи с spi? Не могу с этим датчиком по spi вообще ничего сделать. Даже deviceid считать не получается выдает FF. Пробовал законектится по i2c как только подтягивающие резисторы припаял датчик отозвался. По spi никак. Тщательно изучил даташит настроил spi как надо. Не отвечает и все. Пробовал перевести в режим трехпроводного spi тоже самое только ответ 00
Толян 21
Видимо чип плохо припаян был. Так или иначе сегодня отвечает нормально. Вот что удалось выяснить
1. После подачи питания датчик находиться в режиме сна, чтобы его разбудить нужно отправить команду 0x2D 0x08 (запись в регистр 2D значения 08).
Данные ускорения на примере оси Х
по умолчания после запуска диапазон +-2g разрешение 10бит
в 0x32 младшие 8 байт
в 0x33 старшие 8 байт (2 младших значащие)
учтите значение -10 будет выглядеть как
в 0x32 =F6
в 0x33 =FF
значение 10 будет выглядеть как
в 0x32 =10
в 0x33 =00
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.