TEMPO 0 31 мая, 2021 Опубликовано 31 мая, 2021 (изменено) · Жалоба Здравствуйте! Подскажите, пожалуйста, как прочитать регистр, содержащий значение температуры по I2C? В описании на мс есть вот такое. Т.е. регистр "температуры" = 8Dh. IC_ADDR = 0x20 << 1; HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(IC_ADDR), 2, 2); - HAL_OK REG_TEMP = 0x8D; buf[0] = REG_TEMP; HAL_I2C_Master_Receive(&hi2c1, IC_ADDR, buf, 1, HAL_MAX_DELAY); // принимаю 1 (один) байт - HAL_OK val = (int16_t)buf[0]; sprintf((char*)buf, "%u \r\n", (unsigned int)val); HAL_UART_Transmit(&huart1, buf, strlen((char*)buf), HAL_MAX_DELAY); Так всё правильно? Спасибо. Изменено 31 мая, 2021 пользователем TEMPO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rkit 1 31 мая, 2021 Опубликовано 31 мая, 2021 · Жалоба Отправляешь адрес регистрации, затем принимаешь один байт. 2 транзакции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TEMPO 0 31 мая, 2021 Опубликовано 31 мая, 2021 · Жалоба rkit, что такое адрес регистрации? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 31 мая, 2021 Опубликовано 31 мая, 2021 · Жалоба Регистра, скорее Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TEMPO 0 31 мая, 2021 Опубликовано 31 мая, 2021 (изменено) · Жалоба Пропустил HAL_I2C_Master_Transmit(&hi2c1, IC_ADDR, buf, 2, HAL_MAX_DELAY); Вот так? static const uint8_t IC_ADDR = 0x20 << 1; Adress of IC = 20h static const uint8_t REG_TEMP = 0x8D; // 8Dh READ_TEMPERATURE r 2-byte int16_t val; uint8_t buf[50]; HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(IC_ADDR), 2, 2); buf[0] = REG_TEMP; HAL_I2C_Master_Transmit(&hi2c1, IC_ADDR, buf, 2, HAL_MAX_DELAY); HAL_I2C_Master_Receive(&hi2c1, IC_ADDR, buf, 1, HAL_MAX_DELAY); val = (int16_t)buf[0]; sprintf((char*)buf, "%u \r\n", (unsigned int)val); HAL_UART_Transmit(&huart1, buf, strlen((char*)buf), HAL_MAX_DELAY); Изменено 31 мая, 2021 пользователем TEMPO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 31 мая, 2021 Опубликовано 31 мая, 2021 · Жалоба Если выполнять блокирующие операции, то все предельно просто! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 183 1 июня, 2021 Опубликовано 1 июня, 2021 · Жалоба 12 часов назад, TEMPO сказал: Подскажите, пожалуйста, как прочитать регистр, содержащий значение температуры по I2C? Сначала нужно прочитать мануал на чип, который пытаетесь читать через I2C. И узнать оттуда: каким образом читается произвольный регистр из него. Читается он скорей всего двумя транзакциями: 1) write-транзакция записи адреса регистра; 2) read-транзакция чтения содержимого регистра. Также в мануале должно быть указано: каким образом производится переключение с write-транзакции на read-транзакцию. Обычно это делается одним из 2-х способов: 1) СТОП-условие в конце write-транзакции с последующим СТАРТ-условием в начале read-транзакции; 2) REPEATED-START-условие между write-транзакцией и read-транзакцией. Некоторые чипы умеют и так и так переключаться; некоторые - только одним из этих способов. Обычно об этом сказано в мануале. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aveal 0 2 июня, 2021 Опубликовано 2 июня, 2021 (изменено) · Жалоба 31.05.2021 в 22:15, TEMPO сказал: Пропустил HAL_I2C_Master_Transmit(&hi2c1, IC_ADDR, buf, 2, HAL_MAX_DELAY); Вот так? static const uint8_t IC_ADDR = 0x20 << 1; Adress of IC = 20h static const uint8_t REG_TEMP = 0x8D; // 8Dh READ_TEMPERATURE r 2-byte int16_t val; uint8_t buf[50]; HAL_I2C_IsDeviceReady(&hi2c1, (uint16_t)(IC_ADDR), 2, 2); buf[0] = REG_TEMP; HAL_I2C_Master_Transmit(&hi2c1, IC_ADDR, buf, 2, HAL_MAX_DELAY); HAL_I2C_Master_Receive(&hi2c1, IC_ADDR, buf, 1, HAL_MAX_DELAY); val = (int16_t)buf[0]; sprintf((char*)buf, "%u \r\n", (unsigned int)val); HAL_UART_Transmit(&huart1, buf, strlen((char*)buf), HAL_MAX_DELAY); Удалось в итоге решить проблемы? Изменено 2 июня, 2021 пользователем Aveal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TEMPO 0 2 июня, 2021 Опубликовано 2 июня, 2021 · Жалоба Увы, нет. Если у кого-нибудь есть время и желание помочь, напишите, пожалуйста, в ЛС. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Behram 0 2 июня, 2021 Опубликовано 2 июня, 2021 · Жалоба Какой проц? У СТМок разные I2C Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TEMPO 0 2 июня, 2021 Опубликовано 2 июня, 2021 (изменено) · Жалоба STM32F429 (отладка Discovery) Другую мс (LM75 - датчик температуры) я успешно читал через I2C с помощью этой STM'ки. Изменено 2 июня, 2021 пользователем TEMPO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Behram 0 2 июня, 2021 Опубликовано 2 июня, 2021 · Жалоба Так а в чем проблема? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TEMPO 0 2 июня, 2021 Опубликовано 2 июня, 2021 · Жалоба Не могу понять правильно ли я читаю нужную мс и правильные ли данные от неё приходят. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Behram 0 2 июня, 2021 Опубликовано 2 июня, 2021 · Жалоба А микросхема секретная? Для проверки правильности считанных данных, достаточно прочитать те регистры, содержимое которых известно заранее, они описаны в даташите. Ну и по адекватности значения в регистре 0x8D, думаю, температура корпуса термометра известна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться