реклама на сайте
подробности

 
 
> I2C, HAL. Как считать данные из slave-устройства?, Как отправить повторный старт средствами HAL при чтении данных I2C?
Chip115
сообщение Aug 23 2017, 23:28
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 28-12-07
Пользователь №: 33 709



Всем привет!
Столкнулся с акселерометром FXOS8700. Управляется по I2C. Адрес устройства 0х1E. Контроллер STM32L476.
Проблема с чтением регистра WHOAMI. (ID устройства). Точнее, в целом проблема чтения данных с устройства. Набросал функцию.
В качестве аргумента передаю адрес регистра который намерен считать.
Код
uint8_t FXOS8700_ReadByte (uint8_t ui8reg)
{
    uint8_t ui8byteFromReg;
    HAL_I2C_Master_Transmit (&hi2c3, (0x1E<<1), &ui8reg, 1, 200);
    HAL_I2C_Master_Receive (&hi2c3, ((0x1E<<1)|0x01), &ui8byteFromReg,1, 200);
    return ui8byteFromReg;
}


Как я понял (до этого делов с I2C не имел), для чтения должны придерживаться диаграммы single byte read.
вот вырезка из доки.

Вот тут непонятки. Адрес имеет длину 7 бит. Я так понял, просто так мы его передать не можем? Надо его сдвинуть влево на бит и тогда подсунуть в функцию HAL_I2C_Master_Transmit . Сначала мы передаем устройству адрес+W, получаем от устройсва AK, затем передаем адрес регистра который будем читать (в нашем случае это 0х0D). После этого опять ожидаем AK. За эту часть отвечает HAL_I2C_Master_Transmit.
Затем, (не понял как сгенерить SR) отсылаем адрес + R И после этого ожидаем AK и содержимое регистра 0х0D устройства. Но вот что-то на этом этапе линия данных ложится в нуль, хотя ID != 0. Вот сфотал (по другому не получается) экран с данным от лог. анализатора. При таком подходе, в конце работы ф-ции transmit передается STOP.
Работа функции transmit

Receive

Правильно ли я понял принцип обмена данными с устройством, которое сидит на I2C шине и в чем ошибка?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
golf2109
сообщение Aug 24 2017, 07:36
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 15-04-10
Из: Kiev
Пользователь №: 56 654



адрес устройства 0x1E нельзя изменять вот тут

HAL_I2C_Master_Receive (&hi2c3, ((0x1E<<1)|0x01), &ui8byteFromReg,1, 200);
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016