Перейти к содержанию
    

Как прочитать регистр по I2C на STM32

Здравствуйте!

 

Подскажите, пожалуйста, как прочитать регистр, содержащий значение температуры по 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);

Так всё правильно?

 

Спасибо.

 

temp.png

Изменено пользователем 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);

 

Изменено пользователем TEMPO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если выполнять блокирующие операции, то все предельно просто!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 часов назад, TEMPO сказал:

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

Сначала нужно прочитать мануал на чип, который пытаетесь читать через I2C. И узнать оттуда: каким образом читается произвольный регистр из него.

Читается он скорей всего двумя транзакциями: 1) write-транзакция записи адреса регистра; 2) read-транзакция чтения содержимого регистра.

Также в мануале должно быть указано: каким образом производится переключение с write-транзакции на read-транзакцию. Обычно это делается одним из 2-х способов: 1) СТОП-условие в конце write-транзакции с последующим СТАРТ-условием в начале read-транзакции; 2) REPEATED-START-условие между write-транзакцией и read-транзакцией. Некоторые чипы умеют и так и так переключаться; некоторые - только одним из этих способов. Обычно об этом сказано в мануале.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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);

 

 

Удалось в итоге решить проблемы?

Изменено пользователем Aveal

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увы, нет. Если у кого-нибудь есть время и желание помочь, напишите, пожалуйста, в ЛС. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

STM32F429 (отладка Discovery)

Другую мс (LM75 - датчик температуры) я успешно читал через I2C с помощью этой STM'ки.

Изменено пользователем TEMPO

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не могу понять правильно ли я читаю нужную мс и правильные ли данные от неё приходят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А микросхема секретная?

Для проверки правильности считанных данных, достаточно прочитать те регистры, содержимое которых известно заранее, они описаны в даташите. Ну и по адекватности значения в регистре 0x8D, думаю, температура корпуса термометра известна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...