WinAVR ADXL345 нет изменений в регистрах DATAxN

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

WinAVR ADXL345 нет изменений в регистрах DATAxN

Сообщение Alex_Jet » 22 янв 2016, 14:14

Имею ADXL345, подключенный по SPI (Mode 3) к ATmega2560 (Arduino Mega). MISO подключен напрямую к SDO, остальные выводы (MOSI, SCK, CS) через диоды - на ADXL345 получаются уровни 3.3В/0.6В (Лог.1/Лог.0). Данные записываю в регистры ADXL345, считываю их. Инициализацию провожу следующим образом:
Код: Выделить всё
//Initialization of ADXL345
ADXL345_SPIWrite_Byte(DATA_FORMAT, 0);          //SPI 4-wire
ADXL345_SPIWrite_Byte(POWER_CTL, 0);            //ADXL345 is off
ADXL345_SPIWrite_Byte(POWER_CTL, 8);            //ADXL345 is measure
ADXL345_SPIWrite_Byte(DATA_FORMAT, 0);          //ADXL345 resolution 2g


Значения ускорения по осям определяю так:
Код: Выделить всё
//Read DATAxx-register of ADXL345
for(y=0; y < 6; y++) ADXL345_Data_Array[y] = ADXL345_SPIRead_Byte(DATAX0 + y);
AxisX += ((signed int)ADXL345_Data_Array[1] << 8) | ADXL345_Data_Array[0];
AxisY += ((signed int)ADXL345_Data_Array[3] << 8) | ADXL345_Data_Array[2];
AxisZ += ((signed int)ADXL345_Data_Array[5] << 8) | ADXL345_Data_Array[4];


Проблема: при считывании регистров DATAX0 - DATAY1 значения AxisX = AxisY = AxisZ = 511 всегда! В чем может быть дело?
Alex_Jet
 
Сообщения: 52
Зарегистрирован: 24 фев 2010, 20:58
Откуда: Томск

Re: WinAVR ADXL345 нет изменений в регистрах DATAxN

Сообщение Dmitry__ » 22 янв 2016, 14:51

Если 511 набрать на калькуляторе, а потом перевести калькулятор в hex режим, то можно заметить, что 511 = 1ff, а если потом перевести калькулятор в двоичный формат, то получится = 111111111. Что говорит о том, что по spi считывается всегда высокий уровень. Инспектируйте схему...
Я не сложно обьяснил? :)
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: WinAVR ADXL345 нет изменений в регистрах DATAxN

Сообщение Alex_Jet » 22 янв 2016, 14:58

Для таких очевидных ответов я специально написал, что успешно записываю регистры и считываю с них данные! Например, если считываю DEVID, то получаю 229 или E5 hex, или 345 octal.
Пробовал включить FIFO в режим Stream (запись в FIFO_CTL 128 или 0x80), но с DATA результат тот же. При чтении FIFO_STATUS (D5-D0) результат по кругу 8,9,10,8,9,10...

Коллега пробовал поднять ADXL по I2C ардуиновскими скетчами. Сказал, что перепробовал 3 разных скетча, но значения с DATA ни в одной версии не изменялись. При этом регистры ADXL читаются!!! значит он жив! Как будто что-то не проинициализировано... может с таким кто-то сталкивался? Второй модуль ADXL придет не скоро, а без его работы нет смысла дальше двигаться.
Alex_Jet
 
Сообщения: 52
Зарегистрирован: 24 фев 2010, 20:58
Откуда: Томск

Re: WinAVR ADXL345 нет изменений в регистрах DATAxN

Сообщение Dmitry__ » 22 янв 2016, 16:35

Alex_Jet писал(а):Для таких очевидных ответов я специально написал, что успешно записываю регистры и считываю с них данные!

С восклицательным знаком, да, понятнее, но для меня все равно неочевидно. А так как было написано в первом сообщеннии:
Alex_Jet писал(а):Данные записываю в регистры ADXL345, считываю их.

Еще менее очевидно :roll: Чего ты там считываешь - hz.
Из твоего описания и коротких отрывков программы, понять что-либо сложно. Например:
Alex_Jet писал(а): остальные выводы (MOSI, SCK, CS) через диоды - на ADXL345 получаются уровни 3.3В/0.6В (Лог.1/Лог.0)

Какие диоды, как подключено, есть/нет подтягивающие резисторы - hz. Щаз позовем бригадира телепатов...
CS-то хоть дергается при работе с ADXL345? Кто им управляет?
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: WinAVR ADXL345 нет изменений в регистрах DATAxN

Сообщение Alex_Jet » 22 янв 2016, 16:54

Я конечно понимаю, что здесь много ламеров, но все же я написал что работаю в WinAVR, что уровни лог.1 = 3.3В, а лог.0 = 0.6В при подключении ADXL к МК через диоды (раз уровни такие, то явно подтягивающие есть). Кроме этого, я написал:
Данные записываю в регистры ADXL345, считываю их.

То есть у меня есть реальное подтверждение того что я могу что-то записать и что-то считать с регистров ADXL. А также:
Например, если считываю DEVID, то получаю 229 или E5 hex, или 345 octal.

Если бы Вы знали ADXL345 или залезли в его даташит, то увидели бы что в регистре DEVID должно быть именно такое значение.

На основании всего этого считаю можно было сделать вывод что я не ламер, умею кодить, пользоваться осциллографом. И, соответственно, CS прижимается к земле при SPI трансфере.
Alex_Jet
 
Сообщения: 52
Зарегистрирован: 24 фев 2010, 20:58
Откуда: Томск

Re: WinAVR ADXL345 нет изменений в регистрах DATAxN

Сообщение Dmitry__ » 22 янв 2016, 16:59

Alex_Jet писал(а):Поэтому считаю можно было сделать вывод что я не ламер, умею кодить,

Да ладна? А такая конструкция тебя не пугает?:
Код: Выделить всё
AxisX += ((signed int)ADXL345_Data_Array[1] << 8) | ADXL345_Data_Array[0];

(signed int) относится только к старшему байту :wink:
Аватара пользователя
Dmitry__
 
Сообщения: 8033
Зарегистрирован: 13 янв 2011, 15:25
Откуда: Санкт-Петербург

Re: WinAVR ADXL345 нет изменений в регистрах DATAxN

Сообщение Alex_Jet » 22 янв 2016, 19:13

Вам лишь бы написать какие-нибудь очевидные вещи? А ничего что Axis инициализированы в начале функции как:
Код: Выделить всё
volatile signed int   AxisX,AxisY,AxisZ;   //Ускорения по осям
Alex_Jet
 
Сообщения: 52
Зарегистрирован: 24 фев 2010, 20:58
Откуда: Томск

Re: WinAVR ADXL345 нет изменений в регистрах DATAxN

Сообщение Alex_Jet » 26 янв 2016, 10:20

Написал в support AD, топик прошел модерацию, жду какого-нибудь ответа. Также жду второй китайский модуль ADXL345 для дальнейших тестов.
Alex_Jet
 
Сообщения: 52
Зарегистрирован: 24 фев 2010, 20:58
Откуда: Томск

Re: WinAVR ADXL345 нет изменений в регистрах DATAxN

Сообщение Alex_Jet » 01 фев 2016, 13:33

Support AD порекомендовал сделать следующее:
After power on, you can write 0x0B to register DATA_FORMAT and 0x08 to POWER_CTL. Then the part will start to work normally. Please pay attention to turn-on time, after put the part in measurement mode, you need to wait 1/ODR + 1.1ms, this is shown on page 5 of ADXL345 datasheet. Eg: ODR = 100Hz, then you need to wait 11.1ms, then read the output from ADXL345 or you can ignore the first two sample sets from ADXL345.
Another one is the multi-byte read, burst read/mutiply read is recommended. You can monitor the timing with OSC and compare it with figure 37-39, on page 16 of datasheet.


После записи 0x0B в DATA_FORMAT и 0x08 в POWER_CTL значения при чтении дата-регистров поменялись, однако их изменений не происходит (даже "цифрового" шума нет) - DATAX0 = 254 (dec), DATAX1 = 15 (dec)! При этом уточняю, что чтение ADXL345 происходит по установке соответствующего флага в 1. Первое чтение дата-регистров происходит через 1 секунду после инициализации акселерометра.
Alex_Jet
 
Сообщения: 52
Зарегистрирован: 24 фев 2010, 20:58
Откуда: Томск

Re: WinAVR ADXL345 нет изменений в регистрах DATAxN

Сообщение Alex_Jet » 01 мар 2016, 16:05

Проблема решилась путем замены на такой же новый модуль. Новый модуль выдает все необходимые показания как заявлено в даташите. Вероятно что-то где-то подгорело в ADXL345, либо он был бракованным, поскольку регистры и записывались как надо и читались - кроме DATAxn.
Alex_Jet
 
Сообщения: 52
Зарегистрирован: 24 фев 2010, 20:58
Откуда: Томск


Вернуться в Микроконтроллеры

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18