Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
8 / 7 / 3
Регистрация: 24.11.2014
Сообщений: 111

Чтение регистров на HAL по I2C

28.11.2021, 14:56. Показов 2111. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех!

Подскажите, пожалуйста, так правильно читать регистры другой мс, подключенной по I2C?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    int16_t val = 0;
    uint8_t buf[50];
    uint8_t buf2[2];
    
    static const uint8_t MP_ADDR = 0x20 << 1; // Address of MC (I2C)
    static const uint8_t MP_REG_TEMP = 0xBF;  // BFh = VENDOR_ID_PRODUCT_ID -> read 2-byte
 
 
    result = HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(MP_ADDR), 2, HAL_MAX_DELAY);
    
    if (result == HAL_OK)
    {
        
        buf[0] = MP_REG_TEMP;
        result = HAL_I2C_Master_Transmit(&hi2c1, MP_ADDR, buf, 1, HAL_MAX_DELAY);  // Запрос регистра
        if (result == HAL_OK)
        {
            result = HAL_I2C_Master_Receive(&hi2c1, MP_ADDR, buf2, 2, HAL_MAX_DELAY);  // Получение данных
            if (result == HAL_OK)
            {
                val = (int8_t)buf2[2];
 
 
                sprintf((char*)buf, "%u \r\n", (int8_t)val);
 
 
                HAL_UART_Transmit(&huart1, buf, strlen((char*)buf), HAL_MAX_DELAY);     // Вывод принятого
                HAL_Delay(500);
 
            } else {
                strcpy((char*)buf, "Receive Error!\r\n");
                HAL_UART_Transmit(&huart1, buf, strlen((char*)buf), HAL_MAX_DELAY);
                HAL_Delay(500);
            }
        }
    }
И если регистр 16-битный, а по I2C за раз читается по 1 байту, то как нужно читать 2-х байтный регистр?


Спасибо.
Миниатюры
Чтение регистров на HAL по I2C  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.11.2021, 14:56
Ответы с готовыми решениями:

I2C, HAL, запись и чтение GT811
Привет! Столкнулся с такой вот досадной проблемой, предполагаю, что она решается довольно легко, просто я не вижу или не так понимаю чего...

MLX90614 + STM32 i2c hal
Доброго времени суток. Возникла загвоздка в попытке оживить ИК термодатчик MLX90614 по y2s. Проект генерировал в Cube, работаю в...

STM32F1 HAL LCD1602 I2C готово
Здравствуйте! Реализовал библиотеку, т.к. в инете таковой не нашел работает в принципе все (не стал реализовывать только чтение с...

7
 Аватар для GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 331
11.12.2021, 19:22
Просто, прочитать первый байт, в затем вычитать второй. Или я не очень понял, что Вы хотели сказать.
0
8 / 7 / 3
Регистрация: 24.11.2014
Сообщений: 111
11.12.2021, 22:22  [ТС]
GaFBich, так в этом и вопрос: как указать что сейчас я читаю первый байт (из двух), а следующей командой буду читать второй байт?
0
Почетный модератор
 Аватар для Humanoid
11559 / 4353 / 453
Регистрация: 12.06.2008
Сообщений: 12,455
12.12.2021, 10:31
Чем вас не устраивает текущий подход? Вы же сейчас вычитываете 2 байта. Только вы их потом игнорируете, а обращаетесь зачем-то за пределы массива "val = (int8_t)buf2[2]" (у вас массив всего состоит из 2 элементов, значит старшая часть регистра в buf2[0], а младшая в buf2[1]... элемента buf2[2] вообще не существует у этой переменной).

Добавлено через 6 минут
Кстати, рекомендую включить в компиляторе опцию "-Wall" и всегда смотреть, какие предупреждения он выводит (и, конечно, исправлять их). Эти предупреждения позволили бы вам сэкономить кучу времени при поиске решения данной проблемы.
0
8 / 7 / 3
Регистрация: 24.11.2014
Сообщений: 111
12.12.2021, 14:01  [ТС]
Humanoid, странно, "-Wall" включено в опциях компиляции, но предупреждений нет(((
(-O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -MMD -MP -MF)

Сейчас посмотрел, у меня ранее в коде было правильно val = (int8_t)buf2[0]; просто потом игрался с размерностью массива и не поменял обратно.

И не понимаю, правильные ли значения считываются?
Должно быть:
Vendor_ID = 25h (=37)
Product_ID = 0Bh (=11)
Миниатюры
Чтение регистров на HAL по I2C   Чтение регистров на HAL по I2C  
0
Windows must die
673 / 854 / 103
Регистрация: 23.11.2021
Сообщений: 5,051
Записей в блоге: 17
12.12.2021, 14:20
PeterS, нужно еще добавить -Wextra -Werror, тогда не будет соблазна не обращать внимания на предупреждения: компилятор сразу же расценит это как ошибку и остановится.
Кстати, у clang намного приятней сообщения об ошибках, gcc потихоньку исправляется, конечно, но gcc-12 таки еще далеко до clang-12…

Что до I2C, могу показать, как у меня реализована работа с ним. Но я "калом" не пользуюсь.
0
8 / 7 / 3
Регистрация: 24.11.2014
Сообщений: 111
12.12.2021, 14:33  [ТС]
Eddy_Em, да, покажите, пожалуйста. У меня и Keil есть.
0
Windows must die
673 / 854 / 103
Регистрация: 23.11.2021
Сообщений: 5,051
Записей в блоге: 17
12.12.2021, 14:39
Ну вот, например, сканер I2C на STM32F103.
Прием двух байт и N байт.
Если все выполнять согласно мануалу, никаких проблем не будет. Ну и в errata надо заглядывать: вдруг конфликт периферии какой получится..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.12.2021, 14:39
Помогаю со студенческими работами здесь

STM32F4discovery Соединение 2-ух плат I2C. HAL.
Подключил 2 платы stm32 по I2C. Линии SDA и SCL подтянуты 10к к питанию +3В одной из плат. Земли объединены. Одна плата берёт питание от...

Как читать данные по I2C с помощью HAL?
STM32F7 Пытаюсь прочитать данные по адресу, в итоге контроллер просто зависает uint8_t y2s_Buffer; uint16_t addr = 0x8404; ...

I2C 16-битная адресация регистров
Всем привет! Имеется устройство с 16-битной адресацией регистров (кмоп-матрица mt9v124). Не могу понять как правильно записывать данные в...

Подключение LCD 1602 через I2C к STM32F4 без библиотеки Hal
Здравствуйте! Пытаюсь запустить дисплей LCD 1602(по I2C) при помощи STM32F411VET6U. На форуме целое множество примеров по поводу запуска...

Как, используя wiringPI, читать/писать 16-битные адреса регистров I2C?
Уже добрых два часа с MLX90640 бьюсь, все не могу понять: а чего это у меня регистры не пишутся? Копнул глубже: оказывается, wiringPi...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru